diff --git a/community_server/.gitignore b/community_server/.gitignore new file mode 100644 index 000000000..4a3ce5c25 --- /dev/null +++ b/community_server/.gitignore @@ -0,0 +1,11 @@ +config/app.php +logs/ +src/GPBMetadata/ +tmp/ +vendor/ +composer.lock +websrc/node_modules/ +websrc/package-lock.json +mithril_client/ +websrc/src/less-files.css + diff --git a/community_server/.gitmodules b/community_server/.gitmodules new file mode 100644 index 000000000..ed2d79ec1 --- /dev/null +++ b/community_server/.gitmodules @@ -0,0 +1,6 @@ +[submodule "mithril_client"] + path = mithril_client + url = git@github.com:gradido/gradido_mithrilJS_client.git +[submodule "src/protobuf"] + path = src/protobuf + url = git@github.com:gradido/gradido_protocol.git \ No newline at end of file diff --git a/community_server/Dockerfile b/community_server/Dockerfile new file mode 100644 index 000000000..2f3c0412a --- /dev/null +++ b/community_server/Dockerfile @@ -0,0 +1,13 @@ +FROM phpdockerio/php74-fpm + +# install php fpm +RUN apt-get update \ + && apt-get -y --no-install-recommends install curl unzip php7.4-curl php7.4-fpm php7.4-mbstring php7.4-intl php7.4-xml php7.4-pdo php7.4-mysql \ + && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* + +WORKDIR /var/www/cakephp +RUN mkdir logs && mkdir tmp && chmod 777 logs && chmod 777 tmp +COPY ./community_server/ . +COPY ./configs/community_server/app.php ./config/ +RUN composer update + diff --git a/community_server/README.md b/community_server/README.md new file mode 100644 index 000000000..61f89d306 --- /dev/null +++ b/community_server/README.md @@ -0,0 +1,51 @@ +# CakePHP Application Skeleton + +[![Build Status](https://img.shields.io/travis/cakephp/app/master.svg?style=flat-square)](https://travis-ci.org/cakephp/app) +[![Total Downloads](https://img.shields.io/packagist/dt/cakephp/app.svg?style=flat-square)](https://packagist.org/packages/cakephp/app) + +A skeleton for creating applications with [CakePHP](https://cakephp.org) 3.x. + +The framework source code can be found here: [cakephp/cakephp](https://github.com/cakephp/cakephp). + +## Installation + +1. Download [Composer](https://getcomposer.org/doc/00-intro.md) or update `composer self-update`. +2. Run `php composer.phar create-project --prefer-dist cakephp/app [app_name]`. + +If Composer is installed globally, run + +```bash +composer create-project --prefer-dist cakephp/app +``` + +In case you want to use a custom app dir name (e.g. `/myapp/`): + +```bash +composer create-project --prefer-dist cakephp/app myapp +``` + +You can now either use your machine's webserver to view the default home page, or start +up the built-in webserver with: + +```bash +bin/cake server -p 8765 +``` + +Then visit `http://localhost:8765` to see the welcome page. + +## Update + +Since this skeleton is a starting point for your application and various files +would have been modified as per your needs, there isn't a way to provide +automated upgrades, so you have to do any updates manually. + +## Configuration + +Read and edit `config/app.php` and setup the `'Datasources'` and any other +configuration relevant for your application. + +## Layout + +The app skeleton uses a subset of [Foundation](http://foundation.zurb.com/) (v5) CSS +framework by default. You can, however, replace it with any other library or +custom styles. diff --git a/community_server/bin/cake b/community_server/bin/cake new file mode 100755 index 000000000..4b696c883 --- /dev/null +++ b/community_server/bin/cake @@ -0,0 +1,75 @@ +#!/usr/bin/env sh +################################################################################ +# +# Cake is a shell script for invoking CakePHP shell commands +# +# CakePHP(tm) : Rapid Development Framework (https://cakephp.org) +# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) +# +# Licensed under The MIT License +# For full copyright and license information, please see the LICENSE.txt +# Redistributions of files must retain the above copyright notice. +# +# @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) +# @link https://cakephp.org CakePHP(tm) Project +# @since 1.2.0 +# @license https://opensource.org/licenses/mit-license.php MIT License +# +################################################################################ + +# Canonicalize by following every symlink of the given name recursively +canonicalize() { + NAME="$1" + if [ -f "$NAME" ] + then + DIR=$(dirname -- "$NAME") + NAME=$(cd -P "$DIR" > /dev/null && pwd -P)/$(basename -- "$NAME") + fi + while [ -h "$NAME" ]; do + DIR=$(dirname -- "$NAME") + SYM=$(readlink "$NAME") + NAME=$(cd "$DIR" > /dev/null && cd "$(dirname -- "$SYM")" > /dev/null && pwd)/$(basename -- "$SYM") + done + echo "$NAME" +} + +# Find a CLI version of PHP +findCliPhp() { + for TESTEXEC in php php-cli /usr/local/bin/php + do + SAPI=$(echo "" | $TESTEXEC 2>/dev/null) + if [ "$SAPI" = "cli" ] + then + echo $TESTEXEC + return + fi + done + echo "Failed to find a CLI version of PHP; falling back to system standard php executable" >&2 + echo "php"; +} + +# If current path is a symlink, resolve to real path +realname="$0" +if [ -L "$realname" ] +then + realname=$(readlink -f "$0") +fi + +CONSOLE=$(dirname -- "$(canonicalize "$realname")") +APP=$(dirname "$CONSOLE") + +# If your CLI PHP is somewhere that this doesn't find, you can define a PHP environment +# variable with the correct path in it. +if [ -z "$PHP" ] +then + PHP=$(findCliPhp) +fi + +if [ "$(basename "$realname")" != 'cake' ] +then + exec "$PHP" "$CONSOLE"/cake.php "$(basename "$realname")" "$@" +else + exec "$PHP" "$CONSOLE"/cake.php "$@" +fi + +exit diff --git a/community_server/bin/cake.bat b/community_server/bin/cake.bat new file mode 100644 index 000000000..ad1378229 --- /dev/null +++ b/community_server/bin/cake.bat @@ -0,0 +1,27 @@ +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: Cake is a Windows batch script for invoking CakePHP shell commands +:: +:: CakePHP(tm) : Rapid Development Framework (https://cakephp.org) +:: Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) +:: +:: Licensed under The MIT License +:: Redistributions of files must retain the above copyright notice. +:: +:: @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) +:: @link https://cakephp.org CakePHP(tm) Project +:: @since 2.0.0 +:: @license https://opensource.org/licenses/mit-license.php MIT License +:: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +@echo off + +SET app=%0 +SET lib=%~dp0 + +php "%lib%cake.php" %* + +echo. + +exit /B %ERRORLEVEL% diff --git a/community_server/bin/cake.php b/community_server/bin/cake.php new file mode 100644 index 000000000..320ee3643 --- /dev/null +++ b/community_server/bin/cake.php @@ -0,0 +1,12 @@ +#!/usr/bin/php -q +run($argv)); diff --git a/community_server/composer.json b/community_server/composer.json new file mode 100644 index 000000000..7eeb26887 --- /dev/null +++ b/community_server/composer.json @@ -0,0 +1,57 @@ +{ + "name": "cakephp/app", + "description": "CakePHP skeleton app", + "homepage": "https://cakephp.org", + "type": "project", + "license": "MIT", + "require": { + "php": ">=5.6", + "cakephp/cakephp": "3.8.*", + "cakephp/migrations": "^2.0.0", + "cakephp/plugin-installer": "^1.0", + "datto/json-rpc": "^6.0", + "google/protobuf": "v3.10.*", + "mobiledetect/mobiledetectlib": "2.*", + "paragonie/sodium_compat": "^1.11", + "tuupola/base58": "^2.0" + }, + "require-dev": { + "cakephp/bake": "^1.9.0", + "cakephp/cakephp-codesniffer": "^3.0", + "cakephp/debug_kit": "^3.17.0", + "josegonzalez/dotenv": "3.*", + "phpunit/phpunit": "^5.7|^6.0", + "psy/psysh": "@stable" + }, + "suggest": { + "markstory/asset_compress": "An asset compression plugin which provides file concatenation and a flexible filter system for preprocessing and minification.", + "dereuromark/cakephp-ide-helper": "After baking your code, this keeps your annotations in sync with the code evolving from there on for maximum IDE and PHPStan compatibility." + }, + "autoload": { + "psr-4": { + "App\\": "src/", + "" : "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Test\\": "tests/", + "Cake\\Test\\": "vendor/cakephp/cakephp/tests/" + } + }, + "scripts": { + "post-install-cmd": "App\\Console\\Installer::postInstall", + "post-create-project-cmd": "App\\Console\\Installer::postInstall", + "check": [ + "@test", + "@cs-check" + ], + "cs-check": "phpcs --colors -p --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/", + "cs-fix": "phpcbf --colors --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/", + "test": "phpunit --colors=always" + }, + "prefer-stable": true, + "config": { + "sort-packages": true + } +} diff --git a/community_server/config/app.default.php b/community_server/config/app.default.php new file mode 100644 index 000000000..04c8cede2 --- /dev/null +++ b/community_server/config/app.default.php @@ -0,0 +1,407 @@ + filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN), + + /** + * Configure basic information about the application. + * + * - namespace - The namespace to find app classes under. + * - defaultLocale - The default locale for translation, formatting currencies and numbers, date and time. + * - encoding - The encoding used for HTML + database connections. + * - base - The base directory the app resides in. If false this + * will be auto detected. + * - dir - Name of app directory. + * - webroot - The webroot directory. + * - wwwRoot - The file path to webroot. + * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to + * use CakePHP pretty URLs, remove these .htaccess + * files: + * /.htaccess + * /webroot/.htaccess + * And uncomment the baseUrl key below. + * - fullBaseUrl - A base URL to use for absolute links. When set to false (default) + * CakePHP generates required value based on `HTTP_HOST` environment variable. + * However, you can define it manually to optimize performance or if you + * are concerned about people manipulating the `Host` header. + * - imageBaseUrl - Web path to the public images directory under webroot. + * - cssBaseUrl - Web path to the public css directory under webroot. + * - jsBaseUrl - Web path to the public js directory under webroot. + * - paths - Configure paths for non class based resources. Supports the + * `plugins`, `templates`, `locales` subkeys, which allow the definition of + * paths for plugins, view templates and locale files respectively. + */ + 'App' => [ + 'namespace' => 'App', + 'encoding' => env('APP_ENCODING', 'UTF-8'), + 'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'), + 'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'), + 'base' => false, + 'dir' => 'src', + 'webroot' => 'webroot', + 'wwwRoot' => WWW_ROOT, + //'baseUrl' => env('SCRIPT_NAME'), + 'fullBaseUrl' => false, + 'imageBaseUrl' => 'img/', + 'cssBaseUrl' => 'css/', + 'jsBaseUrl' => 'js/', + 'paths' => [ + 'plugins' => [ROOT . DS . 'plugins' . DS], + 'templates' => [APP . 'Template' . DS], + 'locales' => [APP . 'Locale' . DS], + ], + ], + + /** + * Security and encryption configuration + * + * - salt - A random string used in security hashing methods. + * The salt value is also used as the encryption key. + * You should treat it as extremely sensitive data. + */ + 'Security' => [ + 'salt' => env('SECURITY_SALT', '__SALT__'), + ], + + /** + * Apply timestamps with the last modified time to static assets (js, css, images). + * Will append a querystring parameter containing the time the file was modified. + * This is useful for busting browser caches. + * + * Set to true to apply timestamps when debug is true. Set to 'force' to always + * enable timestamping regardless of debug value. + */ + 'Asset' => [ + //'timestamp' => true, + // 'cacheTime' => '+1 year' + ], + + /** + * Configure the cache adapters. + */ + 'Cache' => [ + 'default' => [ + 'className' => FileEngine::class, + 'path' => CACHE, + 'url' => env('CACHE_DEFAULT_URL', null), + ], + + /** + * Configure the cache used for general framework caching. + * Translation cache files are stored with this configuration. + * Duration will be set to '+2 minutes' in bootstrap.php when debug = true + * If you set 'className' => 'Null' core cache will be disabled. + */ + '_cake_core_' => [ + 'className' => FileEngine::class, + 'prefix' => 'myapp_cake_core_', + 'path' => CACHE . 'persistent/', + 'serialize' => true, + 'duration' => '+1 years', + 'url' => env('CACHE_CAKECORE_URL', null), + ], + + /** + * Configure the cache for model and datasource caches. This cache + * configuration is used to store schema descriptions, and table listings + * in connections. + * Duration will be set to '+2 minutes' in bootstrap.php when debug = true + */ + '_cake_model_' => [ + 'className' => FileEngine::class, + 'prefix' => 'myapp_cake_model_', + 'path' => CACHE . 'models/', + 'serialize' => true, + 'duration' => '+1 years', + 'url' => env('CACHE_CAKEMODEL_URL', null), + ], + + /** + * Configure the cache for routes. The cached routes collection is built the + * first time the routes are processed via `config/routes.php`. + * Duration will be set to '+2 seconds' in bootstrap.php when debug = true + */ + '_cake_routes_' => [ + 'className' => FileEngine::class, + 'prefix' => 'myapp_cake_routes_', + 'path' => CACHE, + 'serialize' => true, + 'duration' => '+1 years', + 'url' => env('CACHE_CAKEROUTES_URL', null), + ], + ], + + /** + * Configure the Error and Exception handlers used by your application. + * + * By default errors are displayed using Debugger, when debug is true and logged + * by Cake\Log\Log when debug is false. + * + * In CLI environments exceptions will be printed to stderr with a backtrace. + * In web environments an HTML page will be displayed for the exception. + * With debug true, framework errors like Missing Controller will be displayed. + * When debug is false, framework errors will be coerced into generic HTTP errors. + * + * Options: + * + * - `errorLevel` - int - The level of errors you are interested in capturing. + * - `trace` - boolean - Whether or not backtraces should be included in + * logged errors/exceptions. + * - `log` - boolean - Whether or not you want exceptions logged. + * - `exceptionRenderer` - string - The class responsible for rendering + * uncaught exceptions. If you choose a custom class you should place + * the file for that class in src/Error. This class needs to implement a + * render method. + * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that + * extend one of the listed exceptions will also be skipped for logging. + * E.g.: + * `'skipLog' => ['Cake\Http\Exception\NotFoundException', 'Cake\Http\Exception\UnauthorizedException']` + * - `extraFatalErrorMemory` - int - The number of megabytes to increase + * the memory limit by when a fatal error is encountered. This allows + * breathing room to complete logging or error handling. + */ + 'Error' => [ + 'errorLevel' => E_ALL, + 'exceptionRenderer' => ExceptionRenderer::class, + 'skipLog' => [], + 'log' => true, + 'trace' => true, + ], + + /** + * Email configuration. + * + * By defining transports separately from delivery profiles you can easily + * re-use transport configuration across multiple profiles. + * + * You can specify multiple configurations for production, development and + * testing. + * + * Each transport needs a `className`. Valid options are as follows: + * + * Mail - Send using PHP mail function + * Smtp - Send using SMTP + * Debug - Do not send the email, just return the result + * + * You can add custom transports (or override existing transports) by adding the + * appropriate file to src/Mailer/Transport. Transports should be named + * 'YourTransport.php', where 'Your' is the name of the transport. + */ + 'EmailTransport' => [ + 'default' => [ + 'className' => MailTransport::class, + /* + * The following keys are used in SMTP transports: + */ + 'host' => 'localhost', + 'port' => 25, + 'timeout' => 30, + 'username' => null, + 'password' => null, + 'client' => null, + 'tls' => null, + 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null), + ], + ], + + /** + * Email delivery profiles + * + * Delivery profiles allow you to predefine various properties about email + * messages from your application and give the settings a name. This saves + * duplication across your application and makes maintenance and development + * easier. Each profile accepts a number of keys. See `Cake\Mailer\Email` + * for more information. + */ + 'Email' => [ + 'default' => [ + 'transport' => 'default', + 'from' => 'you@localhost', + //'charset' => 'utf-8', + //'headerCharset' => 'utf-8', + ], + ], + + /** + * Connection information used by the ORM to connect + * to your application's datastores. + * + * ### Notes + * - Drivers include Mysql Postgres Sqlite Sqlserver + * See vendor\cakephp\cakephp\src\Database\Driver for complete list + * - Do not use periods in database name - it may lead to error. + * See https://github.com/cakephp/cakephp/issues/6471 for details. + * - 'encoding' is recommended to be set to full UTF-8 4-Byte support. + * E.g set it to 'utf8mb4' in MariaDB and MySQL and 'utf8' for any + * other RDBMS. + */ + 'Datasources' => [ + 'default' => [ + 'className' => Connection::class, + 'driver' => Mysql::class, + 'persistent' => false, + 'host' => 'localhost', + /* + * CakePHP will use the default DB port based on the driver selected + * MySQL on MAMP uses port 8889, MAMP users will want to uncomment + * the following line and set the port accordingly + */ + //'port' => 'non_standard_port_number', + 'username' => 'my_app', + 'password' => 'secret', + 'database' => 'my_app', + /* + * You do not need to set this flag to use full utf-8 encoding (internal default since CakePHP 3.6). + */ + //'encoding' => 'utf8mb4', + 'timezone' => 'UTC', + 'flags' => [], + 'cacheMetadata' => true, + 'log' => false, + + /** + * Set identifier quoting to true if you are using reserved words or + * special characters in your table or column names. Enabling this + * setting will result in queries built using the Query Builder having + * identifiers quoted when creating SQL. It should be noted that this + * decreases performance because each query needs to be traversed and + * manipulated before being executed. + */ + 'quoteIdentifiers' => false, + + /** + * During development, if using MySQL < 5.6, uncommenting the + * following line could boost the speed at which schema metadata is + * fetched from the database. It can also be set directly with the + * mysql configuration directive 'innodb_stats_on_metadata = 0' + * which is the recommended value in production environments + */ + //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], + + 'url' => env('DATABASE_URL', null), + ], + + /** + * The test connection is used during the test suite. + */ + 'test' => [ + 'className' => Connection::class, + 'driver' => Mysql::class, + 'persistent' => false, + 'host' => 'localhost', + //'port' => 'non_standard_port_number', + 'username' => 'my_app', + 'password' => 'secret', + 'database' => 'test_myapp', + //'encoding' => 'utf8mb4', + 'timezone' => 'UTC', + 'cacheMetadata' => true, + 'quoteIdentifiers' => false, + 'log' => false, + //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], + 'url' => env('DATABASE_TEST_URL', null), + ], + ], + + /** + * Configures logging options + */ + 'Log' => [ + 'debug' => [ + 'className' => FileLog::class, + 'path' => LOGS, + 'file' => 'debug', + 'url' => env('LOG_DEBUG_URL', null), + 'scopes' => false, + 'levels' => ['notice', 'info', 'debug'], + ], + 'error' => [ + 'className' => FileLog::class, + 'path' => LOGS, + 'file' => 'error', + 'url' => env('LOG_ERROR_URL', null), + 'scopes' => false, + 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'], + ], + // To enable this dedicated query log, you need set your datasource's log flag to true + 'queries' => [ + 'className' => FileLog::class, + 'path' => LOGS, + 'file' => 'queries', + 'url' => env('LOG_QUERIES_URL', null), + 'scopes' => ['queriesLog'], + ], + ], + + /** + * Session configuration. + * + * Contains an array of settings to use for session configuration. The + * `defaults` key is used to define a default preset to use for sessions, any + * settings declared here will override the settings of the default config. + * + * ## Options + * + * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'. Avoid using `.` in cookie names, + * as PHP will drop sessions from cookies with `.` in the name. + * - `cookiePath` - The url path for which session cookie is set. Maps to the + * `session.cookie_path` php.ini config. Defaults to base path of app. + * - `timeout` - The time in minutes the session should be valid for. + * Pass 0 to disable checking timeout. + * Please note that php.ini's session.gc_maxlifetime must be equal to or greater + * than the largest Session['timeout'] in all served websites for it to have the + * desired effect. + * - `defaults` - The default configuration set to use as a basis for your session. + * There are four built-in options: php, cake, cache, database. + * - `handler` - Can be used to enable a custom session handler. Expects an + * array with at least the `engine` key, being the name of the Session engine + * class to use for managing the session. CakePHP bundles the `CacheSession` + * and `DatabaseSession` engines. + * - `ini` - An associative array of additional ini values to set. + * + * The built-in `defaults` options are: + * + * - 'php' - Uses settings defined in your php.ini. + * - 'cake' - Saves session files in CakePHP's /tmp directory. + * - 'database' - Uses CakePHP's database sessions. + * - 'cache' - Use the Cache class to save sessions. + * + * To define a custom session handler, save it at src/Network/Session/.php. + * Make sure the class implements PHP's `SessionHandlerInterface` and set + * Session.handler to + * + * To use database sessions, load the SQL file located at config/schema/sessions.sql + */ + 'Session' => [ + 'defaults' => 'php', + ], + // Gradido specific configuration + // Login Server ip and port + 'LoginServer' => [ + 'host' => 'http://127.0.0.1', + 'port' => 1201 + ], + 'API' => [ + 'allowedCaller' => [''] // insert domains or ips from login-server and gdt if they not at localhost + ], + 'ServerAdminEmail' => 'info@gradido.net', // email 'from' field for transfer notification emails + 'noReplyEmail' => 'no-replay@gradido.net', // email sender for creation notification emails to user + + 'GroupNode' => false +]; diff --git a/community_server/config/bootstrap.php b/community_server/config/bootstrap.php new file mode 100644 index 000000000..c57f81374 --- /dev/null +++ b/community_server/config/bootstrap.php @@ -0,0 +1,205 @@ +parse() +// ->putenv() +// ->toEnv() +// ->toServer(); +// } + +/* + * Read configuration file and inject configuration into various + * CakePHP classes. + * + * By default there is only one configuration file. It is often a good + * idea to create multiple configuration files, and separate the configuration + * that changes from configuration that does not. This makes deployment simpler. + */ +try { + Configure::config('default', new PhpConfig()); + Configure::load('app', 'default', false); +} catch (\Exception $e) { + exit($e->getMessage() . "\n"); +} + +/* + * Load an environment local configuration file. + * You can use a file like app_local.php to provide local overrides to your + * shared configuration. + */ +//Configure::load('app_local', 'default'); + +/* + * When debug = true the metadata cache should only last + * for a short time. + */ +if (Configure::read('debug')) { + Configure::write('Cache._cake_model_.duration', '+2 minutes'); + Configure::write('Cache._cake_core_.duration', '+2 minutes'); + // disable router cache during development + Configure::write('Cache._cake_routes_.duration', '+2 seconds'); +} + +/* + * Set the default server timezone. Using UTC makes time calculations / conversions easier. + * Check http://php.net/manual/en/timezones.php for list of valid timezone strings. + */ +date_default_timezone_set(Configure::read('App.defaultTimezone')); + +/* + * Configure the mbstring extension to use the correct encoding. + */ +mb_internal_encoding(Configure::read('App.encoding')); + +/* + * Set the default locale. This controls how dates, number and currency is + * formatted and sets the default language to use for translations. + */ +ini_set('intl.default_locale', Configure::read('App.defaultLocale')); + +/* + * Register application error and exception handlers. + */ + +$isCli = PHP_SAPI === 'cli'; + +if ($isCli) { + (new ConsoleErrorHandler(Configure::read('Error')))->register(); +} else { + (new ErrorHandler(Configure::read('Error')))->register(); +} + +/* + * Include the CLI bootstrap overrides. + */ +if ($isCli) { + require __DIR__ . '/bootstrap_cli.php'; +} + +/* + * Set the full base URL. + * This URL is used as the base of all absolute links. + * + * If you define fullBaseUrl in your config file you can remove this. + */ +if (!Configure::read('App.fullBaseUrl')) { + $s = null; + if (env('HTTPS')) { + $s = 's'; + } + + $httpHost = env('HTTP_HOST'); + if (isset($httpHost)) { + Configure::write('App.fullBaseUrl', 'http' . $s . '://' . $httpHost); + } + unset($httpHost, $s); +} + +Cache::setConfig(Configure::consume('Cache')); +ConnectionManager::setConfig(Configure::consume('Datasources')); +TransportFactory::setConfig(Configure::consume('EmailTransport')); +Email::setConfig(Configure::consume('Email')); +Log::setConfig(Configure::consume('Log')); +Security::setSalt(Configure::consume('Security.salt')); + +/* + * The default crypto extension in 3.0 is OpenSSL. + * If you are migrating from 2.x uncomment this code to + * use a more compatible Mcrypt based implementation + */ +//Security::engine(new \Cake\Utility\Crypto\Mcrypt()); + +/* + * Setup detectors for mobile and tablet. + */ +ServerRequest::addDetector('mobile', function ($request) { + $detector = new \Detection\MobileDetect(); + + return $detector->isMobile(); +}); +ServerRequest::addDetector('tablet', function ($request) { + $detector = new \Detection\MobileDetect(); + + return $detector->isTablet(); +}); + +/* + * Enable immutable time objects in the ORM. + * + * You can enable default locale format parsing by adding calls + * to `useLocaleParser()`. This enables the automatic conversion of + * locale specific date formats. For details see + * @link https://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html#parsing-localized-datetime-data + */ +Type::build('time') + ->useImmutable(); +Type::build('date') + ->useImmutable(); +Type::build('datetime') + ->useImmutable(); +Type::build('timestamp') + ->useImmutable(); + +/* + * Custom Inflector rules, can be set to correctly pluralize or singularize + * table, model, controller names or whatever other string is passed to the + * inflection functions. + */ +//Inflector::rules('plural', ['/^(inflect)or$/i' => '\1ables']); +//Inflector::rules('irregular', ['red' => 'redlings']); +//Inflector::rules('uninflected', ['dontinflectme']); +//Inflector::rules('transliteration', ['/å/' => 'aa']); diff --git a/community_server/config/bootstrap_cli.php b/community_server/config/bootstrap_cli.php new file mode 100644 index 000000000..d3679d754 --- /dev/null +++ b/community_server/config/bootstrap_cli.php @@ -0,0 +1,28 @@ + '{{content}}', + // Container element used by control() when a field has an error. + 'inputContainerError' => '
{{content}}{{error}}
', + // Label element when inputs are not nested inside the label. + 'label' => '{{text}}', + // Generic input element. + 'input' => '', + // Textarea input element, + 'textarea' => '', + // Error message wrapper elements. + 'error' => '
' + . '{{content}}' + . '
', + // Container for error items. + 'errorList' => '{{content}}', + // Error item wrapper. + 'errorItem' => '
{{text}}
' +]; +/* + +
+
+ +
+
+ +
+
+ + +
+ + +
+ + */ diff --git a/community_server/config/nginx/fastcgi.conf b/community_server/config/nginx/fastcgi.conf new file mode 100644 index 000000000..c2976fe91 --- /dev/null +++ b/community_server/config/nginx/fastcgi.conf @@ -0,0 +1,25 @@ +fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; +fastcgi_param QUERY_STRING $query_string; +fastcgi_param REQUEST_METHOD $request_method; +fastcgi_param CONTENT_TYPE $content_type; +fastcgi_param CONTENT_LENGTH $content_length; + +fastcgi_param SCRIPT_NAME $fastcgi_script_name; +fastcgi_param REQUEST_URI $request_uri; +fastcgi_param DOCUMENT_URI $document_uri; +fastcgi_param DOCUMENT_ROOT $document_root; +fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param REQUEST_SCHEME $scheme; +fastcgi_param HTTPS $https if_not_empty; + +fastcgi_param GATEWAY_INTERFACE CGI/1.1; +fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + +fastcgi_param REMOTE_ADDR $remote_addr; +fastcgi_param REMOTE_PORT $remote_port; +fastcgi_param SERVER_ADDR $server_addr; +fastcgi_param SERVER_PORT $server_port; +fastcgi_param SERVER_NAME $server_name; + +# PHP only, required if PHP was built with --enable-force-cgi-redirect +fastcgi_param REDIRECT_STATUS 200; \ No newline at end of file diff --git a/community_server/config/nginx/mime.types b/community_server/config/nginx/mime.types new file mode 100644 index 000000000..84c644fc7 --- /dev/null +++ b/community_server/config/nginx/mime.types @@ -0,0 +1,88 @@ +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/javascript js; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/png png; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + image/svg+xml svg svgz; + image/webp webp; + + application/font-woff woff; + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.wap.wmlc wmlc; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; + application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/community_server/config/nginx/nginx.conf b/community_server/config/nginx/nginx.conf new file mode 100644 index 000000000..5aa5c3095 --- /dev/null +++ b/community_server/config/nginx/nginx.conf @@ -0,0 +1,86 @@ + +server { + + listen 80 ; + listen [::]:80; + server_name 0.0.0.0; + + #include /etc/nginx/common/protect.conf; + #include /etc/nginx/common/protect_add_header.conf; + #include /etc/nginx/common/ssl.conf; + + + root /usr/share/nginx/html/webroot; + index index.php; + + location ~* \.(png|jpg|ico|webp)\$ { + expires 30d; + } + + location ~* \.(js|css) { + # expires 1d; + expires 1d; + } + + location ~ \.php\$ { + # regex to split $uri to $fastcgi_script_name and $fastcgi_path + fastcgi_split_path_info ^(.+\.php)(/.+)$; + + # Check that the PHP script exists before passing it + try_files $fastcgi_script_name =404; + + # Bypass the fact that try_files resets $fastcgi_path_info + # see: http://trac.nginx.org/nginx/ticket/321 + set $path_info $fastcgi_path_info; + fastcgi_param PATH_INFO $path_info; + + fastcgi_index index.php; + include fastcgi.conf; + + #fastcgi_pass unix:/run/php/php7.3-fpm.sock; + fastcgi_pass 127.0.0.1:9000; + + } + + location ~ /\.ht { + deny all; + } + + location /account { + proxy_http_version 1.1; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_cache_bypass \$http_upgrade; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$remote_addr; + proxy_set_header Host \$host; + rewrite /account/(.*) /\$1 break; + + #proxy_next_upstream error timeout invalid_header http_502 non_idempotent; + proxy_pass http://login-server:1200; + proxy_redirect off; + + + } + + location /login_api { + proxy_http_version 1.1; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_cache_bypass \$http_upgrade; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$remote_addr; + proxy_set_header Host \$host; + rewrite /login_api/(.*) /\$1 break; + + proxy_pass http://login-server:1201; + proxy_redirect off; + } + + location / { + try_files \$uri \$uri/ /index.php?\$args; + } + +# access_log /var/log/nginx/access.log main; + +} \ No newline at end of file diff --git a/community_server/config/paths.php b/community_server/config/paths.php new file mode 100644 index 000000000..1c8121588 --- /dev/null +++ b/community_server/config/paths.php @@ -0,0 +1,89 @@ + '{{content}}', + 'input' => '
' + . '' + . '
', + 'error' => '
' + . '{{content}}' + . '
', + + // Container for error items. + //'errorList' => '
    {{content}}
', + 'errorList' => '{{content}}', + + // Error item wrapper. + //'errorItem' => '
  • {{text}}
  • ', + 'errorItem' => '
    {{text}}
    ' +]; diff --git a/community_server/config/routes.php b/community_server/config/routes.php new file mode 100644 index 000000000..27d998f2c --- /dev/null +++ b/community_server/config/routes.php @@ -0,0 +1,138 @@ + true + ]); + + // Token check will be skipped when callback returns `true`. + $csrf->whitelistCallback(function ($request) { + // Skip token check for API URLs. + //die($request->getParam('controller')); + $whitelist = ['JsonRequestHandler', 'ElopageWebhook']; + + foreach($whitelist as $entry) { + if($request->getParam('controller') === $entry) { + if($entry == 'ElopageWebhook') { + return true; + } + if($request->clientIp() == '127.0.0.1' || $request->clientIp() == 'localhost') { + return true; + } + $allowedCaller = Configure::read('API.allowedCaller'); + if($allowedCaller && count($allowedCaller) > 0) { + $callerIp = $request->clientIp(); + foreach($allowedCaller as $allowed) { + $ip = gethostbyname($allowed); + if($ip === $callerIp) return true; + } + } + } + } + }); + + // Register scoped middleware for in scopes. + $routes->registerMiddleware('csrf', $csrf); + + /** + * Apply a middleware to the current route scope. + * Requires middleware to be registered via `Application::routes()` with `registerMiddleware()` + */ + $routes->applyMiddleware('csrf'); + + /** + * Here, we are connecting '/' (base path) to a controller called 'Pages', + * its action called 'display', and we pass a param to select the view file + * to use (in this case, src/Template/Pages/home.ctp)... + */ + //$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']); + $routes->connect('/', ['controller' => 'Dashboard', 'action' => 'index']); + $routes->connect('/server', ['controller' => 'Dashboard', 'action' => 'serverIndex']); + //$routes->connect('/', 'https://gradido2.dario-rekowski.de/account', array('status' => 303)); + + /** + * ...and connect the rest of 'Pages' controller's URLs. + */ + $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']); + + /** + * Connect catchall routes for all controllers. + * + * Using the argument `DashedRoute`, the `fallbacks` method is a shortcut for + * + * ``` + * $routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'DashedRoute']); + * $routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']); + * ``` + * + * Any route class can be used with this method, such as: + * - DashedRoute + * - InflectedRoute + * - Route + * - Or your own route class + * + * You can remove these routes once you've connected the + * routes you want in your application. + */ + $routes->fallbacks(DashedRoute::class); +}); + +/** + * If you need a different set of middleware or none at all, + * open new scope and define routes there. + * + * ``` + * Router::scope('/api', function (RouteBuilder $routes) { + * // No $routes->applyMiddleware() here. + * // Connect API actions here. + * }); + * ``` + */ diff --git a/community_server/config/schema/i18n.sql b/community_server/config/schema/i18n.sql new file mode 100644 index 000000000..e59d1e651 --- /dev/null +++ b/community_server/config/schema/i18n.sql @@ -0,0 +1,18 @@ +# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) +# +# Licensed under The MIT License +# For full copyright and license information, please see the LICENSE.txt +# Redistributions of files must retain the above copyright notice. +# MIT License (https://opensource.org/licenses/mit-license.php) + +CREATE TABLE i18n ( + id int NOT NULL auto_increment, + locale varchar(6) NOT NULL, + model varchar(255) NOT NULL, + foreign_key int(10) NOT NULL, + field varchar(255) NOT NULL, + content text, + PRIMARY KEY (id), + UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field), + INDEX I18N_FIELD(model, foreign_key, field) +); diff --git a/community_server/config/schema/sessions.sql b/community_server/config/schema/sessions.sql new file mode 100644 index 000000000..1aa0a0f54 --- /dev/null +++ b/community_server/config/schema/sessions.sql @@ -0,0 +1,15 @@ +# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) +# +# Licensed under The MIT License +# For full copyright and license information, please see the LICENSE.txt +# Redistributions of files must retain the above copyright notice. +# MIT License (https://opensource.org/licenses/mit-license.php) + +CREATE TABLE `sessions` ( + `id` char(40) CHARACTER SET ascii COLLATE ascii_bin NOT NULL, + `created` datetime DEFAULT CURRENT_TIMESTAMP, -- optional, requires MySQL 5.6.5+ + `modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- optional, requires MySQL 5.6.5+ + `data` blob DEFAULT NULL, -- for PostgreSQL use bytea instead of blob + `expires` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/community_server/db/address_types.sql b/community_server/db/address_types.sql new file mode 100644 index 000000000..27f6bb410 --- /dev/null +++ b/community_server/db/address_types.sql @@ -0,0 +1,6 @@ +CREATE TABLE `address_types` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(25) NOT NULL, + `text` VARCHAR(255) NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; \ No newline at end of file diff --git a/community_server/db/operators.sql b/community_server/db/operators.sql new file mode 100644 index 000000000..8ffa9f04f --- /dev/null +++ b/community_server/db/operators.sql @@ -0,0 +1,7 @@ +CREATE TABLE `operators` ( + `id` INT NOT NULL AUTO_INCREMENT , + `username` VARCHAR(128) NOT NULL , + `data_base64` VARCHAR(255) NOT NULL , + PRIMARY KEY (`id`), UNIQUE (`username`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + diff --git a/community_server/db/state_balances.sql b/community_server/db/state_balances.sql new file mode 100644 index 000000000..0bc263093 --- /dev/null +++ b/community_server/db/state_balances.sql @@ -0,0 +1,7 @@ +CREATE TABLE `state_balances` ( + `id` int(11) NOT NULL, + `state_user_id` int(11) NOT NULL, + `modified` datetime NOT NULL, + `amount` bigint(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; \ No newline at end of file diff --git a/community_server/db/state_created.sql b/community_server/db/state_created.sql new file mode 100644 index 000000000..a15ccacd3 --- /dev/null +++ b/community_server/db/state_created.sql @@ -0,0 +1,10 @@ +CREATE TABLE `state_created` ( + `id` int(11) NOT NULL, + `transaction_id` int(11) NOT NULL, + `month` tinyint(4) NOT NULL, + `year` smallint(6) NOT NULL, + `state_user_id` int(11) NOT NULL, + `created` datetime NOT NULL, + `short_ident_hash` int(11) NOT NULL, + PRIMARY KEY (`id`), INDEX(`short_ident_hash`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/db/state_group_addresses.sql b/community_server/db/state_group_addresses.sql new file mode 100644 index 000000000..3e09b8658 --- /dev/null +++ b/community_server/db/state_group_addresses.sql @@ -0,0 +1,7 @@ +CREATE TABLE `state_group_addresses` ( + `id` int(11) NOT NULL, + `state_group_id` int(11) NOT NULL, + `public_key` binary(32) NOT NULL, + `address_type_id` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/db/state_group_relationships.sql b/community_server/db/state_group_relationships.sql new file mode 100644 index 000000000..0d26e91b6 --- /dev/null +++ b/community_server/db/state_group_relationships.sql @@ -0,0 +1,7 @@ +CREATE TABLE `state_group_relationships` ( + `id` int(11) NOT NULL, + `state_group1_id` int(11) NOT NULL, + `state_group2_id` int(11) NOT NULL, + `state_relationship_id` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/db/state_groups.sql b/community_server/db/state_groups.sql new file mode 100644 index 000000000..dc5ca5251 --- /dev/null +++ b/community_server/db/state_groups.sql @@ -0,0 +1,8 @@ +CREATE TABLE `state_groups` ( + `id` INT NOT NULL AUTO_INCREMENT, + `index_id` VARBINARY(64) NOT NULL, + `name` VARCHAR(50) NOT NULL, + `root_public_key` BINARY(32) NOT NULL, + `user_count` SMALLINT NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; \ No newline at end of file diff --git a/community_server/db/state_relationship_types.sql b/community_server/db/state_relationship_types.sql new file mode 100644 index 000000000..d6e53a966 --- /dev/null +++ b/community_server/db/state_relationship_types.sql @@ -0,0 +1,6 @@ +CREATE TABLE `state_relationship_types` ( + `id` int(11) NOT NULL, + `name` varchar(25) COLLATE utf8_bin NOT NULL, + `text` varchar(255) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/db/state_users.sql b/community_server/db/state_users.sql new file mode 100644 index 000000000..82d61f10e --- /dev/null +++ b/community_server/db/state_users.sql @@ -0,0 +1,7 @@ +CREATE TABLE `state_users` ( + `id` int(11) NOT NULL, + `index_id` smallint(6) NOT NULL, + `state_group_id` int(11) NOT NULL, + `public_key` binary(32) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/db/transaction_creations.sql b/community_server/db/transaction_creations.sql new file mode 100644 index 000000000..343404ddb --- /dev/null +++ b/community_server/db/transaction_creations.sql @@ -0,0 +1,10 @@ + +CREATE TABLE `transaction_creations` ( + `id` int(11) NOT NULL, + `transaction_id` int(11) NOT NULL, + `state_user_id` int(11) NOT NULL, + `amount` bigint(20) NOT NULL, + `ident_hash` binary(32) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + diff --git a/community_server/db/transaction_group_addAddress.sql b/community_server/db/transaction_group_addAddress.sql new file mode 100644 index 000000000..f7474cc73 --- /dev/null +++ b/community_server/db/transaction_group_addAddress.sql @@ -0,0 +1,8 @@ + +CREATE TABLE `transaction_group_addaddress` ( + `id` int(11) NOT NULL, + `transaction_id` int(11) NOT NULL, + `address_type_id` int(11) NOT NULL, + `public_key` binary(32) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/db/transaction_group_allowtrades.sql b/community_server/db/transaction_group_allowtrades.sql new file mode 100644 index 000000000..2fd94b4d6 --- /dev/null +++ b/community_server/db/transaction_group_allowtrades.sql @@ -0,0 +1,8 @@ + +CREATE TABLE `transaction_group_allowtrades` ( + `id` int(11) NOT NULL, + `transaction_id` int(11) NOT NULL, + `group_id` int(11) NOT NULL, + `allow` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/db/transaction_group_creates.sql b/community_server/db/transaction_group_creates.sql new file mode 100644 index 000000000..0c0d7cc5d --- /dev/null +++ b/community_server/db/transaction_group_creates.sql @@ -0,0 +1,9 @@ + +CREATE TABLE `transaction_group_creates` ( + `id` int(11) NOT NULL, + `transaction_id` int(11) NOT NULL, + `group_public_key` binary(32) NOT NULL, + `state_group_id` int(11) COLLATE utf8_bin NOT NULL, + `name` varchar(64) COLLATE utf8_bin NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/db/transaction_send_coins.sql b/community_server/db/transaction_send_coins.sql new file mode 100644 index 000000000..8113c78e0 --- /dev/null +++ b/community_server/db/transaction_send_coins.sql @@ -0,0 +1,11 @@ + +CREATE TABLE `transaction_send_coins` ( + `id` int(11) NOT NULL, + `transaction_id` int(11) NOT NULL, + `state_user_id` int(11) NOT NULL, + `receiver_public_key` binary(32) NOT NULL, + `receiver_user_id` varbinary(64) NOT NULL, + `amount` bigint(20) NOT NULL, + `sender_final_balance` bigint(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/db/transaction_signatures.sql b/community_server/db/transaction_signatures.sql new file mode 100644 index 000000000..9fab87fb2 --- /dev/null +++ b/community_server/db/transaction_signatures.sql @@ -0,0 +1,7 @@ +CREATE TABLE `transaction_signatures` ( + `id` int(11) NOT NULL, + `transaction_id` int(11) NOT NULL, + `signature` binary(64) NOT NULL, + `pubkey` binary(32) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/db/transaction_types.sql b/community_server/db/transaction_types.sql new file mode 100644 index 000000000..26bd70c52 --- /dev/null +++ b/community_server/db/transaction_types.sql @@ -0,0 +1,6 @@ +CREATE TABLE `transaction_types` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(24) NOT NULL, + `text` VARCHAR(255) NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; \ No newline at end of file diff --git a/community_server/db/transactions.sql b/community_server/db/transactions.sql new file mode 100644 index 000000000..e664b067f --- /dev/null +++ b/community_server/db/transactions.sql @@ -0,0 +1,9 @@ + +CREATE TABLE `transactions` ( + `id` bigint(20) NOT NULL, + `state_group_id` int(11) NOT NULL, + `transaction_type_id` int(11) NOT NULL, + `tx_hash` binary(32) NOT NULL, + `received` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/community_server/index.php b/community_server/index.php new file mode 100644 index 000000000..459176916 --- /dev/null +++ b/community_server/index.php @@ -0,0 +1,16 @@ +=2.1.2 <3.0.0', +175 silly cache add type: 'range' } +176 silly addNamed clone@>=2.1.2 <3.0.0 +177 verbose addNamed ">=2.1.2 <3.0.0" is a valid semver range for clone +178 silly addNameRange { name: 'clone', range: '>=2.1.2 <3.0.0', hasData: false } +179 silly mapToRegistry name clone +180 silly mapToRegistry using default registry +181 silly mapToRegistry registry https://registry.npmjs.org/ +182 silly mapToRegistry uri https://registry.npmjs.org/clone +183 verbose addNameRange registry:https://registry.npmjs.org/clone not in flight; fetching +184 verbose get https://registry.npmjs.org/clone not expired, no request +185 silly addNameRange number 2 { name: 'clone', range: '>=2.1.2 <3.0.0', hasData: true } +186 silly addNameRange versions [ 'clone', +186 silly addNameRange [ '0.0.0', +186 silly addNameRange '0.0.1', +186 silly addNameRange '0.0.2', +186 silly addNameRange '0.0.3', +186 silly addNameRange '0.0.4', +186 silly addNameRange '0.0.5', +186 silly addNameRange '0.0.6', +186 silly addNameRange '0.0.7', +186 silly addNameRange '0.1.0', +186 silly addNameRange '0.1.1', +186 silly addNameRange '0.1.2', +186 silly addNameRange '0.1.3', +186 silly addNameRange '0.1.4', +186 silly addNameRange '0.1.5', +186 silly addNameRange '0.1.6', +186 silly addNameRange '0.1.7', +186 silly addNameRange '0.1.8', +186 silly addNameRange '0.1.9', +186 silly addNameRange '0.1.10', +186 silly addNameRange '0.1.11', +186 silly addNameRange '0.1.12', +186 silly addNameRange '0.1.13', +186 silly addNameRange '0.1.14', +186 silly addNameRange '0.1.15', +186 silly addNameRange '0.1.16', +186 silly addNameRange '0.1.17', +186 silly addNameRange '0.1.18', +186 silly addNameRange '0.2.0', +186 silly addNameRange '0.1.19', +186 silly addNameRange '1.0.0', +186 silly addNameRange '1.0.1', +186 silly addNameRange '1.0.2', +186 silly addNameRange '2.0.0', +186 silly addNameRange '2.1.0', +186 silly addNameRange '2.1.1', +186 silly addNameRange '1.0.3', +186 silly addNameRange '2.1.2', +186 silly addNameRange '1.0.4' ] ] +187 silly addNamed clone@2.1.2 +188 verbose addNamed "2.1.2" is a plain semver version for clone +189 silly mapToRegistry name clone +190 silly mapToRegistry using default registry +191 silly mapToRegistry registry https://registry.npmjs.org/ +192 silly mapToRegistry uri https://registry.npmjs.org/clone +193 verbose addRemoteTarball https://registry.npmjs.org/clone/-/clone-2.1.2.tgz not in flight; adding +194 verbose addRemoteTarball [ 'https://registry.npmjs.org/clone/-/clone-2.1.2.tgz', +194 verbose addRemoteTarball '1b7f4b9f591f1e8f83670401600345a02887435f' ] +195 info retry fetch attempt 1 at 13:48:57 +196 info attempt registry request try #1 at 13:48:57 +197 http fetch GET https://registry.npmjs.org/clone/-/clone-2.1.2.tgz +198 http fetch 200 https://registry.npmjs.org/clone/-/clone-2.1.2.tgz +199 silly fetchAndShaCheck shasum 1b7f4b9f591f1e8f83670401600345a02887435f +200 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/clone/-/clone-2.1.2.tgz not in flight; adding +201 verbose addTmpTarball already have metadata; skipping unpack for clone@2.1.2 +202 http 200 https://registry.npmjs.org/mime +203 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +203 verbose headers 'content-type': 'application/json', +203 verbose headers 'transfer-encoding': 'chunked', +203 verbose headers connection: 'keep-alive', +203 verbose headers 'set-cookie': +203 verbose headers [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +203 verbose headers 'cf-ray': '59764fa1caba6347-FRA', +203 verbose headers age: '5658', +203 verbose headers 'cache-control': 'public, max-age=300', +203 verbose headers etag: 'W/"06d541b2c21df82e268be063f8846ba5"', +203 verbose headers 'last-modified': 'Fri, 01 May 2020 23:10:52 GMT', +203 verbose headers vary: 'accept-encoding, accept', +203 verbose headers 'cf-cache-status': 'HIT', +203 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +203 verbose headers server: 'cloudflare', +203 verbose headers 'content-encoding': 'gzip', +203 verbose headers 'cf-request-id': '02ddd0192000006347e8890200000001' } +204 silly get cb [ 200, +204 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +204 silly get 'content-type': 'application/json', +204 silly get 'transfer-encoding': 'chunked', +204 silly get connection: 'keep-alive', +204 silly get 'set-cookie': +204 silly get [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +204 silly get 'cf-ray': '59764fa1caba6347-FRA', +204 silly get age: '5658', +204 silly get 'cache-control': 'public, max-age=300', +204 silly get etag: 'W/"06d541b2c21df82e268be063f8846ba5"', +204 silly get 'last-modified': 'Fri, 01 May 2020 23:10:52 GMT', +204 silly get vary: 'accept-encoding, accept', +204 silly get 'cf-cache-status': 'HIT', +204 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +204 silly get server: 'cloudflare', +204 silly get 'content-encoding': 'gzip', +204 silly get 'cf-request-id': '02ddd0192000006347e8890200000001' } ] +205 verbose get saving mime to /home/christine/.npm/registry.npmjs.org/mime/.cache.json +206 http 304 https://registry.npmjs.org/errno +207 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +207 verbose headers connection: 'keep-alive', +207 verbose headers 'set-cookie': +207 verbose headers [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +207 verbose headers 'cf-ray': '59764fa1ddccd6e9-FRA', +207 verbose headers age: '5629', +207 verbose headers 'cache-control': 'public, max-age=300', +207 verbose headers etag: '"93d3c79a655f99137298121fc95d36c6"', +207 verbose headers 'last-modified': 'Sat, 26 May 2018 23:40:24 GMT', +207 verbose headers vary: 'Accept-Encoding', +207 verbose headers 'cf-cache-status': 'HIT', +207 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +207 verbose headers server: 'cloudflare', +207 verbose headers 'cf-request-id': '02ddd019240000d6e975b00200000001' } +208 silly get cb [ 304, +208 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +208 silly get connection: 'keep-alive', +208 silly get 'set-cookie': +208 silly get [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +208 silly get 'cf-ray': '59764fa1ddccd6e9-FRA', +208 silly get age: '5629', +208 silly get 'cache-control': 'public, max-age=300', +208 silly get etag: '"93d3c79a655f99137298121fc95d36c6"', +208 silly get 'last-modified': 'Sat, 26 May 2018 23:40:24 GMT', +208 silly get vary: 'Accept-Encoding', +208 silly get 'cf-cache-status': 'HIT', +208 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +208 silly get server: 'cloudflare', +208 silly get 'cf-request-id': '02ddd019240000d6e975b00200000001' } ] +209 verbose etag https://registry.npmjs.org/errno from cache +210 verbose get saving errno to /home/christine/.npm/registry.npmjs.org/errno/.cache.json +211 http 200 https://registry.npmjs.org/promise +212 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +212 verbose headers 'content-type': 'application/json', +212 verbose headers 'transfer-encoding': 'chunked', +212 verbose headers connection: 'keep-alive', +212 verbose headers 'set-cookie': +212 verbose headers [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +212 verbose headers 'cf-ray': '59764fa1c9c76413-FRA', +212 verbose headers age: '5628', +212 verbose headers 'cache-control': 'public, max-age=300', +212 verbose headers etag: 'W/"0560bb757d840a7a46bf8d008bc75194"', +212 verbose headers 'last-modified': 'Mon, 02 Mar 2020 10:57:46 GMT', +212 verbose headers vary: 'accept-encoding, accept', +212 verbose headers 'cf-cache-status': 'HIT', +212 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +212 verbose headers server: 'cloudflare', +212 verbose headers 'content-encoding': 'gzip', +212 verbose headers 'cf-request-id': '02ddd01920000064135f8cb200000001' } +213 silly get cb [ 200, +213 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +213 silly get 'content-type': 'application/json', +213 silly get 'transfer-encoding': 'chunked', +213 silly get connection: 'keep-alive', +213 silly get 'set-cookie': +213 silly get [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +213 silly get 'cf-ray': '59764fa1c9c76413-FRA', +213 silly get age: '5628', +213 silly get 'cache-control': 'public, max-age=300', +213 silly get etag: 'W/"0560bb757d840a7a46bf8d008bc75194"', +213 silly get 'last-modified': 'Mon, 02 Mar 2020 10:57:46 GMT', +213 silly get vary: 'accept-encoding, accept', +213 silly get 'cf-cache-status': 'HIT', +213 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +213 silly get server: 'cloudflare', +213 silly get 'content-encoding': 'gzip', +213 silly get 'cf-request-id': '02ddd01920000064135f8cb200000001' } ] +214 verbose get saving promise to /home/christine/.npm/registry.npmjs.org/promise/.cache.json +215 http 200 https://registry.npmjs.org/graceful-fs +216 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +216 verbose headers 'content-type': 'application/json', +216 verbose headers 'transfer-encoding': 'chunked', +216 verbose headers connection: 'keep-alive', +216 verbose headers 'set-cookie': +216 verbose headers [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +216 verbose headers 'cf-ray': '59764fa1da22325c-FRA', +216 verbose headers age: '5345', +216 verbose headers 'cache-control': 'public, max-age=300', +216 verbose headers etag: 'W/"84e1c483529d18a582ac0265096141af"', +216 verbose headers 'last-modified': 'Tue, 28 Apr 2020 15:14:15 GMT', +216 verbose headers vary: 'accept-encoding, accept', +216 verbose headers 'cf-cache-status': 'HIT', +216 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +216 verbose headers server: 'cloudflare', +216 verbose headers 'content-encoding': 'gzip', +216 verbose headers 'cf-request-id': '02ddd019250000325c4cbef200000001' } +217 silly get cb [ 200, +217 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +217 silly get 'content-type': 'application/json', +217 silly get 'transfer-encoding': 'chunked', +217 silly get connection: 'keep-alive', +217 silly get 'set-cookie': +217 silly get [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +217 silly get 'cf-ray': '59764fa1da22325c-FRA', +217 silly get age: '5345', +217 silly get 'cache-control': 'public, max-age=300', +217 silly get etag: 'W/"84e1c483529d18a582ac0265096141af"', +217 silly get 'last-modified': 'Tue, 28 Apr 2020 15:14:15 GMT', +217 silly get vary: 'accept-encoding, accept', +217 silly get 'cf-cache-status': 'HIT', +217 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +217 silly get server: 'cloudflare', +217 silly get 'content-encoding': 'gzip', +217 silly get 'cf-request-id': '02ddd019250000325c4cbef200000001' } ] +218 verbose get saving graceful-fs to /home/christine/.npm/registry.npmjs.org/graceful-fs/.cache.json +219 silly resolveWithNewModule errno@0.1.7 checking installable status +220 silly cache add args [ 'errno@^0.1.1', null ] +221 verbose cache add spec errno@^0.1.1 +222 silly cache add parsed spec Result { +222 silly cache add raw: 'errno@^0.1.1', +222 silly cache add scope: null, +222 silly cache add name: 'errno', +222 silly cache add rawSpec: '^0.1.1', +222 silly cache add spec: '>=0.1.1 <0.2.0', +222 silly cache add type: 'range' } +223 silly addNamed errno@>=0.1.1 <0.2.0 +224 verbose addNamed ">=0.1.1 <0.2.0" is a valid semver range for errno +225 silly addNameRange { name: 'errno', range: '>=0.1.1 <0.2.0', hasData: false } +226 silly mapToRegistry name errno +227 silly mapToRegistry using default registry +228 silly mapToRegistry registry https://registry.npmjs.org/ +229 silly mapToRegistry uri https://registry.npmjs.org/errno +230 verbose addNameRange registry:https://registry.npmjs.org/errno not in flight; fetching +231 silly resolveWithNewModule mime@1.6.0 checking installable status +232 silly cache add args [ 'mime@^1.4.1', null ] +233 verbose cache add spec mime@^1.4.1 +234 silly cache add parsed spec Result { +234 silly cache add raw: 'mime@^1.4.1', +234 silly cache add scope: null, +234 silly cache add name: 'mime', +234 silly cache add rawSpec: '^1.4.1', +234 silly cache add spec: '>=1.4.1 <2.0.0', +234 silly cache add type: 'range' } +235 silly addNamed mime@>=1.4.1 <2.0.0 +236 verbose addNamed ">=1.4.1 <2.0.0" is a valid semver range for mime +237 silly addNameRange { name: 'mime', range: '>=1.4.1 <2.0.0', hasData: false } +238 silly mapToRegistry name mime +239 silly mapToRegistry using default registry +240 silly mapToRegistry registry https://registry.npmjs.org/ +241 silly mapToRegistry uri https://registry.npmjs.org/mime +242 verbose addNameRange registry:https://registry.npmjs.org/mime not in flight; fetching +243 http 200 https://registry.npmjs.org/tslib +244 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +244 verbose headers 'content-type': 'application/json', +244 verbose headers 'transfer-encoding': 'chunked', +244 verbose headers connection: 'keep-alive', +244 verbose headers 'set-cookie': +244 verbose headers [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +244 verbose headers 'cf-ray': '59764fa1d9e7d715-FRA', +244 verbose headers age: '5299', +244 verbose headers 'cache-control': 'public, max-age=300', +244 verbose headers etag: 'W/"2b86a514bc0f750da0d0f62d3dbfde51"', +244 verbose headers 'last-modified': 'Wed, 13 May 2020 23:18:43 GMT', +244 verbose headers vary: 'accept-encoding, accept', +244 verbose headers 'cf-cache-status': 'HIT', +244 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +244 verbose headers server: 'cloudflare', +244 verbose headers 'content-encoding': 'gzip', +244 verbose headers 'cf-request-id': '02ddd019240000d715c11d3200000001' } +245 silly get cb [ 200, +245 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +245 silly get 'content-type': 'application/json', +245 silly get 'transfer-encoding': 'chunked', +245 silly get connection: 'keep-alive', +245 silly get 'set-cookie': +245 silly get [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +245 silly get 'cf-ray': '59764fa1d9e7d715-FRA', +245 silly get age: '5299', +245 silly get 'cache-control': 'public, max-age=300', +245 silly get etag: 'W/"2b86a514bc0f750da0d0f62d3dbfde51"', +245 silly get 'last-modified': 'Wed, 13 May 2020 23:18:43 GMT', +245 silly get vary: 'accept-encoding, accept', +245 silly get 'cf-cache-status': 'HIT', +245 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +245 silly get server: 'cloudflare', +245 silly get 'content-encoding': 'gzip', +245 silly get 'cf-request-id': '02ddd019240000d715c11d3200000001' } ] +246 verbose get saving tslib to /home/christine/.npm/registry.npmjs.org/tslib/.cache.json +247 verbose get https://registry.npmjs.org/errno not expired, no request +248 silly addNameRange number 2 { name: 'errno', range: '>=0.1.1 <0.2.0', hasData: true } +249 silly addNameRange versions [ 'errno', +249 silly addNameRange [ '0.0.1', +249 silly addNameRange '0.0.2', +249 silly addNameRange '0.0.3', +249 silly addNameRange '0.0.4', +249 silly addNameRange '0.0.5', +249 silly addNameRange '0.1.0', +249 silly addNameRange '0.1.1', +249 silly addNameRange '0.1.2', +249 silly addNameRange '0.1.3', +249 silly addNameRange '0.1.4', +249 silly addNameRange '0.1.5', +249 silly addNameRange '0.1.6', +249 silly addNameRange '0.1.7' ] ] +250 silly addNamed errno@0.1.7 +251 verbose addNamed "0.1.7" is a plain semver version for errno +252 verbose get https://registry.npmjs.org/mime not expired, no request +253 silly addNameRange number 2 { name: 'mime', range: '>=1.4.1 <2.0.0', hasData: true } +254 silly addNameRange versions [ 'mime', +254 silly addNameRange [ '1.0.0', +254 silly addNameRange '1.1.0', +254 silly addNameRange '1.2.1', +254 silly addNameRange '1.2.2', +254 silly addNameRange '1.2.3', +254 silly addNameRange '1.2.4', +254 silly addNameRange '1.2.5', +254 silly addNameRange '1.2.6', +254 silly addNameRange '1.2.7', +254 silly addNameRange '1.2.8', +254 silly addNameRange '1.2.9', +254 silly addNameRange '1.2.10', +254 silly addNameRange '1.2.11', +254 silly addNameRange '1.3.0', +254 silly addNameRange '1.3.2', +254 silly addNameRange '1.3.3', +254 silly addNameRange '1.3.4', +254 silly addNameRange '1.3.5', +254 silly addNameRange '1.3.6', +254 silly addNameRange '1.4.0', +254 silly addNameRange '2.0.0', +254 silly addNameRange '2.0.1', +254 silly addNameRange '2.0.2', +254 silly addNameRange '1.4.1', +254 silly addNameRange '2.0.3', +254 silly addNameRange '1.5.0', +254 silly addNameRange '1.6.0', +254 silly addNameRange '2.0.5', +254 silly addNameRange '2.1.0', +254 silly addNameRange '2.2.0', +254 silly addNameRange '2.2.1', +254 silly addNameRange '2.2.2', +254 silly addNameRange '2.3.0', +254 silly addNameRange '2.3.1', +254 silly addNameRange '2.4.0', +254 silly addNameRange '2.4.1', +254 silly addNameRange '2.4.2', +254 silly addNameRange '2.4.3', +254 silly addNameRange '2.4.4', +254 silly addNameRange '2.4.5' ] ] +255 silly addNamed mime@1.6.0 +256 verbose addNamed "1.6.0" is a plain semver version for mime +257 silly cache afterAdd clone@2.1.2 +258 verbose afterAdd /home/christine/.npm/clone/2.1.2/package/package.json not in flight; writing +259 silly mapToRegistry name mime +260 silly mapToRegistry using default registry +261 silly mapToRegistry registry https://registry.npmjs.org/ +262 silly mapToRegistry uri https://registry.npmjs.org/mime +263 verbose addRemoteTarball https://registry.npmjs.org/mime/-/mime-1.6.0.tgz not in flight; adding +264 verbose addRemoteTarball [ 'https://registry.npmjs.org/mime/-/mime-1.6.0.tgz', +264 verbose addRemoteTarball '32cd9e5c64553bd58d19a568af452acff04981b1' ] +265 http 200 https://registry.npmjs.org/mkdirp +266 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +266 verbose headers 'content-type': 'application/json', +266 verbose headers 'transfer-encoding': 'chunked', +266 verbose headers connection: 'keep-alive', +266 verbose headers 'set-cookie': +266 verbose headers [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +266 verbose headers 'cf-ray': '59764fa1fe51175a-FRA', +266 verbose headers age: '5346', +266 verbose headers 'cache-control': 'public, max-age=300', +266 verbose headers etag: 'W/"0730d9c43c136c318d8e19c69cbd72aa"', +266 verbose headers 'last-modified': 'Wed, 22 Apr 2020 06:03:24 GMT', +266 verbose headers vary: 'accept-encoding, accept', +266 verbose headers 'cf-cache-status': 'HIT', +266 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +266 verbose headers server: 'cloudflare', +266 verbose headers 'content-encoding': 'gzip', +266 verbose headers 'cf-request-id': '02ddd019380000175a1e1e7200000001' } +267 silly get cb [ 200, +267 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +267 silly get 'content-type': 'application/json', +267 silly get 'transfer-encoding': 'chunked', +267 silly get connection: 'keep-alive', +267 silly get 'set-cookie': +267 silly get [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +267 silly get 'cf-ray': '59764fa1fe51175a-FRA', +267 silly get age: '5346', +267 silly get 'cache-control': 'public, max-age=300', +267 silly get etag: 'W/"0730d9c43c136c318d8e19c69cbd72aa"', +267 silly get 'last-modified': 'Wed, 22 Apr 2020 06:03:24 GMT', +267 silly get vary: 'accept-encoding, accept', +267 silly get 'cf-cache-status': 'HIT', +267 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +267 silly get server: 'cloudflare', +267 silly get 'content-encoding': 'gzip', +267 silly get 'cf-request-id': '02ddd019380000175a1e1e7200000001' } ] +268 verbose get saving mkdirp to /home/christine/.npm/registry.npmjs.org/mkdirp/.cache.json +269 silly resolveWithNewModule graceful-fs@4.2.4 checking installable status +270 silly cache add args [ 'graceful-fs@^4.1.2', null ] +271 verbose cache add spec graceful-fs@^4.1.2 +272 silly cache add parsed spec Result { +272 silly cache add raw: 'graceful-fs@^4.1.2', +272 silly cache add scope: null, +272 silly cache add name: 'graceful-fs', +272 silly cache add rawSpec: '^4.1.2', +272 silly cache add spec: '>=4.1.2 <5.0.0', +272 silly cache add type: 'range' } +273 silly addNamed graceful-fs@>=4.1.2 <5.0.0 +274 verbose addNamed ">=4.1.2 <5.0.0" is a valid semver range for graceful-fs +275 silly addNameRange { name: 'graceful-fs', range: '>=4.1.2 <5.0.0', hasData: false } +276 silly mapToRegistry name graceful-fs +277 silly mapToRegistry using default registry +278 silly mapToRegistry registry https://registry.npmjs.org/ +279 silly mapToRegistry uri https://registry.npmjs.org/graceful-fs +280 verbose addNameRange registry:https://registry.npmjs.org/graceful-fs not in flight; fetching +281 http 200 https://registry.npmjs.org/image-size +282 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +282 verbose headers 'content-type': 'application/json', +282 verbose headers 'transfer-encoding': 'chunked', +282 verbose headers connection: 'keep-alive', +282 verbose headers 'set-cookie': +282 verbose headers [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +282 verbose headers 'cf-ray': '59764fa1cf14648b-FRA', +282 verbose headers age: '4621', +282 verbose headers 'cache-control': 'public, max-age=300', +282 verbose headers etag: 'W/"c223fda42dcf547145c5fcea3c32c5da"', +282 verbose headers 'last-modified': 'Mon, 30 Sep 2019 10:49:43 GMT', +282 verbose headers vary: 'accept-encoding, accept', +282 verbose headers 'cf-cache-status': 'HIT', +282 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +282 verbose headers server: 'cloudflare', +282 verbose headers 'content-encoding': 'gzip', +282 verbose headers 'cf-request-id': '02ddd0191b0000648bda3f1200000001' } +283 silly get cb [ 200, +283 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +283 silly get 'content-type': 'application/json', +283 silly get 'transfer-encoding': 'chunked', +283 silly get connection: 'keep-alive', +283 silly get 'set-cookie': +283 silly get [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +283 silly get 'cf-ray': '59764fa1cf14648b-FRA', +283 silly get age: '4621', +283 silly get 'cache-control': 'public, max-age=300', +283 silly get etag: 'W/"c223fda42dcf547145c5fcea3c32c5da"', +283 silly get 'last-modified': 'Mon, 30 Sep 2019 10:49:43 GMT', +283 silly get vary: 'accept-encoding, accept', +283 silly get 'cf-cache-status': 'HIT', +283 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +283 silly get server: 'cloudflare', +283 silly get 'content-encoding': 'gzip', +283 silly get 'cf-request-id': '02ddd0191b0000648bda3f1200000001' } ] +284 verbose get saving image-size to /home/christine/.npm/registry.npmjs.org/image-size/.cache.json +285 silly resolveWithNewModule promise@7.3.1 checking installable status +286 silly cache add args [ 'promise@^7.1.1', null ] +287 verbose cache add spec promise@^7.1.1 +288 silly cache add parsed spec Result { +288 silly cache add raw: 'promise@^7.1.1', +288 silly cache add scope: null, +288 silly cache add name: 'promise', +288 silly cache add rawSpec: '^7.1.1', +288 silly cache add spec: '>=7.1.1 <8.0.0', +288 silly cache add type: 'range' } +289 silly addNamed promise@>=7.1.1 <8.0.0 +290 verbose addNamed ">=7.1.1 <8.0.0" is a valid semver range for promise +291 silly addNameRange { name: 'promise', range: '>=7.1.1 <8.0.0', hasData: false } +292 silly mapToRegistry name promise +293 silly mapToRegistry using default registry +294 silly mapToRegistry registry https://registry.npmjs.org/ +295 silly mapToRegistry uri https://registry.npmjs.org/promise +296 verbose addNameRange registry:https://registry.npmjs.org/promise not in flight; fetching +297 info retry fetch attempt 1 at 13:48:57 +298 info attempt registry request try #1 at 13:48:57 +299 http fetch GET https://registry.npmjs.org/mime/-/mime-1.6.0.tgz +300 silly resolveWithNewModule tslib@1.13.0 checking installable status +301 silly cache add args [ 'tslib@^1.10.0', null ] +302 verbose cache add spec tslib@^1.10.0 +303 silly cache add parsed spec Result { +303 silly cache add raw: 'tslib@^1.10.0', +303 silly cache add scope: null, +303 silly cache add name: 'tslib', +303 silly cache add rawSpec: '^1.10.0', +303 silly cache add spec: '>=1.10.0 <2.0.0', +303 silly cache add type: 'range' } +304 silly addNamed tslib@>=1.10.0 <2.0.0 +305 verbose addNamed ">=1.10.0 <2.0.0" is a valid semver range for tslib +306 silly addNameRange { name: 'tslib', range: '>=1.10.0 <2.0.0', hasData: false } +307 silly mapToRegistry name tslib +308 silly mapToRegistry using default registry +309 silly mapToRegistry registry https://registry.npmjs.org/ +310 silly mapToRegistry uri https://registry.npmjs.org/tslib +311 verbose addNameRange registry:https://registry.npmjs.org/tslib not in flight; fetching +312 verbose afterAdd /home/christine/.npm/clone/2.1.2/package/package.json written +313 verbose get https://registry.npmjs.org/graceful-fs not expired, no request +314 silly addNameRange number 2 { name: 'graceful-fs', range: '>=4.1.2 <5.0.0', hasData: true } +315 silly addNameRange versions [ 'graceful-fs', +315 silly addNameRange [ '1.0.0', +315 silly addNameRange '1.0.1', +315 silly addNameRange '1.0.2', +315 silly addNameRange '1.1.0', +315 silly addNameRange '1.1.1', +315 silly addNameRange '1.1.2', +315 silly addNameRange '1.1.3', +315 silly addNameRange '1.1.4', +315 silly addNameRange '1.1.5', +315 silly addNameRange '1.1.6', +315 silly addNameRange '1.1.7', +315 silly addNameRange '1.1.8', +315 silly addNameRange '1.1.9', +315 silly addNameRange '1.1.10', +315 silly addNameRange '1.1.11', +315 silly addNameRange '1.1.12', +315 silly addNameRange '1.1.13', +315 silly addNameRange '1.1.14', +315 silly addNameRange '1.2.0', +315 silly addNameRange '1.2.1', +315 silly addNameRange '1.2.2', +315 silly addNameRange '1.2.3', +315 silly addNameRange '2.0.0', +315 silly addNameRange '2.0.1', +315 silly addNameRange '2.0.2', +315 silly addNameRange '2.0.3', +315 silly addNameRange '3.0.0', +315 silly addNameRange '3.0.1', +315 silly addNameRange '3.0.2', +315 silly addNameRange '3.0.3', +315 silly addNameRange '3.0.4', +315 silly addNameRange '3.0.5', +315 silly addNameRange '3.0.6', +315 silly addNameRange '3.0.7', +315 silly addNameRange '3.0.8', +315 silly addNameRange '4.1.0', +315 silly addNameRange '4.1.1', +315 silly addNameRange '4.1.2', +315 silly addNameRange '4.1.3', +315 silly addNameRange '4.1.4', +315 silly addNameRange '4.1.5', +315 silly addNameRange '3.0.9', +315 silly addNameRange '4.1.6', +315 silly addNameRange '3.0.10', +315 silly addNameRange '3.0.11', +315 silly addNameRange '4.1.7', +315 silly addNameRange '4.1.8', +315 silly addNameRange '4.1.9', +315 silly addNameRange '4.1.10', +315 silly addNameRange '4.1.11', +315 silly addNameRange '4.1.12', +315 silly addNameRange '4.1.13', +315 silly addNameRange '4.1.14', +315 silly addNameRange '4.1.15', +315 silly addNameRange '4.2.0', +315 silly addNameRange '4.2.1', +315 silly addNameRange '3.0.12', +315 silly addNameRange '4.2.2', +315 silly addNameRange '4.2.3', +315 silly addNameRange '4.2.4' ] ] +316 silly addNamed graceful-fs@4.2.4 +317 verbose addNamed "4.2.4" is a plain semver version for graceful-fs +318 silly cache afterAdd errno@0.1.7 +319 verbose afterAdd /home/christine/.npm/errno/0.1.7/package/package.json not in flight; writing +320 silly mapToRegistry name graceful-fs +321 silly mapToRegistry using default registry +322 silly mapToRegistry registry https://registry.npmjs.org/ +323 silly mapToRegistry uri https://registry.npmjs.org/graceful-fs +324 verbose addRemoteTarball https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz not in flight; adding +325 verbose addRemoteTarball [ 'https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz', +325 verbose addRemoteTarball '2256bde14d3632958c465ebc96dc467ca07a29fb' ] +326 verbose get https://registry.npmjs.org/promise not expired, no request +327 silly addNameRange number 2 { name: 'promise', range: '>=7.1.1 <8.0.0', hasData: true } +328 silly addNameRange versions [ 'promise', +328 silly addNameRange [ '1.2.1', +328 silly addNameRange '1.2.2', +328 silly addNameRange '1.3.0', +328 silly addNameRange '2.0.0', +328 silly addNameRange '3.0.0', +328 silly addNameRange '3.0.1', +328 silly addNameRange '3.1.0', +328 silly addNameRange '3.2.0', +328 silly addNameRange '4.0.0', +328 silly addNameRange '5.0.0', +328 silly addNameRange '6.0.0', +328 silly addNameRange '6.0.1', +328 silly addNameRange '6.1.0', +328 silly addNameRange '7.0.0', +328 silly addNameRange '7.0.1', +328 silly addNameRange '7.0.2', +328 silly addNameRange '7.0.3', +328 silly addNameRange '7.0.4', +328 silly addNameRange '7.1.0', +328 silly addNameRange '7.1.1', +328 silly addNameRange '7.2.0', +328 silly addNameRange '7.3.0', +328 silly addNameRange '7.3.1', +328 silly addNameRange '8.0.0', +328 silly addNameRange '8.0.1', +328 silly addNameRange '8.0.2', +328 silly addNameRange '8.0.3', +328 silly addNameRange '8.1.0' ] ] +329 silly addNamed promise@7.3.1 +330 verbose addNamed "7.3.1" is a plain semver version for promise +331 verbose get https://registry.npmjs.org/tslib not expired, no request +332 silly addNameRange number 2 { name: 'tslib', range: '>=1.10.0 <2.0.0', hasData: true } +333 silly addNameRange versions [ 'tslib', +333 silly addNameRange [ '0.0.1-security', +333 silly addNameRange '1.0.0', +333 silly addNameRange '1.1.0', +333 silly addNameRange '1.2.0', +333 silly addNameRange '1.3.0', +333 silly addNameRange '1.4.0', +333 silly addNameRange '1.5.0', +333 silly addNameRange '1.6.0', +333 silly addNameRange '1.6.1', +333 silly addNameRange '1.7.0', +333 silly addNameRange '1.7.1', +333 silly addNameRange '1.8.0', +333 silly addNameRange '1.8.1', +333 silly addNameRange '1.9.0', +333 silly addNameRange '1.9.1', +333 silly addNameRange '1.9.2', +333 silly addNameRange '1.9.3', +333 silly addNameRange '1.10.0', +333 silly addNameRange '1.11.0', +333 silly addNameRange '1.11.1', +333 silly addNameRange '1.11.2', +333 silly addNameRange '1.12.0', +333 silly addNameRange '1.13.0', +333 silly addNameRange '2.0.0' ] ] +334 silly addNamed tslib@1.13.0 +335 verbose addNamed "1.13.0" is a plain semver version for tslib +336 silly mapToRegistry name promise +337 silly mapToRegistry using default registry +338 silly mapToRegistry registry https://registry.npmjs.org/ +339 silly mapToRegistry uri https://registry.npmjs.org/promise +340 verbose addRemoteTarball https://registry.npmjs.org/promise/-/promise-7.3.1.tgz not in flight; adding +341 verbose addRemoteTarball [ 'https://registry.npmjs.org/promise/-/promise-7.3.1.tgz', +341 verbose addRemoteTarball '064b72602b18f90f29192b8b1bc418ffd1ebd3bf' ] +342 silly resolveWithNewModule mkdirp@0.5.5 checking installable status +343 silly cache add args [ 'mkdirp@^0.5.0', null ] +344 verbose cache add spec mkdirp@^0.5.0 +345 silly cache add parsed spec Result { +345 silly cache add raw: 'mkdirp@^0.5.0', +345 silly cache add scope: null, +345 silly cache add name: 'mkdirp', +345 silly cache add rawSpec: '^0.5.0', +345 silly cache add spec: '>=0.5.0 <0.6.0', +345 silly cache add type: 'range' } +346 silly addNamed mkdirp@>=0.5.0 <0.6.0 +347 verbose addNamed ">=0.5.0 <0.6.0" is a valid semver range for mkdirp +348 silly addNameRange { name: 'mkdirp', range: '>=0.5.0 <0.6.0', hasData: false } +349 silly mapToRegistry name mkdirp +350 silly mapToRegistry using default registry +351 silly mapToRegistry registry https://registry.npmjs.org/ +352 silly mapToRegistry uri https://registry.npmjs.org/mkdirp +353 verbose addNameRange registry:https://registry.npmjs.org/mkdirp not in flight; fetching +354 silly mapToRegistry name tslib +355 silly mapToRegistry using default registry +356 silly mapToRegistry registry https://registry.npmjs.org/ +357 silly mapToRegistry uri https://registry.npmjs.org/tslib +358 verbose addRemoteTarball https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz not in flight; adding +359 verbose addRemoteTarball [ 'https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz', +359 verbose addRemoteTarball 'c881e13cc7015894ed914862d276436fa9a47043' ] +360 info retry fetch attempt 1 at 13:48:57 +361 info attempt registry request try #1 at 13:48:57 +362 http fetch GET https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz +363 info retry fetch attempt 1 at 13:48:57 +364 info attempt registry request try #1 at 13:48:57 +365 http fetch GET https://registry.npmjs.org/promise/-/promise-7.3.1.tgz +366 http 200 https://registry.npmjs.org/source-map +367 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +367 verbose headers 'content-type': 'application/json', +367 verbose headers 'transfer-encoding': 'chunked', +367 verbose headers connection: 'keep-alive', +367 verbose headers 'set-cookie': +367 verbose headers [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +367 verbose headers 'cf-ray': '59764fa1f8a405fd-FRA', +367 verbose headers age: '5629', +367 verbose headers 'cache-control': 'public, max-age=300', +367 verbose headers etag: 'W/"ed6422e25077febab77501a786cb4bdd"', +367 verbose headers 'last-modified': 'Thu, 07 May 2020 17:23:05 GMT', +367 verbose headers vary: 'accept-encoding, accept', +367 verbose headers 'cf-cache-status': 'HIT', +367 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +367 verbose headers server: 'cloudflare', +367 verbose headers 'content-encoding': 'gzip', +367 verbose headers 'cf-request-id': '02ddd0193d000005fd8da0d200000001' } +368 silly get cb [ 200, +368 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +368 silly get 'content-type': 'application/json', +368 silly get 'transfer-encoding': 'chunked', +368 silly get connection: 'keep-alive', +368 silly get 'set-cookie': +368 silly get [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +368 silly get 'cf-ray': '59764fa1f8a405fd-FRA', +368 silly get age: '5629', +368 silly get 'cache-control': 'public, max-age=300', +368 silly get etag: 'W/"ed6422e25077febab77501a786cb4bdd"', +368 silly get 'last-modified': 'Thu, 07 May 2020 17:23:05 GMT', +368 silly get vary: 'accept-encoding, accept', +368 silly get 'cf-cache-status': 'HIT', +368 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +368 silly get server: 'cloudflare', +368 silly get 'content-encoding': 'gzip', +368 silly get 'cf-request-id': '02ddd0193d000005fd8da0d200000001' } ] +369 verbose get saving source-map to /home/christine/.npm/registry.npmjs.org/source-map/.cache.json +370 silly resolveWithNewModule image-size@0.5.5 checking installable status +371 silly cache add args [ 'image-size@~0.5.0', null ] +372 verbose cache add spec image-size@~0.5.0 +373 silly cache add parsed spec Result { +373 silly cache add raw: 'image-size@~0.5.0', +373 silly cache add scope: null, +373 silly cache add name: 'image-size', +373 silly cache add rawSpec: '~0.5.0', +373 silly cache add spec: '>=0.5.0 <0.6.0', +373 silly cache add type: 'range' } +374 silly addNamed image-size@>=0.5.0 <0.6.0 +375 verbose addNamed ">=0.5.0 <0.6.0" is a valid semver range for image-size +376 silly addNameRange { name: 'image-size', range: '>=0.5.0 <0.6.0', hasData: false } +377 silly mapToRegistry name image-size +378 silly mapToRegistry using default registry +379 silly mapToRegistry registry https://registry.npmjs.org/ +380 silly mapToRegistry uri https://registry.npmjs.org/image-size +381 verbose addNameRange registry:https://registry.npmjs.org/image-size not in flight; fetching +382 info retry fetch attempt 1 at 13:48:57 +383 info attempt registry request try #1 at 13:48:57 +384 http fetch GET https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz +385 verbose afterAdd /home/christine/.npm/errno/0.1.7/package/package.json written +386 verbose get https://registry.npmjs.org/mkdirp not expired, no request +387 silly addNameRange number 2 { name: 'mkdirp', range: '>=0.5.0 <0.6.0', hasData: true } +388 silly addNameRange versions [ 'mkdirp', +388 silly addNameRange [ '0.0.1', +388 silly addNameRange '0.0.2', +388 silly addNameRange '0.0.3', +388 silly addNameRange '0.0.4', +388 silly addNameRange '0.0.5', +388 silly addNameRange '0.0.6', +388 silly addNameRange '0.0.7', +388 silly addNameRange '0.1.0', +388 silly addNameRange '0.2.0', +388 silly addNameRange '0.2.1', +388 silly addNameRange '0.2.2', +388 silly addNameRange '0.3.0', +388 silly addNameRange '0.3.1', +388 silly addNameRange '0.3.2', +388 silly addNameRange '0.3.3', +388 silly addNameRange '0.3.4', +388 silly addNameRange '0.3.5', +388 silly addNameRange '0.4.0', +388 silly addNameRange '0.4.1', +388 silly addNameRange '0.4.2', +388 silly addNameRange '0.5.0', +388 silly addNameRange '0.5.1', +388 silly addNameRange '1.0.0', +388 silly addNameRange '1.0.1', +388 silly addNameRange '1.0.2', +388 silly addNameRange '1.0.3', +388 silly addNameRange '0.5.2', +388 silly addNameRange '0.5.3', +388 silly addNameRange '0.5.4', +388 silly addNameRange '1.0.4', +388 silly addNameRange '0.5.5' ] ] +389 silly addNamed mkdirp@0.5.5 +390 verbose addNamed "0.5.5" is a plain semver version for mkdirp +391 silly mapToRegistry name mkdirp +392 silly mapToRegistry using default registry +393 silly mapToRegistry registry https://registry.npmjs.org/ +394 silly mapToRegistry uri https://registry.npmjs.org/mkdirp +395 verbose addRemoteTarball https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz not in flight; adding +396 verbose addRemoteTarball [ 'https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz', +396 verbose addRemoteTarball 'd91cefd62d1436ca0f41620e251288d420099def' ] +397 verbose get https://registry.npmjs.org/image-size not expired, no request +398 silly addNameRange number 2 { name: 'image-size', range: '>=0.5.0 <0.6.0', hasData: true } +399 silly addNameRange versions [ 'image-size', +399 silly addNameRange [ '0.0.2', +399 silly addNameRange '0.0.3', +399 silly addNameRange '0.0.5', +399 silly addNameRange '0.1.0', +399 silly addNameRange '0.1.1', +399 silly addNameRange '0.1.2', +399 silly addNameRange '0.1.3', +399 silly addNameRange '0.1.4', +399 silly addNameRange '0.1.5', +399 silly addNameRange '0.1.6', +399 silly addNameRange '0.1.7', +399 silly addNameRange '0.1.10', +399 silly addNameRange '0.1.15', +399 silly addNameRange '0.0.16', +399 silly addNameRange '0.1.16', +399 silly addNameRange '0.1.17', +399 silly addNameRange '0.1.20', +399 silly addNameRange '0.2.1', +399 silly addNameRange '0.2.2', +399 silly addNameRange '0.2.3', +399 silly addNameRange '0.2.4', +399 silly addNameRange '0.2.5', +399 silly addNameRange '0.3.0', +399 silly addNameRange '0.3.1', +399 silly addNameRange '0.3.2', +399 silly addNameRange '0.3.3', +399 silly addNameRange '0.3.5', +399 silly addNameRange '0.4.0', +399 silly addNameRange '0.5.0', +399 silly addNameRange '0.5.1', +399 silly addNameRange '0.5.2', +399 silly addNameRange '0.5.3', +399 silly addNameRange '0.5.4', +399 silly addNameRange '0.5.5', +399 silly addNameRange '0.6.0', +399 silly addNameRange '0.6.1', +399 silly addNameRange '0.6.2', +399 silly addNameRange '0.6.3', +399 silly addNameRange '0.7.0', +399 silly addNameRange '0.7.1', +399 silly addNameRange '0.7.2', +399 silly addNameRange '0.7.3', +399 silly addNameRange '0.7.4', +399 silly addNameRange '0.7.5', +399 silly addNameRange '0.8.0', +399 silly addNameRange '0.8.1', +399 silly addNameRange '0.8.2', +399 silly addNameRange '0.8.3' ] ] +400 silly addNamed image-size@0.5.5 +401 verbose addNamed "0.5.5" is a plain semver version for image-size +402 silly mapToRegistry name image-size +403 silly mapToRegistry using default registry +404 silly mapToRegistry registry https://registry.npmjs.org/ +405 silly mapToRegistry uri https://registry.npmjs.org/image-size +406 verbose addRemoteTarball https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz not in flight; adding +407 verbose addRemoteTarball [ 'https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz', +407 verbose addRemoteTarball '09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c' ] +408 http fetch 200 https://registry.npmjs.org/mime/-/mime-1.6.0.tgz +409 info retry fetch attempt 1 at 13:48:57 +410 info attempt registry request try #1 at 13:48:57 +411 http fetch GET https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz +412 http 200 https://registry.npmjs.org/request +413 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +413 verbose headers 'content-type': 'application/json', +413 verbose headers 'transfer-encoding': 'chunked', +413 verbose headers connection: 'keep-alive', +413 verbose headers 'set-cookie': +413 verbose headers [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +413 verbose headers 'cf-ray': '59764fa1dc0ec272-FRA', +413 verbose headers age: '5668', +413 verbose headers 'cache-control': 'public, max-age=300', +413 verbose headers etag: 'W/"f6a50554348a0710692c70f1bd6574ab"', +413 verbose headers 'last-modified': 'Mon, 11 May 2020 15:19:07 GMT', +413 verbose headers vary: 'accept-encoding, accept', +413 verbose headers 'cf-cache-status': 'HIT', +413 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +413 verbose headers server: 'cloudflare', +413 verbose headers 'content-encoding': 'gzip', +413 verbose headers 'cf-request-id': '02ddd0192b0000c27238899200000001' } +414 silly get cb [ 200, +414 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +414 silly get 'content-type': 'application/json', +414 silly get 'transfer-encoding': 'chunked', +414 silly get connection: 'keep-alive', +414 silly get 'set-cookie': +414 silly get [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +414 silly get 'cf-ray': '59764fa1dc0ec272-FRA', +414 silly get age: '5668', +414 silly get 'cache-control': 'public, max-age=300', +414 silly get etag: 'W/"f6a50554348a0710692c70f1bd6574ab"', +414 silly get 'last-modified': 'Mon, 11 May 2020 15:19:07 GMT', +414 silly get vary: 'accept-encoding, accept', +414 silly get 'cf-cache-status': 'HIT', +414 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +414 silly get server: 'cloudflare', +414 silly get 'content-encoding': 'gzip', +414 silly get 'cf-request-id': '02ddd0192b0000c27238899200000001' } ] +415 verbose get saving request to /home/christine/.npm/registry.npmjs.org/request/.cache.json +416 silly resolveWithNewModule source-map@0.6.1 checking installable status +417 silly cache add args [ 'source-map@~0.6.0', null ] +418 verbose cache add spec source-map@~0.6.0 +419 silly cache add parsed spec Result { +419 silly cache add raw: 'source-map@~0.6.0', +419 silly cache add scope: null, +419 silly cache add name: 'source-map', +419 silly cache add rawSpec: '~0.6.0', +419 silly cache add spec: '>=0.6.0 <0.7.0', +419 silly cache add type: 'range' } +420 silly addNamed source-map@>=0.6.0 <0.7.0 +421 verbose addNamed ">=0.6.0 <0.7.0" is a valid semver range for source-map +422 silly addNameRange { name: 'source-map', range: '>=0.6.0 <0.7.0', hasData: false } +423 silly mapToRegistry name source-map +424 silly mapToRegistry using default registry +425 silly mapToRegistry registry https://registry.npmjs.org/ +426 silly mapToRegistry uri https://registry.npmjs.org/source-map +427 verbose addNameRange registry:https://registry.npmjs.org/source-map not in flight; fetching +428 info retry fetch attempt 1 at 13:48:57 +429 info attempt registry request try #1 at 13:48:57 +430 http fetch GET https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz +431 silly fetchAndShaCheck shasum 32cd9e5c64553bd58d19a568af452acff04981b1 +432 http fetch 200 https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz +433 http fetch 200 https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz +434 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mime/-/mime-1.6.0.tgz not in flight; adding +435 verbose addTmpTarball already have metadata; skipping unpack for mime@1.6.0 +436 verbose get https://registry.npmjs.org/source-map not expired, no request +437 silly addNameRange number 2 { name: 'source-map', range: '>=0.6.0 <0.7.0', hasData: true } +438 silly addNameRange versions [ 'source-map', +438 silly addNameRange [ '0.0.0', +438 silly addNameRange '0.1.0', +438 silly addNameRange '0.1.1', +438 silly addNameRange '0.1.2', +438 silly addNameRange '0.1.3', +438 silly addNameRange '0.1.4', +438 silly addNameRange '0.1.5', +438 silly addNameRange '0.1.6', +438 silly addNameRange '0.1.7', +438 silly addNameRange '0.1.8', +438 silly addNameRange '0.1.9', +438 silly addNameRange '0.1.10', +438 silly addNameRange '0.1.11', +438 silly addNameRange '0.1.12', +438 silly addNameRange '0.1.13', +438 silly addNameRange '0.1.14', +438 silly addNameRange '0.1.15', +438 silly addNameRange '0.1.16', +438 silly addNameRange '0.1.17', +438 silly addNameRange '0.1.18', +438 silly addNameRange '0.1.19', +438 silly addNameRange '0.1.20', +438 silly addNameRange '0.1.21', +438 silly addNameRange '0.1.22', +438 silly addNameRange '0.1.23', +438 silly addNameRange '0.1.24', +438 silly addNameRange '0.1.25', +438 silly addNameRange '0.1.26', +438 silly addNameRange '0.1.27', +438 silly addNameRange '0.1.28', +438 silly addNameRange '0.1.29', +438 silly addNameRange '0.1.30', +438 silly addNameRange '0.1.31', +438 silly addNameRange '0.1.32', +438 silly addNameRange '0.1.33', +438 silly addNameRange '0.1.34', +438 silly addNameRange '0.1.35', +438 silly addNameRange '0.1.36', +438 silly addNameRange '0.1.37', +438 silly addNameRange '0.1.38', +438 silly addNameRange '0.1.39', +438 silly addNameRange '0.1.40', +438 silly addNameRange '0.1.41', +438 silly addNameRange '0.1.42', +438 silly addNameRange '0.1.43', +438 silly addNameRange '0.2.0', +438 silly addNameRange '0.3.0', +438 silly addNameRange '0.4.0', +438 silly addNameRange '0.4.1', +438 silly addNameRange '0.4.2', +438 silly addNameRange '0.4.3', +438 silly addNameRange '0.4.4', +438 silly addNameRange '0.5.0', +438 silly addNameRange '0.5.1', +438 silly addNameRange '0.5.2', +438 silly addNameRange '0.5.3', +438 silly addNameRange '0.5.4', +438 silly addNameRange '0.5.5', +438 silly addNameRange '0.5.6', +438 silly addNameRange '0.5.7', +438 silly addNameRange '0.6.0', +438 silly addNameRange '0.6.1', +438 silly addNameRange '0.7.0', +438 silly addNameRange '0.7.1', +438 silly addNameRange '0.7.2', +438 silly addNameRange '0.7.3', +438 silly addNameRange '0.8.0-beta.0' ] ] +439 silly addNamed source-map@0.6.1 +440 verbose addNamed "0.6.1" is a plain semver version for source-map +441 silly fetchAndShaCheck shasum 2256bde14d3632958c465ebc96dc467ca07a29fb +442 silly fetchAndShaCheck shasum c881e13cc7015894ed914862d276436fa9a47043 +443 silly resolveWithNewModule request@2.88.2 checking installable status +444 silly cache add args [ 'request@^2.83.0', null ] +445 verbose cache add spec request@^2.83.0 +446 silly cache add parsed spec Result { +446 silly cache add raw: 'request@^2.83.0', +446 silly cache add scope: null, +446 silly cache add name: 'request', +446 silly cache add rawSpec: '^2.83.0', +446 silly cache add spec: '>=2.83.0 <3.0.0', +446 silly cache add type: 'range' } +447 silly addNamed request@>=2.83.0 <3.0.0 +448 verbose addNamed ">=2.83.0 <3.0.0" is a valid semver range for request +449 silly addNameRange { name: 'request', range: '>=2.83.0 <3.0.0', hasData: false } +450 silly mapToRegistry name request +451 silly mapToRegistry using default registry +452 silly mapToRegistry registry https://registry.npmjs.org/ +453 silly mapToRegistry uri https://registry.npmjs.org/request +454 verbose addNameRange registry:https://registry.npmjs.org/request not in flight; fetching +455 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz not in flight; adding +456 verbose addTmpTarball already have metadata; skipping unpack for graceful-fs@4.2.4 +457 http fetch 200 https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz +458 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/tslib/-/tslib-1.13.0.tgz not in flight; adding +459 verbose addTmpTarball already have metadata; skipping unpack for tslib@1.13.0 +460 verbose get https://registry.npmjs.org/request not expired, no request +461 silly addNameRange number 2 { name: 'request', range: '>=2.83.0 <3.0.0', hasData: true } +462 silly addNameRange versions [ 'request', +462 silly addNameRange [ '0.10.0', +462 silly addNameRange '0.8.3', +462 silly addNameRange '0.9.0', +462 silly addNameRange '0.9.1', +462 silly addNameRange '0.9.5', +462 silly addNameRange '1.0.0', +462 silly addNameRange '1.1.0', +462 silly addNameRange '1.1.1', +462 silly addNameRange '1.2.0', +462 silly addNameRange '1.9.0', +462 silly addNameRange '1.9.1', +462 silly addNameRange '1.9.2', +462 silly addNameRange '1.9.3', +462 silly addNameRange '1.9.5', +462 silly addNameRange '1.9.7', +462 silly addNameRange '1.9.8', +462 silly addNameRange '1.9.9', +462 silly addNameRange '2.0.0', +462 silly addNameRange '2.0.1', +462 silly addNameRange '2.0.2', +462 silly addNameRange '2.0.3', +462 silly addNameRange '2.0.4', +462 silly addNameRange '2.0.5', +462 silly addNameRange '2.1.0', +462 silly addNameRange '2.1.1', +462 silly addNameRange '2.2.0', +462 silly addNameRange '2.2.5', +462 silly addNameRange '2.2.6', +462 silly addNameRange '2.2.9', +462 silly addNameRange '2.9.0', +462 silly addNameRange '2.9.1', +462 silly addNameRange '2.9.2', +462 silly addNameRange '2.9.3', +462 silly addNameRange '2.9.100', +462 silly addNameRange '2.9.150', +462 silly addNameRange '2.9.151', +462 silly addNameRange '2.9.152', +462 silly addNameRange '2.9.153', +462 silly addNameRange '2.9.200', +462 silly addNameRange '2.9.201', +462 silly addNameRange '2.9.202', +462 silly addNameRange '2.9.203', +462 silly addNameRange '2.10.0', +462 silly addNameRange '2.11.0', +462 silly addNameRange '2.11.1', +462 silly addNameRange '2.11.2', +462 silly addNameRange '2.11.3', +462 silly addNameRange '2.11.4', +462 silly addNameRange '2.12.0', +462 silly addNameRange '2.14.0', +462 silly addNameRange '2.16.0', +462 silly addNameRange '2.16.2', +462 silly addNameRange '2.16.4', +462 silly addNameRange '2.16.6', +462 silly addNameRange '2.18.0', +462 silly addNameRange '2.19.0', +462 silly addNameRange '2.20.0', +462 silly addNameRange '2.21.0', +462 silly addNameRange '2.22.0', +462 silly addNameRange '2.23.0', +462 silly addNameRange '2.24.0', +462 silly addNameRange '2.25.0', +462 silly addNameRange '2.26.0', +462 silly addNameRange '2.27.0', +462 silly addNameRange '2.28.0', +462 silly addNameRange '2.29.0', +462 silly addNameRange '2.30.0', +462 silly addNameRange '2.31.0', +462 silly addNameRange '2.32.0', +462 silly addNameRange '2.33.0', +462 silly addNameRange '2.34.0', +462 silly addNameRange '2.35.0', +462 silly addNameRange '2.36.0', +462 silly addNameRange '2.37.0', +462 silly addNameRange '2.38.0', +462 silly addNameRange '2.39.0', +462 silly addNameRange '2.40.0', +462 silly addNameRange '2.41.0', +462 silly addNameRange '2.42.0', +462 silly addNameRange '2.43.0', +462 silly addNameRange '2.44.0', +462 silly addNameRange '2.45.0', +462 silly addNameRange '2.46.0', +462 silly addNameRange '2.47.0', +462 silly addNameRange '2.48.0', +462 silly addNameRange '2.49.0', +462 silly addNameRange '2.50.0', +462 silly addNameRange '2.51.0', +462 silly addNameRange '2.52.0', +462 silly addNameRange '2.53.0', +462 silly addNameRange '2.54.0', +462 silly addNameRange '2.55.0', +462 silly addNameRange '2.56.0', +462 silly addNameRange '2.57.0', +462 silly addNameRange '2.58.0', +462 silly addNameRange '2.59.0', +462 silly addNameRange '2.60.0', +462 silly addNameRange '2.61.0', +462 silly addNameRange '2.62.0', +462 silly addNameRange '2.63.0', +462 silly addNameRange ... 26 more items ] ] +463 silly addNamed request@2.88.2 +464 verbose addNamed "2.88.2" is a plain semver version for request +465 warn deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 +466 silly fetchAndShaCheck shasum d91cefd62d1436ca0f41620e251288d420099def +467 silly cache afterAdd source-map@0.6.1 +468 verbose afterAdd /home/christine/.npm/source-map/0.6.1/package/package.json not in flight; writing +469 silly mapToRegistry name request +470 silly mapToRegistry using default registry +471 silly mapToRegistry registry https://registry.npmjs.org/ +472 silly mapToRegistry uri https://registry.npmjs.org/request +473 verbose addRemoteTarball https://registry.npmjs.org/request/-/request-2.88.2.tgz not in flight; adding +474 verbose addRemoteTarball [ 'https://registry.npmjs.org/request/-/request-2.88.2.tgz', +474 verbose addRemoteTarball 'd73c918731cb5a87da047e207234146f664d12b3' ] +475 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz not in flight; adding +476 verbose addTmpTarball already have metadata; skipping unpack for mkdirp@0.5.5 +477 info retry fetch attempt 1 at 13:48:57 +478 info attempt registry request try #1 at 13:48:57 +479 http fetch GET https://registry.npmjs.org/request/-/request-2.88.2.tgz +480 verbose afterAdd /home/christine/.npm/source-map/0.6.1/package/package.json written +481 silly cache afterAdd graceful-fs@4.2.4 +482 verbose afterAdd /home/christine/.npm/graceful-fs/4.2.4/package/package.json not in flight; writing +483 silly cache afterAdd tslib@1.13.0 +484 verbose afterAdd /home/christine/.npm/tslib/1.13.0/package/package.json not in flight; writing +485 silly cache afterAdd mime@1.6.0 +486 verbose afterAdd /home/christine/.npm/mime/1.6.0/package/package.json not in flight; writing +487 verbose afterAdd /home/christine/.npm/graceful-fs/4.2.4/package/package.json written +488 verbose afterAdd /home/christine/.npm/tslib/1.13.0/package/package.json written +489 verbose afterAdd /home/christine/.npm/mime/1.6.0/package/package.json written +490 silly cache afterAdd mkdirp@0.5.5 +491 verbose afterAdd /home/christine/.npm/mkdirp/0.5.5/package/package.json not in flight; writing +492 verbose afterAdd /home/christine/.npm/mkdirp/0.5.5/package/package.json written +493 http fetch 200 https://registry.npmjs.org/promise/-/promise-7.3.1.tgz +494 silly fetchAndShaCheck shasum 064b72602b18f90f29192b8b1bc418ffd1ebd3bf +495 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/promise/-/promise-7.3.1.tgz not in flight; adding +496 verbose addTmpTarball already have metadata; skipping unpack for promise@7.3.1 +497 silly cache afterAdd promise@7.3.1 +498 verbose afterAdd /home/christine/.npm/promise/7.3.1/package/package.json not in flight; writing +499 verbose afterAdd /home/christine/.npm/promise/7.3.1/package/package.json written +500 http fetch 200 https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz +501 silly fetchAndShaCheck shasum 09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c +502 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/image-size/-/image-size-0.5.5.tgz not in flight; adding +503 verbose addTmpTarball already have metadata; skipping unpack for image-size@0.5.5 +504 http fetch 200 https://registry.npmjs.org/request/-/request-2.88.2.tgz +505 silly cache afterAdd image-size@0.5.5 +506 verbose afterAdd /home/christine/.npm/image-size/0.5.5/package/package.json not in flight; writing +507 verbose afterAdd /home/christine/.npm/image-size/0.5.5/package/package.json written +508 silly fetchAndShaCheck shasum d73c918731cb5a87da047e207234146f664d12b3 +509 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/request/-/request-2.88.2.tgz not in flight; adding +510 verbose addTmpTarball already have metadata; skipping unpack for request@2.88.2 +511 silly cache afterAdd request@2.88.2 +512 verbose afterAdd /home/christine/.npm/request/2.88.2/package/package.json not in flight; writing +513 verbose afterAdd /home/christine/.npm/request/2.88.2/package/package.json written +514 silly fetchNamedPackageData prr +515 silly mapToRegistry name prr +516 silly mapToRegistry using default registry +517 silly mapToRegistry registry https://registry.npmjs.org/ +518 silly mapToRegistry uri https://registry.npmjs.org/prr +519 verbose request uri https://registry.npmjs.org/prr +520 verbose request no auth needed +521 info attempt registry request try #1 at 13:48:57 +522 verbose etag W/"07ebb6c11e7a8b0a67aabb93f8b3aa09" +523 verbose lastModified Sun, 27 May 2018 13:04:47 GMT +524 http request GET https://registry.npmjs.org/prr +525 http 304 https://registry.npmjs.org/prr +526 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +526 verbose headers connection: 'keep-alive', +526 verbose headers 'set-cookie': +526 verbose headers [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +526 verbose headers 'cf-ray': '59764fa31fae648b-FRA', +526 verbose headers age: '5629', +526 verbose headers 'cache-control': 'public, max-age=300', +526 verbose headers etag: '"07ebb6c11e7a8b0a67aabb93f8b3aa09"', +526 verbose headers 'last-modified': 'Sun, 27 May 2018 13:04:47 GMT', +526 verbose headers vary: 'Accept-Encoding', +526 verbose headers 'cf-cache-status': 'HIT', +526 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +526 verbose headers server: 'cloudflare', +526 verbose headers 'cf-request-id': '02ddd019ef0000648bda3f9200000001' } +527 silly get cb [ 304, +527 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +527 silly get connection: 'keep-alive', +527 silly get 'set-cookie': +527 silly get [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +527 silly get 'cf-ray': '59764fa31fae648b-FRA', +527 silly get age: '5629', +527 silly get 'cache-control': 'public, max-age=300', +527 silly get etag: '"07ebb6c11e7a8b0a67aabb93f8b3aa09"', +527 silly get 'last-modified': 'Sun, 27 May 2018 13:04:47 GMT', +527 silly get vary: 'Accept-Encoding', +527 silly get 'cf-cache-status': 'HIT', +527 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +527 silly get server: 'cloudflare', +527 silly get 'cf-request-id': '02ddd019ef0000648bda3f9200000001' } ] +528 verbose etag https://registry.npmjs.org/prr from cache +529 verbose get saving prr to /home/christine/.npm/registry.npmjs.org/prr/.cache.json +530 silly resolveWithNewModule prr@1.0.1 checking installable status +531 silly cache add args [ 'prr@~1.0.1', null ] +532 verbose cache add spec prr@~1.0.1 +533 silly cache add parsed spec Result { +533 silly cache add raw: 'prr@~1.0.1', +533 silly cache add scope: null, +533 silly cache add name: 'prr', +533 silly cache add rawSpec: '~1.0.1', +533 silly cache add spec: '>=1.0.1 <1.1.0', +533 silly cache add type: 'range' } +534 silly addNamed prr@>=1.0.1 <1.1.0 +535 verbose addNamed ">=1.0.1 <1.1.0" is a valid semver range for prr +536 silly addNameRange { name: 'prr', range: '>=1.0.1 <1.1.0', hasData: false } +537 silly mapToRegistry name prr +538 silly mapToRegistry using default registry +539 silly mapToRegistry registry https://registry.npmjs.org/ +540 silly mapToRegistry uri https://registry.npmjs.org/prr +541 verbose addNameRange registry:https://registry.npmjs.org/prr not in flight; fetching +542 verbose get https://registry.npmjs.org/prr not expired, no request +543 silly addNameRange number 2 { name: 'prr', range: '>=1.0.1 <1.1.0', hasData: true } +544 silly addNameRange versions [ 'prr', [ '0.0.0', '1.0.0', '1.0.1' ] ] +545 silly addNamed prr@1.0.1 +546 verbose addNamed "1.0.1" is a plain semver version for prr +547 silly cache afterAdd prr@1.0.1 +548 verbose afterAdd /home/christine/.npm/prr/1.0.1/package/package.json not in flight; writing +549 verbose afterAdd /home/christine/.npm/prr/1.0.1/package/package.json written +550 silly fetchNamedPackageData minimist +551 silly mapToRegistry name minimist +552 silly mapToRegistry using default registry +553 silly mapToRegistry registry https://registry.npmjs.org/ +554 silly mapToRegistry uri https://registry.npmjs.org/minimist +555 verbose request uri https://registry.npmjs.org/minimist +556 verbose request no auth needed +557 info attempt registry request try #1 at 13:48:57 +558 verbose etag W/"81c2eaf8bba19c1bd6131ba9e932902f" +559 verbose lastModified Sun, 11 Aug 2019 09:03:19 GMT +560 http request GET https://registry.npmjs.org/minimist +561 http 200 https://registry.npmjs.org/minimist +562 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +562 verbose headers 'content-type': 'application/json', +562 verbose headers 'transfer-encoding': 'chunked', +562 verbose headers connection: 'keep-alive', +562 verbose headers 'set-cookie': +562 verbose headers [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +562 verbose headers 'cf-ray': '59764fa35d5205fd-FRA', +562 verbose headers age: '5653', +562 verbose headers 'cache-control': 'public, max-age=300', +562 verbose headers etag: 'W/"ab6c93df45eeb8867cab5ea4f62b4b74"', +562 verbose headers 'last-modified': 'Thu, 12 Mar 2020 22:16:24 GMT', +562 verbose headers vary: 'accept-encoding, accept', +562 verbose headers 'cf-cache-status': 'HIT', +562 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +562 verbose headers server: 'cloudflare', +562 verbose headers 'content-encoding': 'gzip', +562 verbose headers 'cf-request-id': '02ddd01a16000005fd8da2d200000001' } +563 silly get cb [ 200, +563 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +563 silly get 'content-type': 'application/json', +563 silly get 'transfer-encoding': 'chunked', +563 silly get connection: 'keep-alive', +563 silly get 'set-cookie': +563 silly get [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +563 silly get 'cf-ray': '59764fa35d5205fd-FRA', +563 silly get age: '5653', +563 silly get 'cache-control': 'public, max-age=300', +563 silly get etag: 'W/"ab6c93df45eeb8867cab5ea4f62b4b74"', +563 silly get 'last-modified': 'Thu, 12 Mar 2020 22:16:24 GMT', +563 silly get vary: 'accept-encoding, accept', +563 silly get 'cf-cache-status': 'HIT', +563 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +563 silly get server: 'cloudflare', +563 silly get 'content-encoding': 'gzip', +563 silly get 'cf-request-id': '02ddd01a16000005fd8da2d200000001' } ] +564 verbose get saving minimist to /home/christine/.npm/registry.npmjs.org/minimist/.cache.json +565 silly resolveWithNewModule minimist@1.2.5 checking installable status +566 silly cache add args [ 'minimist@^1.2.5', null ] +567 verbose cache add spec minimist@^1.2.5 +568 silly cache add parsed spec Result { +568 silly cache add raw: 'minimist@^1.2.5', +568 silly cache add scope: null, +568 silly cache add name: 'minimist', +568 silly cache add rawSpec: '^1.2.5', +568 silly cache add spec: '>=1.2.5 <2.0.0', +568 silly cache add type: 'range' } +569 silly addNamed minimist@>=1.2.5 <2.0.0 +570 verbose addNamed ">=1.2.5 <2.0.0" is a valid semver range for minimist +571 silly addNameRange { name: 'minimist', range: '>=1.2.5 <2.0.0', hasData: false } +572 silly mapToRegistry name minimist +573 silly mapToRegistry using default registry +574 silly mapToRegistry registry https://registry.npmjs.org/ +575 silly mapToRegistry uri https://registry.npmjs.org/minimist +576 verbose addNameRange registry:https://registry.npmjs.org/minimist not in flight; fetching +577 verbose get https://registry.npmjs.org/minimist not expired, no request +578 silly addNameRange number 2 { name: 'minimist', range: '>=1.2.5 <2.0.0', hasData: true } +579 silly addNameRange versions [ 'minimist', +579 silly addNameRange [ '0.0.0', +579 silly addNameRange '0.0.1', +579 silly addNameRange '0.0.2', +579 silly addNameRange '0.0.3', +579 silly addNameRange '0.0.4', +579 silly addNameRange '0.0.5', +579 silly addNameRange '0.0.6', +579 silly addNameRange '0.0.7', +579 silly addNameRange '0.0.8', +579 silly addNameRange '0.0.9', +579 silly addNameRange '0.0.10', +579 silly addNameRange '0.1.0', +579 silly addNameRange '0.2.0', +579 silly addNameRange '1.0.0', +579 silly addNameRange '1.1.0', +579 silly addNameRange '1.1.1', +579 silly addNameRange '1.1.2', +579 silly addNameRange '1.1.3', +579 silly addNameRange '1.2.0', +579 silly addNameRange '1.2.1', +579 silly addNameRange '1.2.2', +579 silly addNameRange '1.2.3', +579 silly addNameRange '1.2.4', +579 silly addNameRange '0.2.1', +579 silly addNameRange '1.2.5' ] ] +580 silly addNamed minimist@1.2.5 +581 verbose addNamed "1.2.5" is a plain semver version for minimist +582 silly mapToRegistry name minimist +583 silly mapToRegistry using default registry +584 silly mapToRegistry registry https://registry.npmjs.org/ +585 silly mapToRegistry uri https://registry.npmjs.org/minimist +586 verbose addRemoteTarball https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz not in flight; adding +587 verbose addRemoteTarball [ 'https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz', +587 verbose addRemoteTarball '67d66014b66a6a8aaa0c083c5fd58df4e4e97602' ] +588 info retry fetch attempt 1 at 13:48:57 +589 info attempt registry request try #1 at 13:48:57 +590 http fetch GET https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz +591 http fetch 200 https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz +592 silly fetchAndShaCheck shasum 67d66014b66a6a8aaa0c083c5fd58df4e4e97602 +593 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/minimist/-/minimist-1.2.5.tgz not in flight; adding +594 verbose addTmpTarball already have metadata; skipping unpack for minimist@1.2.5 +595 silly cache afterAdd minimist@1.2.5 +596 verbose afterAdd /home/christine/.npm/minimist/1.2.5/package/package.json not in flight; writing +597 verbose afterAdd /home/christine/.npm/minimist/1.2.5/package/package.json written +598 silly fetchNamedPackageData asap +599 silly mapToRegistry name asap +600 silly mapToRegistry using default registry +601 silly mapToRegistry registry https://registry.npmjs.org/ +602 silly mapToRegistry uri https://registry.npmjs.org/asap +603 verbose request uri https://registry.npmjs.org/asap +604 verbose request no auth needed +605 info attempt registry request try #1 at 13:48:57 +606 http request GET https://registry.npmjs.org/asap +607 http 200 https://registry.npmjs.org/asap +608 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +608 verbose headers 'content-type': 'application/json; charset=UTF-8', +608 verbose headers 'transfer-encoding': 'chunked', +608 verbose headers connection: 'keep-alive', +608 verbose headers 'set-cookie': +608 verbose headers [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +608 verbose headers 'cf-ray': '59764fa3da5bdfc7-FRA', +608 verbose headers age: '5027', +608 verbose headers 'cache-control': 'public, max-age=300', +608 verbose headers etag: 'W/"b9309e9e7d929bcdb698cfa401f3696f"', +608 verbose headers 'last-modified': 'Sat, 26 May 2018 17:25:23 GMT', +608 verbose headers vary: 'accept-encoding, accept', +608 verbose headers 'cf-cache-status': 'HIT', +608 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +608 verbose headers server: 'cloudflare', +608 verbose headers 'content-encoding': 'gzip', +608 verbose headers 'cf-request-id': '02ddd01a6b0000dfc72a89b200000001' } +609 silly get cb [ 200, +609 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +609 silly get 'content-type': 'application/json; charset=UTF-8', +609 silly get 'transfer-encoding': 'chunked', +609 silly get connection: 'keep-alive', +609 silly get 'set-cookie': +609 silly get [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +609 silly get 'cf-ray': '59764fa3da5bdfc7-FRA', +609 silly get age: '5027', +609 silly get 'cache-control': 'public, max-age=300', +609 silly get etag: 'W/"b9309e9e7d929bcdb698cfa401f3696f"', +609 silly get 'last-modified': 'Sat, 26 May 2018 17:25:23 GMT', +609 silly get vary: 'accept-encoding, accept', +609 silly get 'cf-cache-status': 'HIT', +609 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +609 silly get server: 'cloudflare', +609 silly get 'content-encoding': 'gzip', +609 silly get 'cf-request-id': '02ddd01a6b0000dfc72a89b200000001' } ] +610 verbose get saving asap to /home/christine/.npm/registry.npmjs.org/asap/.cache.json +611 silly resolveWithNewModule asap@2.0.6 checking installable status +612 silly cache add args [ 'asap@~2.0.3', null ] +613 verbose cache add spec asap@~2.0.3 +614 silly cache add parsed spec Result { +614 silly cache add raw: 'asap@~2.0.3', +614 silly cache add scope: null, +614 silly cache add name: 'asap', +614 silly cache add rawSpec: '~2.0.3', +614 silly cache add spec: '>=2.0.3 <2.1.0', +614 silly cache add type: 'range' } +615 silly addNamed asap@>=2.0.3 <2.1.0 +616 verbose addNamed ">=2.0.3 <2.1.0" is a valid semver range for asap +617 silly addNameRange { name: 'asap', range: '>=2.0.3 <2.1.0', hasData: false } +618 silly mapToRegistry name asap +619 silly mapToRegistry using default registry +620 silly mapToRegistry registry https://registry.npmjs.org/ +621 silly mapToRegistry uri https://registry.npmjs.org/asap +622 verbose addNameRange registry:https://registry.npmjs.org/asap not in flight; fetching +623 verbose get https://registry.npmjs.org/asap not expired, no request +624 silly addNameRange number 2 { name: 'asap', range: '>=2.0.3 <2.1.0', hasData: true } +625 silly addNameRange versions [ 'asap', +625 silly addNameRange [ '0.0.0', +625 silly addNameRange '1.0.0', +625 silly addNameRange '2.0.0', +625 silly addNameRange '2.0.1', +625 silly addNameRange '2.0.2', +625 silly addNameRange '2.0.3', +625 silly addNameRange '2.0.4', +625 silly addNameRange '2.0.5', +625 silly addNameRange '2.0.6' ] ] +626 silly addNamed asap@2.0.6 +627 verbose addNamed "2.0.6" is a plain semver version for asap +628 silly mapToRegistry name asap +629 silly mapToRegistry using default registry +630 silly mapToRegistry registry https://registry.npmjs.org/ +631 silly mapToRegistry uri https://registry.npmjs.org/asap +632 verbose addRemoteTarball https://registry.npmjs.org/asap/-/asap-2.0.6.tgz not in flight; adding +633 verbose addRemoteTarball [ 'https://registry.npmjs.org/asap/-/asap-2.0.6.tgz', +633 verbose addRemoteTarball 'e50347611d7e690943208bbdafebcbc2fb866d46' ] +634 info retry fetch attempt 1 at 13:48:57 +635 info attempt registry request try #1 at 13:48:57 +636 http fetch GET https://registry.npmjs.org/asap/-/asap-2.0.6.tgz +637 http fetch 200 https://registry.npmjs.org/asap/-/asap-2.0.6.tgz +638 silly fetchAndShaCheck shasum e50347611d7e690943208bbdafebcbc2fb866d46 +639 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/asap/-/asap-2.0.6.tgz not in flight; adding +640 verbose addTmpTarball already have metadata; skipping unpack for asap@2.0.6 +641 silly cache afterAdd asap@2.0.6 +642 verbose afterAdd /home/christine/.npm/asap/2.0.6/package/package.json not in flight; writing +643 verbose afterAdd /home/christine/.npm/asap/2.0.6/package/package.json written +644 silly fetchNamedPackageData aws-sign2 +645 silly mapToRegistry name aws-sign2 +646 silly mapToRegistry using default registry +647 silly mapToRegistry registry https://registry.npmjs.org/ +648 silly mapToRegistry uri https://registry.npmjs.org/aws-sign2 +649 silly fetchNamedPackageData aws4 +650 silly mapToRegistry name aws4 +651 silly mapToRegistry using default registry +652 silly mapToRegistry registry https://registry.npmjs.org/ +653 silly mapToRegistry uri https://registry.npmjs.org/aws4 +654 silly fetchNamedPackageData caseless +655 silly mapToRegistry name caseless +656 silly mapToRegistry using default registry +657 silly mapToRegistry registry https://registry.npmjs.org/ +658 silly mapToRegistry uri https://registry.npmjs.org/caseless +659 silly fetchNamedPackageData combined-stream +660 silly mapToRegistry name combined-stream +661 silly mapToRegistry using default registry +662 silly mapToRegistry registry https://registry.npmjs.org/ +663 silly mapToRegistry uri https://registry.npmjs.org/combined-stream +664 silly fetchNamedPackageData extend +665 silly mapToRegistry name extend +666 silly mapToRegistry using default registry +667 silly mapToRegistry registry https://registry.npmjs.org/ +668 silly mapToRegistry uri https://registry.npmjs.org/extend +669 silly fetchNamedPackageData forever-agent +670 silly mapToRegistry name forever-agent +671 silly mapToRegistry using default registry +672 silly mapToRegistry registry https://registry.npmjs.org/ +673 silly mapToRegistry uri https://registry.npmjs.org/forever-agent +674 silly fetchNamedPackageData form-data +675 silly mapToRegistry name form-data +676 silly mapToRegistry using default registry +677 silly mapToRegistry registry https://registry.npmjs.org/ +678 silly mapToRegistry uri https://registry.npmjs.org/form-data +679 silly fetchNamedPackageData har-validator +680 silly mapToRegistry name har-validator +681 silly mapToRegistry using default registry +682 silly mapToRegistry registry https://registry.npmjs.org/ +683 silly mapToRegistry uri https://registry.npmjs.org/har-validator +684 silly fetchNamedPackageData http-signature +685 silly mapToRegistry name http-signature +686 silly mapToRegistry using default registry +687 silly mapToRegistry registry https://registry.npmjs.org/ +688 silly mapToRegistry uri https://registry.npmjs.org/http-signature +689 silly fetchNamedPackageData is-typedarray +690 silly mapToRegistry name is-typedarray +691 silly mapToRegistry using default registry +692 silly mapToRegistry registry https://registry.npmjs.org/ +693 silly mapToRegistry uri https://registry.npmjs.org/is-typedarray +694 silly fetchNamedPackageData isstream +695 silly mapToRegistry name isstream +696 silly mapToRegistry using default registry +697 silly mapToRegistry registry https://registry.npmjs.org/ +698 silly mapToRegistry uri https://registry.npmjs.org/isstream +699 silly fetchNamedPackageData json-stringify-safe +700 silly mapToRegistry name json-stringify-safe +701 silly mapToRegistry using default registry +702 silly mapToRegistry registry https://registry.npmjs.org/ +703 silly mapToRegistry uri https://registry.npmjs.org/json-stringify-safe +704 silly fetchNamedPackageData mime-types +705 silly mapToRegistry name mime-types +706 silly mapToRegistry using default registry +707 silly mapToRegistry registry https://registry.npmjs.org/ +708 silly mapToRegistry uri https://registry.npmjs.org/mime-types +709 silly fetchNamedPackageData oauth-sign +710 silly mapToRegistry name oauth-sign +711 silly mapToRegistry using default registry +712 silly mapToRegistry registry https://registry.npmjs.org/ +713 silly mapToRegistry uri https://registry.npmjs.org/oauth-sign +714 silly fetchNamedPackageData performance-now +715 silly mapToRegistry name performance-now +716 silly mapToRegistry using default registry +717 silly mapToRegistry registry https://registry.npmjs.org/ +718 silly mapToRegistry uri https://registry.npmjs.org/performance-now +719 silly fetchNamedPackageData qs +720 silly mapToRegistry name qs +721 silly mapToRegistry using default registry +722 silly mapToRegistry registry https://registry.npmjs.org/ +723 silly mapToRegistry uri https://registry.npmjs.org/qs +724 silly fetchNamedPackageData safe-buffer +725 silly mapToRegistry name safe-buffer +726 silly mapToRegistry using default registry +727 silly mapToRegistry registry https://registry.npmjs.org/ +728 silly mapToRegistry uri https://registry.npmjs.org/safe-buffer +729 silly fetchNamedPackageData tough-cookie +730 silly mapToRegistry name tough-cookie +731 silly mapToRegistry using default registry +732 silly mapToRegistry registry https://registry.npmjs.org/ +733 silly mapToRegistry uri https://registry.npmjs.org/tough-cookie +734 silly fetchNamedPackageData tunnel-agent +735 silly mapToRegistry name tunnel-agent +736 silly mapToRegistry using default registry +737 silly mapToRegistry registry https://registry.npmjs.org/ +738 silly mapToRegistry uri https://registry.npmjs.org/tunnel-agent +739 silly fetchNamedPackageData uuid +740 silly mapToRegistry name uuid +741 silly mapToRegistry using default registry +742 silly mapToRegistry registry https://registry.npmjs.org/ +743 silly mapToRegistry uri https://registry.npmjs.org/uuid +744 verbose request uri https://registry.npmjs.org/aws-sign2 +745 verbose request no auth needed +746 info attempt registry request try #1 at 13:48:57 +747 verbose etag W/"7bf763d2cccd0806178c5c3e43895950" +748 verbose lastModified Sat, 26 May 2018 17:48:52 GMT +749 http request GET https://registry.npmjs.org/aws-sign2 +750 verbose request uri https://registry.npmjs.org/aws4 +751 verbose request no auth needed +752 info attempt registry request try #1 at 13:48:57 +753 verbose etag W/"95c9834de9b7164b9a063970ba631035" +754 verbose lastModified Mon, 13 Jan 2020 23:25:51 GMT +755 http request GET https://registry.npmjs.org/aws4 +756 verbose request uri https://registry.npmjs.org/caseless +757 verbose request no auth needed +758 info attempt registry request try #1 at 13:48:57 +759 verbose etag W/"37dc2c2e48fd048da76bb52a97386418" +760 verbose lastModified Sat, 26 May 2018 19:27:25 GMT +761 http request GET https://registry.npmjs.org/caseless +762 verbose request uri https://registry.npmjs.org/combined-stream +763 verbose request no auth needed +764 info attempt registry request try #1 at 13:48:57 +765 verbose etag W/"01d038e7b9fcfd5e5654a7d7003bfe74" +766 verbose lastModified Sun, 12 May 2019 17:49:50 GMT +767 http request GET https://registry.npmjs.org/combined-stream +768 verbose request uri https://registry.npmjs.org/extend +769 verbose request no auth needed +770 info attempt registry request try #1 at 13:48:57 +771 verbose etag W/"924fa39abddd399eb964b1aa611da651" +772 verbose lastModified Thu, 19 Jul 2018 22:12:47 GMT +773 http request GET https://registry.npmjs.org/extend +774 verbose request uri https://registry.npmjs.org/forever-agent +775 verbose request no auth needed +776 info attempt registry request try #1 at 13:48:57 +777 verbose etag W/"9e6ef96089dd23304c2ea7d2fb731c9c" +778 verbose lastModified Sun, 27 May 2018 01:06:13 GMT +779 http request GET https://registry.npmjs.org/forever-agent +780 verbose request uri https://registry.npmjs.org/form-data +781 verbose request no auth needed +782 info attempt registry request try #1 at 13:48:57 +783 verbose etag W/"5e211bf0fabf58f7b2a855c8b4ce28a4" +784 verbose lastModified Wed, 06 Nov 2019 07:57:03 GMT +785 http request GET https://registry.npmjs.org/form-data +786 verbose request uri https://registry.npmjs.org/har-validator +787 verbose request no auth needed +788 info attempt registry request try #1 at 13:48:57 +789 verbose etag W/"a261ac4614f4e022065b83613ee209ab" +790 verbose lastModified Fri, 04 Jan 2019 02:36:17 GMT +791 http request GET https://registry.npmjs.org/har-validator +792 verbose request uri https://registry.npmjs.org/http-signature +793 verbose request no auth needed +794 info attempt registry request try #1 at 13:48:57 +795 verbose etag W/"a22cccd7d585d00e5e26fe5111bee01d" +796 verbose lastModified Fri, 13 Dec 2019 16:32:29 GMT +797 http request GET https://registry.npmjs.org/http-signature +798 verbose request uri https://registry.npmjs.org/is-typedarray +799 verbose request no auth needed +800 info attempt registry request try #1 at 13:48:57 +801 verbose etag W/"e7b88219ebe721b877b678c51795c9c5" +802 verbose lastModified Sun, 27 May 2018 04:59:55 GMT +803 http request GET https://registry.npmjs.org/is-typedarray +804 verbose request uri https://registry.npmjs.org/isstream +805 verbose request no auth needed +806 info attempt registry request try #1 at 13:48:57 +807 verbose etag W/"9dc7f37e087df077683bf238c847ad45" +808 verbose lastModified Sun, 27 May 2018 05:02:31 GMT +809 http request GET https://registry.npmjs.org/isstream +810 verbose request uri https://registry.npmjs.org/json-stringify-safe +811 verbose request no auth needed +812 info attempt registry request try #1 at 13:48:57 +813 verbose etag W/"7f39a9aafcaefe8efbf43a9f2e56c4eb" +814 verbose lastModified Sun, 27 May 2018 05:41:03 GMT +815 http request GET https://registry.npmjs.org/json-stringify-safe +816 verbose request uri https://registry.npmjs.org/oauth-sign +817 verbose request no auth needed +818 info attempt registry request try #1 at 13:48:57 +819 verbose etag W/"3032c1efe9ec61d748d027a1da2bab61" +820 verbose lastModified Thu, 02 Aug 2018 18:04:02 GMT +821 http request GET https://registry.npmjs.org/oauth-sign +822 verbose request uri https://registry.npmjs.org/mime-types +823 verbose request no auth needed +824 info attempt registry request try #1 at 13:48:57 +825 verbose etag W/"ace0d1d2bbdfabcc2f0fdf5db2297cb9" +826 verbose lastModified Mon, 06 Jan 2020 03:47:58 GMT +827 http request GET https://registry.npmjs.org/mime-types +828 verbose request uri https://registry.npmjs.org/performance-now +829 verbose request no auth needed +830 info attempt registry request try #1 at 13:48:57 +831 verbose etag W/"5f12ad497b3e39323dcdde75c34f5767" +832 verbose lastModified Sun, 27 May 2018 12:05:53 GMT +833 http request GET https://registry.npmjs.org/performance-now +834 verbose request uri https://registry.npmjs.org/qs +835 verbose request no auth needed +836 info attempt registry request try #1 at 13:48:57 +837 verbose etag W/"ccaef4541845c31c4cc05bcf8dd00ce6" +838 verbose lastModified Fri, 08 Nov 2019 06:46:39 GMT +839 http request GET https://registry.npmjs.org/qs +840 verbose request uri https://registry.npmjs.org/tough-cookie +841 verbose request no auth needed +842 info attempt registry request try #1 at 13:48:57 +843 verbose etag W/"f1d93d88b646bb4c354f8c481852a1b7" +844 verbose lastModified Tue, 05 Feb 2019 03:09:49 GMT +845 http request GET https://registry.npmjs.org/tough-cookie +846 verbose request uri https://registry.npmjs.org/tunnel-agent +847 verbose request no auth needed +848 info attempt registry request try #1 at 13:48:57 +849 verbose etag W/"03911fc1f433b33bccf8a4a2a5de2375" +850 verbose lastModified Sun, 27 May 2018 20:02:57 GMT +851 http request GET https://registry.npmjs.org/tunnel-agent +852 verbose request uri https://registry.npmjs.org/safe-buffer +853 verbose request no auth needed +854 info attempt registry request try #1 at 13:48:57 +855 verbose etag W/"00b820fed08175238fc3473b2b3e0278" +856 verbose lastModified Fri, 05 Jul 2019 18:04:37 GMT +857 http request GET https://registry.npmjs.org/safe-buffer +858 verbose request uri https://registry.npmjs.org/uuid +859 verbose request no auth needed +860 info attempt registry request try #1 at 13:48:57 +861 verbose etag W/"e1230e67a078f82b785335adbba5abd3" +862 verbose lastModified Thu, 16 Jan 2020 21:05:42 GMT +863 http request GET https://registry.npmjs.org/uuid +864 http 304 https://registry.npmjs.org/aws-sign2 +865 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +865 verbose headers connection: 'keep-alive', +865 verbose headers 'set-cookie': +865 verbose headers [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +865 verbose headers 'cf-ray': '59764fa49cf4d6e9-FRA', +865 verbose headers age: '5657', +865 verbose headers 'cache-control': 'public, max-age=300', +865 verbose headers etag: '"7bf763d2cccd0806178c5c3e43895950"', +865 verbose headers 'last-modified': 'Sat, 26 May 2018 17:48:52 GMT', +865 verbose headers vary: 'Accept-Encoding', +865 verbose headers 'cf-cache-status': 'HIT', +865 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +865 verbose headers server: 'cloudflare', +865 verbose headers 'cf-request-id': '02ddd01ae00000d6e975b28200000001' } +866 silly get cb [ 304, +866 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +866 silly get connection: 'keep-alive', +866 silly get 'set-cookie': +866 silly get [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +866 silly get 'cf-ray': '59764fa49cf4d6e9-FRA', +866 silly get age: '5657', +866 silly get 'cache-control': 'public, max-age=300', +866 silly get etag: '"7bf763d2cccd0806178c5c3e43895950"', +866 silly get 'last-modified': 'Sat, 26 May 2018 17:48:52 GMT', +866 silly get vary: 'Accept-Encoding', +866 silly get 'cf-cache-status': 'HIT', +866 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +866 silly get server: 'cloudflare', +866 silly get 'cf-request-id': '02ddd01ae00000d6e975b28200000001' } ] +867 verbose etag https://registry.npmjs.org/aws-sign2 from cache +868 verbose get saving aws-sign2 to /home/christine/.npm/registry.npmjs.org/aws-sign2/.cache.json +869 silly resolveWithNewModule aws-sign2@0.7.0 checking installable status +870 silly cache add args [ 'aws-sign2@~0.7.0', null ] +871 verbose cache add spec aws-sign2@~0.7.0 +872 silly cache add parsed spec Result { +872 silly cache add raw: 'aws-sign2@~0.7.0', +872 silly cache add scope: null, +872 silly cache add name: 'aws-sign2', +872 silly cache add rawSpec: '~0.7.0', +872 silly cache add spec: '>=0.7.0 <0.8.0', +872 silly cache add type: 'range' } +873 silly addNamed aws-sign2@>=0.7.0 <0.8.0 +874 verbose addNamed ">=0.7.0 <0.8.0" is a valid semver range for aws-sign2 +875 silly addNameRange { name: 'aws-sign2', range: '>=0.7.0 <0.8.0', hasData: false } +876 silly mapToRegistry name aws-sign2 +877 silly mapToRegistry using default registry +878 silly mapToRegistry registry https://registry.npmjs.org/ +879 silly mapToRegistry uri https://registry.npmjs.org/aws-sign2 +880 verbose addNameRange registry:https://registry.npmjs.org/aws-sign2 not in flight; fetching +881 verbose get https://registry.npmjs.org/aws-sign2 not expired, no request +882 silly addNameRange number 2 { name: 'aws-sign2', range: '>=0.7.0 <0.8.0', hasData: true } +883 silly addNameRange versions [ 'aws-sign2', [ '0.4.0', '0.5.0', '0.6.0', '0.7.0' ] ] +884 silly addNamed aws-sign2@0.7.0 +885 verbose addNamed "0.7.0" is a plain semver version for aws-sign2 +886 silly cache afterAdd aws-sign2@0.7.0 +887 verbose afterAdd /home/christine/.npm/aws-sign2/0.7.0/package/package.json not in flight; writing +888 verbose afterAdd /home/christine/.npm/aws-sign2/0.7.0/package/package.json written +889 http 304 https://registry.npmjs.org/form-data +890 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +890 verbose headers connection: 'keep-alive', +890 verbose headers 'set-cookie': +890 verbose headers [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +890 verbose headers 'cf-ray': '59764fa4ba1305fd-FRA', +890 verbose headers age: '5355', +890 verbose headers 'cache-control': 'public, max-age=300', +890 verbose headers etag: '"5e211bf0fabf58f7b2a855c8b4ce28a4"', +890 verbose headers 'last-modified': 'Wed, 06 Nov 2019 07:57:03 GMT', +890 verbose headers vary: 'Accept-Encoding', +890 verbose headers 'cf-cache-status': 'HIT', +890 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +890 verbose headers server: 'cloudflare', +890 verbose headers 'cf-request-id': '02ddd01af4000005fd8da55200000001' } +891 silly get cb [ 304, +891 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +891 silly get connection: 'keep-alive', +891 silly get 'set-cookie': +891 silly get [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +891 silly get 'cf-ray': '59764fa4ba1305fd-FRA', +891 silly get age: '5355', +891 silly get 'cache-control': 'public, max-age=300', +891 silly get etag: '"5e211bf0fabf58f7b2a855c8b4ce28a4"', +891 silly get 'last-modified': 'Wed, 06 Nov 2019 07:57:03 GMT', +891 silly get vary: 'Accept-Encoding', +891 silly get 'cf-cache-status': 'HIT', +891 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +891 silly get server: 'cloudflare', +891 silly get 'cf-request-id': '02ddd01af4000005fd8da55200000001' } ] +892 verbose etag https://registry.npmjs.org/form-data from cache +893 verbose get saving form-data to /home/christine/.npm/registry.npmjs.org/form-data/.cache.json +894 http 304 https://registry.npmjs.org/har-validator +895 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +895 verbose headers connection: 'keep-alive', +895 verbose headers 'set-cookie': +895 verbose headers [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +895 verbose headers 'cf-ray': '59764fa4b9a6c272-FRA', +895 verbose headers age: '5655', +895 verbose headers 'cache-control': 'public, max-age=300', +895 verbose headers etag: '"a261ac4614f4e022065b83613ee209ab"', +895 verbose headers 'last-modified': 'Fri, 04 Jan 2019 02:36:17 GMT', +895 verbose headers vary: 'Accept-Encoding', +895 verbose headers 'cf-cache-status': 'HIT', +895 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +895 verbose headers server: 'cloudflare', +895 verbose headers 'cf-request-id': '02ddd01af40000c272388b2200000001' } +896 silly get cb [ 304, +896 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +896 silly get connection: 'keep-alive', +896 silly get 'set-cookie': +896 silly get [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +896 silly get 'cf-ray': '59764fa4b9a6c272-FRA', +896 silly get age: '5655', +896 silly get 'cache-control': 'public, max-age=300', +896 silly get etag: '"a261ac4614f4e022065b83613ee209ab"', +896 silly get 'last-modified': 'Fri, 04 Jan 2019 02:36:17 GMT', +896 silly get vary: 'Accept-Encoding', +896 silly get 'cf-cache-status': 'HIT', +896 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +896 silly get server: 'cloudflare', +896 silly get 'cf-request-id': '02ddd01af40000c272388b2200000001' } ] +897 verbose etag https://registry.npmjs.org/har-validator from cache +898 verbose get saving har-validator to /home/christine/.npm/registry.npmjs.org/har-validator/.cache.json +899 http 304 https://registry.npmjs.org/caseless +900 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +900 verbose headers connection: 'keep-alive', +900 verbose headers 'set-cookie': +900 verbose headers [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +900 verbose headers 'cf-ray': '59764fa4b9de325c-FRA', +900 verbose headers age: '5655', +900 verbose headers 'cache-control': 'public, max-age=300', +900 verbose headers etag: '"37dc2c2e48fd048da76bb52a97386418"', +900 verbose headers 'last-modified': 'Sat, 26 May 2018 19:27:25 GMT', +900 verbose headers vary: 'Accept-Encoding', +900 verbose headers 'cf-cache-status': 'HIT', +900 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +900 verbose headers server: 'cloudflare', +900 verbose headers 'cf-request-id': '02ddd01af40000325c4c810200000001' } +901 silly get cb [ 304, +901 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +901 silly get connection: 'keep-alive', +901 silly get 'set-cookie': +901 silly get [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +901 silly get 'cf-ray': '59764fa4b9de325c-FRA', +901 silly get age: '5655', +901 silly get 'cache-control': 'public, max-age=300', +901 silly get etag: '"37dc2c2e48fd048da76bb52a97386418"', +901 silly get 'last-modified': 'Sat, 26 May 2018 19:27:25 GMT', +901 silly get vary: 'Accept-Encoding', +901 silly get 'cf-cache-status': 'HIT', +901 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +901 silly get server: 'cloudflare', +901 silly get 'cf-request-id': '02ddd01af40000325c4c810200000001' } ] +902 verbose etag https://registry.npmjs.org/caseless from cache +903 verbose get saving caseless to /home/christine/.npm/registry.npmjs.org/caseless/.cache.json +904 http 304 https://registry.npmjs.org/is-typedarray +905 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +905 verbose headers connection: 'keep-alive', +905 verbose headers 'set-cookie': +905 verbose headers [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +905 verbose headers 'cf-ray': '59764fa4bc4a6347-FRA', +905 verbose headers age: '5655', +905 verbose headers 'cache-control': 'public, max-age=300', +905 verbose headers etag: '"e7b88219ebe721b877b678c51795c9c5"', +905 verbose headers 'last-modified': 'Sun, 27 May 2018 04:59:55 GMT', +905 verbose headers vary: 'Accept-Encoding', +905 verbose headers 'cf-cache-status': 'HIT', +905 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +905 verbose headers server: 'cloudflare', +905 verbose headers 'cf-request-id': '02ddd01af400006347e88ad200000001' } +906 silly get cb [ 304, +906 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +906 silly get connection: 'keep-alive', +906 silly get 'set-cookie': +906 silly get [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +906 silly get 'cf-ray': '59764fa4bc4a6347-FRA', +906 silly get age: '5655', +906 silly get 'cache-control': 'public, max-age=300', +906 silly get etag: '"e7b88219ebe721b877b678c51795c9c5"', +906 silly get 'last-modified': 'Sun, 27 May 2018 04:59:55 GMT', +906 silly get vary: 'Accept-Encoding', +906 silly get 'cf-cache-status': 'HIT', +906 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +906 silly get server: 'cloudflare', +906 silly get 'cf-request-id': '02ddd01af400006347e88ad200000001' } ] +907 verbose etag https://registry.npmjs.org/is-typedarray from cache +908 verbose get saving is-typedarray to /home/christine/.npm/registry.npmjs.org/is-typedarray/.cache.json +909 http 304 https://registry.npmjs.org/forever-agent +910 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +910 verbose headers connection: 'keep-alive', +910 verbose headers 'set-cookie': +910 verbose headers [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +910 verbose headers 'cf-ray': '59764fa4b87c648b-FRA', +910 verbose headers age: '5655', +910 verbose headers 'cache-control': 'public, max-age=300', +910 verbose headers etag: '"9e6ef96089dd23304c2ea7d2fb731c9c"', +910 verbose headers 'last-modified': 'Sun, 27 May 2018 01:06:13 GMT', +910 verbose headers vary: 'Accept-Encoding', +910 verbose headers 'cf-cache-status': 'HIT', +910 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +910 verbose headers server: 'cloudflare', +910 verbose headers 'cf-request-id': '02ddd01af40000648bda003200000001' } +911 silly get cb [ 304, +911 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +911 silly get connection: 'keep-alive', +911 silly get 'set-cookie': +911 silly get [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +911 silly get 'cf-ray': '59764fa4b87c648b-FRA', +911 silly get age: '5655', +911 silly get 'cache-control': 'public, max-age=300', +911 silly get etag: '"9e6ef96089dd23304c2ea7d2fb731c9c"', +911 silly get 'last-modified': 'Sun, 27 May 2018 01:06:13 GMT', +911 silly get vary: 'Accept-Encoding', +911 silly get 'cf-cache-status': 'HIT', +911 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +911 silly get server: 'cloudflare', +911 silly get 'cf-request-id': '02ddd01af40000648bda003200000001' } ] +912 verbose etag https://registry.npmjs.org/forever-agent from cache +913 verbose get saving forever-agent to /home/christine/.npm/registry.npmjs.org/forever-agent/.cache.json +914 silly resolveWithNewModule form-data@2.3.3 checking installable status +915 silly cache add args [ 'form-data@~2.3.2', null ] +916 verbose cache add spec form-data@~2.3.2 +917 silly cache add parsed spec Result { +917 silly cache add raw: 'form-data@~2.3.2', +917 silly cache add scope: null, +917 silly cache add name: 'form-data', +917 silly cache add rawSpec: '~2.3.2', +917 silly cache add spec: '>=2.3.2 <2.4.0', +917 silly cache add type: 'range' } +918 silly addNamed form-data@>=2.3.2 <2.4.0 +919 verbose addNamed ">=2.3.2 <2.4.0" is a valid semver range for form-data +920 silly addNameRange { name: 'form-data', range: '>=2.3.2 <2.4.0', hasData: false } +921 silly mapToRegistry name form-data +922 silly mapToRegistry using default registry +923 silly mapToRegistry registry https://registry.npmjs.org/ +924 silly mapToRegistry uri https://registry.npmjs.org/form-data +925 verbose addNameRange registry:https://registry.npmjs.org/form-data not in flight; fetching +926 silly resolveWithNewModule har-validator@5.1.3 checking installable status +927 silly cache add args [ 'har-validator@~5.1.3', null ] +928 verbose cache add spec har-validator@~5.1.3 +929 silly cache add parsed spec Result { +929 silly cache add raw: 'har-validator@~5.1.3', +929 silly cache add scope: null, +929 silly cache add name: 'har-validator', +929 silly cache add rawSpec: '~5.1.3', +929 silly cache add spec: '>=5.1.3 <5.2.0', +929 silly cache add type: 'range' } +930 silly addNamed har-validator@>=5.1.3 <5.2.0 +931 verbose addNamed ">=5.1.3 <5.2.0" is a valid semver range for har-validator +932 silly addNameRange { name: 'har-validator', +932 silly addNameRange range: '>=5.1.3 <5.2.0', +932 silly addNameRange hasData: false } +933 silly mapToRegistry name har-validator +934 silly mapToRegistry using default registry +935 silly mapToRegistry registry https://registry.npmjs.org/ +936 silly mapToRegistry uri https://registry.npmjs.org/har-validator +937 verbose addNameRange registry:https://registry.npmjs.org/har-validator not in flight; fetching +938 http 304 https://registry.npmjs.org/extend +939 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +939 verbose headers connection: 'keep-alive', +939 verbose headers 'set-cookie': +939 verbose headers [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +939 verbose headers 'cf-ray': '59764fa4bc61175a-FRA', +939 verbose headers age: '5656', +939 verbose headers 'cache-control': 'public, max-age=300', +939 verbose headers etag: '"924fa39abddd399eb964b1aa611da651"', +939 verbose headers 'last-modified': 'Thu, 19 Jul 2018 22:12:47 GMT', +939 verbose headers vary: 'Accept-Encoding', +939 verbose headers 'cf-cache-status': 'HIT', +939 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +939 verbose headers server: 'cloudflare', +939 verbose headers 'cf-request-id': '02ddd01af40000175a1e1fb200000001' } +940 silly get cb [ 304, +940 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +940 silly get connection: 'keep-alive', +940 silly get 'set-cookie': +940 silly get [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +940 silly get 'cf-ray': '59764fa4bc61175a-FRA', +940 silly get age: '5656', +940 silly get 'cache-control': 'public, max-age=300', +940 silly get etag: '"924fa39abddd399eb964b1aa611da651"', +940 silly get 'last-modified': 'Thu, 19 Jul 2018 22:12:47 GMT', +940 silly get vary: 'Accept-Encoding', +940 silly get 'cf-cache-status': 'HIT', +940 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +940 silly get server: 'cloudflare', +940 silly get 'cf-request-id': '02ddd01af40000175a1e1fb200000001' } ] +941 verbose etag https://registry.npmjs.org/extend from cache +942 verbose get saving extend to /home/christine/.npm/registry.npmjs.org/extend/.cache.json +943 http 304 https://registry.npmjs.org/combined-stream +944 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +944 verbose headers connection: 'keep-alive', +944 verbose headers 'set-cookie': +944 verbose headers [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +944 verbose headers 'cf-ray': '59764fa4b963d715-FRA', +944 verbose headers age: '5355', +944 verbose headers 'cache-control': 'public, max-age=300', +944 verbose headers etag: '"01d038e7b9fcfd5e5654a7d7003bfe74"', +944 verbose headers 'last-modified': 'Sun, 12 May 2019 17:49:50 GMT', +944 verbose headers vary: 'Accept-Encoding', +944 verbose headers 'cf-cache-status': 'HIT', +944 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +944 verbose headers server: 'cloudflare', +944 verbose headers 'cf-request-id': '02ddd01af40000d715c11f3200000001' } +945 silly get cb [ 304, +945 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +945 silly get connection: 'keep-alive', +945 silly get 'set-cookie': +945 silly get [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +945 silly get 'cf-ray': '59764fa4b963d715-FRA', +945 silly get age: '5355', +945 silly get 'cache-control': 'public, max-age=300', +945 silly get etag: '"01d038e7b9fcfd5e5654a7d7003bfe74"', +945 silly get 'last-modified': 'Sun, 12 May 2019 17:49:50 GMT', +945 silly get vary: 'Accept-Encoding', +945 silly get 'cf-cache-status': 'HIT', +945 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +945 silly get server: 'cloudflare', +945 silly get 'cf-request-id': '02ddd01af40000d715c11f3200000001' } ] +946 verbose etag https://registry.npmjs.org/combined-stream from cache +947 verbose get saving combined-stream to /home/christine/.npm/registry.npmjs.org/combined-stream/.cache.json +948 silly resolveWithNewModule is-typedarray@1.0.0 checking installable status +949 silly cache add args [ 'is-typedarray@~1.0.0', null ] +950 verbose cache add spec is-typedarray@~1.0.0 +951 silly cache add parsed spec Result { +951 silly cache add raw: 'is-typedarray@~1.0.0', +951 silly cache add scope: null, +951 silly cache add name: 'is-typedarray', +951 silly cache add rawSpec: '~1.0.0', +951 silly cache add spec: '>=1.0.0 <1.1.0', +951 silly cache add type: 'range' } +952 silly addNamed is-typedarray@>=1.0.0 <1.1.0 +953 verbose addNamed ">=1.0.0 <1.1.0" is a valid semver range for is-typedarray +954 silly addNameRange { name: 'is-typedarray', +954 silly addNameRange range: '>=1.0.0 <1.1.0', +954 silly addNameRange hasData: false } +955 silly mapToRegistry name is-typedarray +956 silly mapToRegistry using default registry +957 silly mapToRegistry registry https://registry.npmjs.org/ +958 silly mapToRegistry uri https://registry.npmjs.org/is-typedarray +959 verbose addNameRange registry:https://registry.npmjs.org/is-typedarray not in flight; fetching +960 silly resolveWithNewModule caseless@0.12.0 checking installable status +961 silly cache add args [ 'caseless@~0.12.0', null ] +962 verbose cache add spec caseless@~0.12.0 +963 silly cache add parsed spec Result { +963 silly cache add raw: 'caseless@~0.12.0', +963 silly cache add scope: null, +963 silly cache add name: 'caseless', +963 silly cache add rawSpec: '~0.12.0', +963 silly cache add spec: '>=0.12.0 <0.13.0', +963 silly cache add type: 'range' } +964 silly addNamed caseless@>=0.12.0 <0.13.0 +965 verbose addNamed ">=0.12.0 <0.13.0" is a valid semver range for caseless +966 silly addNameRange { name: 'caseless', range: '>=0.12.0 <0.13.0', hasData: false } +967 silly mapToRegistry name caseless +968 silly mapToRegistry using default registry +969 silly mapToRegistry registry https://registry.npmjs.org/ +970 silly mapToRegistry uri https://registry.npmjs.org/caseless +971 verbose addNameRange registry:https://registry.npmjs.org/caseless not in flight; fetching +972 http 304 https://registry.npmjs.org/aws4 +973 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +973 verbose headers connection: 'keep-alive', +973 verbose headers 'set-cookie': +973 verbose headers [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +973 verbose headers 'cf-ray': '59764fa4bb7d6413-FRA', +973 verbose headers age: '5655', +973 verbose headers 'cache-control': 'public, max-age=300', +973 verbose headers etag: '"95c9834de9b7164b9a063970ba631035"', +973 verbose headers 'last-modified': 'Mon, 13 Jan 2020 23:25:51 GMT', +973 verbose headers vary: 'Accept-Encoding', +973 verbose headers 'cf-cache-status': 'HIT', +973 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +973 verbose headers server: 'cloudflare', +973 verbose headers 'cf-request-id': '02ddd01af4000064135f8e3200000001' } +974 silly get cb [ 304, +974 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +974 silly get connection: 'keep-alive', +974 silly get 'set-cookie': +974 silly get [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +974 silly get 'cf-ray': '59764fa4bb7d6413-FRA', +974 silly get age: '5655', +974 silly get 'cache-control': 'public, max-age=300', +974 silly get etag: '"95c9834de9b7164b9a063970ba631035"', +974 silly get 'last-modified': 'Mon, 13 Jan 2020 23:25:51 GMT', +974 silly get vary: 'Accept-Encoding', +974 silly get 'cf-cache-status': 'HIT', +974 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +974 silly get server: 'cloudflare', +974 silly get 'cf-request-id': '02ddd01af4000064135f8e3200000001' } ] +975 verbose etag https://registry.npmjs.org/aws4 from cache +976 verbose get saving aws4 to /home/christine/.npm/registry.npmjs.org/aws4/.cache.json +977 silly resolveWithNewModule forever-agent@0.6.1 checking installable status +978 silly cache add args [ 'forever-agent@~0.6.1', null ] +979 verbose cache add spec forever-agent@~0.6.1 +980 silly cache add parsed spec Result { +980 silly cache add raw: 'forever-agent@~0.6.1', +980 silly cache add scope: null, +980 silly cache add name: 'forever-agent', +980 silly cache add rawSpec: '~0.6.1', +980 silly cache add spec: '>=0.6.1 <0.7.0', +980 silly cache add type: 'range' } +981 silly addNamed forever-agent@>=0.6.1 <0.7.0 +982 verbose addNamed ">=0.6.1 <0.7.0" is a valid semver range for forever-agent +983 silly addNameRange { name: 'forever-agent', +983 silly addNameRange range: '>=0.6.1 <0.7.0', +983 silly addNameRange hasData: false } +984 silly mapToRegistry name forever-agent +985 silly mapToRegistry using default registry +986 silly mapToRegistry registry https://registry.npmjs.org/ +987 silly mapToRegistry uri https://registry.npmjs.org/forever-agent +988 verbose addNameRange registry:https://registry.npmjs.org/forever-agent not in flight; fetching +989 verbose get https://registry.npmjs.org/form-data not expired, no request +990 silly addNameRange number 2 { name: 'form-data', range: '>=2.3.2 <2.4.0', hasData: true } +991 silly addNameRange versions [ 'form-data', +991 silly addNameRange [ '0.0.0', +991 silly addNameRange '0.0.2', +991 silly addNameRange '0.0.3', +991 silly addNameRange '0.0.4', +991 silly addNameRange '0.0.5', +991 silly addNameRange '0.0.6', +991 silly addNameRange '0.0.7', +991 silly addNameRange '0.0.8', +991 silly addNameRange '0.0.9', +991 silly addNameRange '0.0.10', +991 silly addNameRange '0.1.0', +991 silly addNameRange '0.1.1', +991 silly addNameRange '0.1.2', +991 silly addNameRange '0.1.3', +991 silly addNameRange '0.1.4', +991 silly addNameRange '0.2.0', +991 silly addNameRange '1.0.0-rc1', +991 silly addNameRange '1.0.0-rc2', +991 silly addNameRange '1.0.0-rc3', +991 silly addNameRange '1.0.0-rc4', +991 silly addNameRange '1.0.0', +991 silly addNameRange '1.0.1', +991 silly addNameRange '2.0.0', +991 silly addNameRange '2.1.0', +991 silly addNameRange '2.1.1', +991 silly addNameRange '2.1.2', +991 silly addNameRange '2.1.4', +991 silly addNameRange '2.2.0', +991 silly addNameRange '2.3.1', +991 silly addNameRange '2.3.2-rc1', +991 silly addNameRange '2.3.2', +991 silly addNameRange '2.3.3', +991 silly addNameRange '2.4.0', +991 silly addNameRange '2.5.0', +991 silly addNameRange '2.5.1', +991 silly addNameRange '3.0.0' ] ] +992 silly addNamed form-data@2.3.3 +993 verbose addNamed "2.3.3" is a plain semver version for form-data +994 http 200 https://registry.npmjs.org/http-signature +995 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +995 verbose headers 'content-type': 'application/json', +995 verbose headers 'transfer-encoding': 'chunked', +995 verbose headers connection: 'keep-alive', +995 verbose headers 'set-cookie': +995 verbose headers [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +995 verbose headers 'cf-ray': '59764fa4bcfedfc7-FRA', +995 verbose headers age: '5657', +995 verbose headers 'cache-control': 'public, max-age=300', +995 verbose headers etag: 'W/"3b46cb4c3a2db9af415ea171ef07cebe"', +995 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:40 GMT', +995 verbose headers vary: 'accept-encoding, accept', +995 verbose headers 'cf-cache-status': 'HIT', +995 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +995 verbose headers server: 'cloudflare', +995 verbose headers 'content-encoding': 'gzip', +995 verbose headers 'cf-request-id': '02ddd01af40000dfc72a8a0200000001' } +996 silly get cb [ 200, +996 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +996 silly get 'content-type': 'application/json', +996 silly get 'transfer-encoding': 'chunked', +996 silly get connection: 'keep-alive', +996 silly get 'set-cookie': +996 silly get [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +996 silly get 'cf-ray': '59764fa4bcfedfc7-FRA', +996 silly get age: '5657', +996 silly get 'cache-control': 'public, max-age=300', +996 silly get etag: 'W/"3b46cb4c3a2db9af415ea171ef07cebe"', +996 silly get 'last-modified': 'Wed, 06 May 2020 14:47:40 GMT', +996 silly get vary: 'accept-encoding, accept', +996 silly get 'cf-cache-status': 'HIT', +996 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +996 silly get server: 'cloudflare', +996 silly get 'content-encoding': 'gzip', +996 silly get 'cf-request-id': '02ddd01af40000dfc72a8a0200000001' } ] +997 verbose get saving http-signature to /home/christine/.npm/registry.npmjs.org/http-signature/.cache.json +998 verbose get https://registry.npmjs.org/har-validator not expired, no request +999 silly addNameRange number 2 { name: 'har-validator', range: '>=5.1.3 <5.2.0', hasData: true } +1000 silly addNameRange versions [ 'har-validator', +1000 silly addNameRange [ '1.0.0', +1000 silly addNameRange '1.0.1', +1000 silly addNameRange '1.0.2', +1000 silly addNameRange '1.1.0', +1000 silly addNameRange '1.1.1', +1000 silly addNameRange '1.1.2', +1000 silly addNameRange '1.1.3', +1000 silly addNameRange '1.2.0', +1000 silly addNameRange '1.3.0', +1000 silly addNameRange '1.3.1', +1000 silly addNameRange '1.4.0', +1000 silly addNameRange '1.5.0', +1000 silly addNameRange '1.5.1', +1000 silly addNameRange '1.6.0', +1000 silly addNameRange '1.6.1', +1000 silly addNameRange '1.7.0', +1000 silly addNameRange '1.7.1', +1000 silly addNameRange '1.8.0', +1000 silly addNameRange '2.0.0', +1000 silly addNameRange '2.0.1', +1000 silly addNameRange '2.0.2', +1000 silly addNameRange '2.0.3', +1000 silly addNameRange '2.0.4', +1000 silly addNameRange '2.0.5', +1000 silly addNameRange '2.0.6', +1000 silly addNameRange '2.1.0', +1000 silly addNameRange '2.1.1', +1000 silly addNameRange '2.1.2', +1000 silly addNameRange '2.1.3', +1000 silly addNameRange '3.0.0', +1000 silly addNameRange '3.1.0', +1000 silly addNameRange '3.2.0', +1000 silly addNameRange '3.3.0', +1000 silly addNameRange '3.3.1', +1000 silly addNameRange '3.4.0', +1000 silly addNameRange '4.0.0', +1000 silly addNameRange '4.0.1', +1000 silly addNameRange '4.0.2', +1000 silly addNameRange '4.0.3', +1000 silly addNameRange '4.0.4', +1000 silly addNameRange '4.1.0', +1000 silly addNameRange '4.1.1', +1000 silly addNameRange '4.1.2', +1000 silly addNameRange '4.2.0', +1000 silly addNameRange '4.2.1', +1000 silly addNameRange '5.0.0', +1000 silly addNameRange '5.0.1', +1000 silly addNameRange '5.0.2', +1000 silly addNameRange '5.0.3', +1000 silly addNameRange '5.1.0', +1000 silly addNameRange '5.1.3' ] ] +1001 silly addNamed har-validator@5.1.3 +1002 verbose addNamed "5.1.3" is a plain semver version for har-validator +1003 verbose get https://registry.npmjs.org/is-typedarray not expired, no request +1004 silly addNameRange number 2 { name: 'is-typedarray', range: '>=1.0.0 <1.1.0', hasData: true } +1005 silly addNameRange versions [ 'is-typedarray', [ '0.0.0', '1.0.0' ] ] +1006 silly addNamed is-typedarray@1.0.0 +1007 verbose addNamed "1.0.0" is a plain semver version for is-typedarray +1008 verbose get https://registry.npmjs.org/caseless not expired, no request +1009 silly addNameRange number 2 { name: 'caseless', range: '>=0.12.0 <0.13.0', hasData: true } +1010 silly addNameRange versions [ 'caseless', +1010 silly addNameRange [ '0.1.0', +1010 silly addNameRange '0.2.0', +1010 silly addNameRange '0.3.0', +1010 silly addNameRange '0.4.0', +1010 silly addNameRange '0.5.0', +1010 silly addNameRange '0.6.0', +1010 silly addNameRange '0.7.0', +1010 silly addNameRange '0.8.0', +1010 silly addNameRange '0.9.0', +1010 silly addNameRange '0.10.0', +1010 silly addNameRange '0.11.0', +1010 silly addNameRange '0.12.0' ] ] +1011 silly addNamed caseless@0.12.0 +1012 verbose addNamed "0.12.0" is a plain semver version for caseless +1013 verbose get https://registry.npmjs.org/forever-agent not expired, no request +1014 silly addNameRange number 2 { name: 'forever-agent', range: '>=0.6.1 <0.7.0', hasData: true } +1015 silly addNameRange versions [ 'forever-agent', +1015 silly addNameRange [ '0.2.0', '0.3.0', '0.4.0', '0.5.0', '0.5.2', '0.6.0', '0.6.1' ] ] +1016 silly addNamed forever-agent@0.6.1 +1017 verbose addNamed "0.6.1" is a plain semver version for forever-agent +1018 silly resolveWithNewModule combined-stream@1.0.8 checking installable status +1019 silly cache add args [ 'combined-stream@~1.0.6', null ] +1020 verbose cache add spec combined-stream@~1.0.6 +1021 silly cache add parsed spec Result { +1021 silly cache add raw: 'combined-stream@~1.0.6', +1021 silly cache add scope: null, +1021 silly cache add name: 'combined-stream', +1021 silly cache add rawSpec: '~1.0.6', +1021 silly cache add spec: '>=1.0.6 <1.1.0', +1021 silly cache add type: 'range' } +1022 silly addNamed combined-stream@>=1.0.6 <1.1.0 +1023 verbose addNamed ">=1.0.6 <1.1.0" is a valid semver range for combined-stream +1024 silly addNameRange { name: 'combined-stream', +1024 silly addNameRange range: '>=1.0.6 <1.1.0', +1024 silly addNameRange hasData: false } +1025 silly mapToRegistry name combined-stream +1026 silly mapToRegistry using default registry +1027 silly mapToRegistry registry https://registry.npmjs.org/ +1028 silly mapToRegistry uri https://registry.npmjs.org/combined-stream +1029 verbose addNameRange registry:https://registry.npmjs.org/combined-stream not in flight; fetching +1030 silly resolveWithNewModule extend@3.0.2 checking installable status +1031 silly cache add args [ 'extend@~3.0.2', null ] +1032 verbose cache add spec extend@~3.0.2 +1033 silly cache add parsed spec Result { +1033 silly cache add raw: 'extend@~3.0.2', +1033 silly cache add scope: null, +1033 silly cache add name: 'extend', +1033 silly cache add rawSpec: '~3.0.2', +1033 silly cache add spec: '>=3.0.2 <3.1.0', +1033 silly cache add type: 'range' } +1034 silly addNamed extend@>=3.0.2 <3.1.0 +1035 verbose addNamed ">=3.0.2 <3.1.0" is a valid semver range for extend +1036 silly addNameRange { name: 'extend', range: '>=3.0.2 <3.1.0', hasData: false } +1037 silly mapToRegistry name extend +1038 silly mapToRegistry using default registry +1039 silly mapToRegistry registry https://registry.npmjs.org/ +1040 silly mapToRegistry uri https://registry.npmjs.org/extend +1041 verbose addNameRange registry:https://registry.npmjs.org/extend not in flight; fetching +1042 silly cache afterAdd form-data@2.3.3 +1043 verbose afterAdd /home/christine/.npm/form-data/2.3.3/package/package.json not in flight; writing +1044 silly resolveWithNewModule aws4@1.9.1 checking installable status +1045 silly cache add args [ 'aws4@^1.8.0', null ] +1046 verbose cache add spec aws4@^1.8.0 +1047 silly cache add parsed spec Result { +1047 silly cache add raw: 'aws4@^1.8.0', +1047 silly cache add scope: null, +1047 silly cache add name: 'aws4', +1047 silly cache add rawSpec: '^1.8.0', +1047 silly cache add spec: '>=1.8.0 <2.0.0', +1047 silly cache add type: 'range' } +1048 silly addNamed aws4@>=1.8.0 <2.0.0 +1049 verbose addNamed ">=1.8.0 <2.0.0" is a valid semver range for aws4 +1050 silly addNameRange { name: 'aws4', range: '>=1.8.0 <2.0.0', hasData: false } +1051 silly mapToRegistry name aws4 +1052 silly mapToRegistry using default registry +1053 silly mapToRegistry registry https://registry.npmjs.org/ +1054 silly mapToRegistry uri https://registry.npmjs.org/aws4 +1055 verbose addNameRange registry:https://registry.npmjs.org/aws4 not in flight; fetching +1056 silly resolveWithNewModule http-signature@1.2.0 checking installable status +1057 silly cache add args [ 'http-signature@~1.2.0', null ] +1058 verbose cache add spec http-signature@~1.2.0 +1059 silly cache add parsed spec Result { +1059 silly cache add raw: 'http-signature@~1.2.0', +1059 silly cache add scope: null, +1059 silly cache add name: 'http-signature', +1059 silly cache add rawSpec: '~1.2.0', +1059 silly cache add spec: '>=1.2.0 <1.3.0', +1059 silly cache add type: 'range' } +1060 silly addNamed http-signature@>=1.2.0 <1.3.0 +1061 verbose addNamed ">=1.2.0 <1.3.0" is a valid semver range for http-signature +1062 silly addNameRange { name: 'http-signature', +1062 silly addNameRange range: '>=1.2.0 <1.3.0', +1062 silly addNameRange hasData: false } +1063 silly mapToRegistry name http-signature +1064 silly mapToRegistry using default registry +1065 silly mapToRegistry registry https://registry.npmjs.org/ +1066 silly mapToRegistry uri https://registry.npmjs.org/http-signature +1067 verbose addNameRange registry:https://registry.npmjs.org/http-signature not in flight; fetching +1068 silly cache afterAdd har-validator@5.1.3 +1069 verbose afterAdd /home/christine/.npm/har-validator/5.1.3/package/package.json not in flight; writing +1070 verbose get https://registry.npmjs.org/extend not expired, no request +1071 silly addNameRange number 2 { name: 'extend', range: '>=3.0.2 <3.1.0', hasData: true } +1072 silly addNameRange versions [ 'extend', +1072 silly addNameRange [ '1.0.0', +1072 silly addNameRange '1.1.0', +1072 silly addNameRange '1.1.1', +1072 silly addNameRange '1.1.3', +1072 silly addNameRange '1.2.0', +1072 silly addNameRange '1.2.1', +1072 silly addNameRange '1.3.0', +1072 silly addNameRange '2.0.0', +1072 silly addNameRange '2.0.1', +1072 silly addNameRange '3.0.0', +1072 silly addNameRange '3.0.1', +1072 silly addNameRange '3.0.2', +1072 silly addNameRange '2.0.2' ] ] +1073 silly addNamed extend@3.0.2 +1074 verbose addNamed "3.0.2" is a plain semver version for extend +1075 verbose get https://registry.npmjs.org/combined-stream not expired, no request +1076 silly addNameRange number 2 { name: 'combined-stream', +1076 silly addNameRange range: '>=1.0.6 <1.1.0', +1076 silly addNameRange hasData: true } +1077 silly addNameRange versions [ 'combined-stream', +1077 silly addNameRange [ '0.0.0', +1077 silly addNameRange '0.0.1', +1077 silly addNameRange '0.0.2', +1077 silly addNameRange '0.0.3', +1077 silly addNameRange '0.0.4', +1077 silly addNameRange '0.0.5', +1077 silly addNameRange '0.0.7', +1077 silly addNameRange '1.0.0', +1077 silly addNameRange '1.0.1', +1077 silly addNameRange '1.0.2', +1077 silly addNameRange '1.0.3', +1077 silly addNameRange '1.0.4', +1077 silly addNameRange '1.0.5', +1077 silly addNameRange '1.0.6-rc1', +1077 silly addNameRange '1.0.6', +1077 silly addNameRange '1.0.7', +1077 silly addNameRange '1.0.8' ] ] +1078 silly addNamed combined-stream@1.0.8 +1079 verbose addNamed "1.0.8" is a plain semver version for combined-stream +1080 silly cache afterAdd is-typedarray@1.0.0 +1081 verbose afterAdd /home/christine/.npm/is-typedarray/1.0.0/package/package.json not in flight; writing +1082 silly cache afterAdd caseless@0.12.0 +1083 verbose afterAdd /home/christine/.npm/caseless/0.12.0/package/package.json not in flight; writing +1084 silly cache afterAdd forever-agent@0.6.1 +1085 verbose afterAdd /home/christine/.npm/forever-agent/0.6.1/package/package.json not in flight; writing +1086 verbose get https://registry.npmjs.org/aws4 not expired, no request +1087 silly addNameRange number 2 { name: 'aws4', range: '>=1.8.0 <2.0.0', hasData: true } +1088 silly addNameRange versions [ 'aws4', +1088 silly addNameRange [ '0.0.1', +1088 silly addNameRange '0.1.0', +1088 silly addNameRange '0.1.1', +1088 silly addNameRange '0.1.2', +1088 silly addNameRange '0.1.3', +1088 silly addNameRange '0.1.4', +1088 silly addNameRange '0.1.5', +1088 silly addNameRange '0.1.6', +1088 silly addNameRange '0.1.7', +1088 silly addNameRange '0.1.8', +1088 silly addNameRange '0.1.9', +1088 silly addNameRange '0.1.10', +1088 silly addNameRange '0.1.12', +1088 silly addNameRange '0.2.0', +1088 silly addNameRange '0.2.1', +1088 silly addNameRange '0.2.2', +1088 silly addNameRange '0.2.3', +1088 silly addNameRange '0.3.0', +1088 silly addNameRange '0.4.0', +1088 silly addNameRange '0.4.1', +1088 silly addNameRange '0.4.2', +1088 silly addNameRange '0.5.0', +1088 silly addNameRange '0.5.1', +1088 silly addNameRange '1.0.0', +1088 silly addNameRange '1.0.1', +1088 silly addNameRange '1.0.2', +1088 silly addNameRange '1.0.3', +1088 silly addNameRange '1.0.4', +1088 silly addNameRange '1.1.0', +1088 silly addNameRange '1.2.0', +1088 silly addNameRange '1.2.1', +1088 silly addNameRange '1.3.1', +1088 silly addNameRange '1.3.2', +1088 silly addNameRange '1.4.0', +1088 silly addNameRange '1.4.1', +1088 silly addNameRange '1.5.0', +1088 silly addNameRange '1.6.0', +1088 silly addNameRange '1.7.0', +1088 silly addNameRange '1.8.0', +1088 silly addNameRange '1.9.0', +1088 silly addNameRange '1.9.1' ] ] +1089 silly addNamed aws4@1.9.1 +1090 verbose addNamed "1.9.1" is a plain semver version for aws4 +1091 verbose afterAdd /home/christine/.npm/form-data/2.3.3/package/package.json written +1092 verbose get https://registry.npmjs.org/http-signature not expired, no request +1093 silly addNameRange number 2 { name: 'http-signature', +1093 silly addNameRange range: '>=1.2.0 <1.3.0', +1093 silly addNameRange hasData: true } +1094 silly addNameRange versions [ 'http-signature', +1094 silly addNameRange [ '0.9.0', +1094 silly addNameRange '0.9.2', +1094 silly addNameRange '0.9.3', +1094 silly addNameRange '0.9.4', +1094 silly addNameRange '0.9.5', +1094 silly addNameRange '0.9.6', +1094 silly addNameRange '0.9.7', +1094 silly addNameRange '0.9.8', +1094 silly addNameRange '0.9.9', +1094 silly addNameRange '0.9.10', +1094 silly addNameRange '0.9.11', +1094 silly addNameRange '0.10.0', +1094 silly addNameRange '0.10.1', +1094 silly addNameRange '0.11.0', +1094 silly addNameRange '1.0.0', +1094 silly addNameRange '1.0.1', +1094 silly addNameRange '1.0.2', +1094 silly addNameRange '1.1.0', +1094 silly addNameRange '1.1.1', +1094 silly addNameRange '1.2.0', +1094 silly addNameRange '1.3.0', +1094 silly addNameRange '1.3.1', +1094 silly addNameRange '1.3.2', +1094 silly addNameRange '1.3.3', +1094 silly addNameRange '1.3.4' ] ] +1095 silly addNamed http-signature@1.2.0 +1096 verbose addNamed "1.2.0" is a plain semver version for http-signature +1097 verbose afterAdd /home/christine/.npm/har-validator/5.1.3/package/package.json written +1098 http 304 https://registry.npmjs.org/isstream +1099 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1099 verbose headers connection: 'keep-alive', +1099 verbose headers 'set-cookie': +1099 verbose headers [ '__cfduid=daf4947ff118e7cd8a36c058a538ff6131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1099 verbose headers 'cf-ray': '59764fa4fe4d05bb-FRA', +1099 verbose headers age: '5355', +1099 verbose headers 'cache-control': 'public, max-age=300', +1099 verbose headers etag: '"9dc7f37e087df077683bf238c847ad45"', +1099 verbose headers 'last-modified': 'Sun, 27 May 2018 05:02:31 GMT', +1099 verbose headers vary: 'Accept-Encoding', +1099 verbose headers 'cf-cache-status': 'HIT', +1099 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1099 verbose headers server: 'cloudflare', +1099 verbose headers 'cf-request-id': '02ddd01b1f000005bb0ca62200000001' } +1100 silly get cb [ 304, +1100 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1100 silly get connection: 'keep-alive', +1100 silly get 'set-cookie': +1100 silly get [ '__cfduid=daf4947ff118e7cd8a36c058a538ff6131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1100 silly get 'cf-ray': '59764fa4fe4d05bb-FRA', +1100 silly get age: '5355', +1100 silly get 'cache-control': 'public, max-age=300', +1100 silly get etag: '"9dc7f37e087df077683bf238c847ad45"', +1100 silly get 'last-modified': 'Sun, 27 May 2018 05:02:31 GMT', +1100 silly get vary: 'Accept-Encoding', +1100 silly get 'cf-cache-status': 'HIT', +1100 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1100 silly get server: 'cloudflare', +1100 silly get 'cf-request-id': '02ddd01b1f000005bb0ca62200000001' } ] +1101 verbose etag https://registry.npmjs.org/isstream from cache +1102 verbose get saving isstream to /home/christine/.npm/registry.npmjs.org/isstream/.cache.json +1103 verbose afterAdd /home/christine/.npm/is-typedarray/1.0.0/package/package.json written +1104 silly cache afterAdd combined-stream@1.0.8 +1105 verbose afterAdd /home/christine/.npm/combined-stream/1.0.8/package/package.json not in flight; writing +1106 verbose afterAdd /home/christine/.npm/caseless/0.12.0/package/package.json written +1107 verbose afterAdd /home/christine/.npm/forever-agent/0.6.1/package/package.json written +1108 silly cache afterAdd extend@3.0.2 +1109 verbose afterAdd /home/christine/.npm/extend/3.0.2/package/package.json not in flight; writing +1110 silly cache afterAdd aws4@1.9.1 +1111 verbose afterAdd /home/christine/.npm/aws4/1.9.1/package/package.json not in flight; writing +1112 http 304 https://registry.npmjs.org/json-stringify-safe +1113 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1113 verbose headers connection: 'keep-alive', +1113 verbose headers 'set-cookie': +1113 verbose headers [ '__cfduid=dd03692ace9824ebd46c46f408f2989131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1113 verbose headers 'cf-ray': '59764fa4fe54d6e1-FRA', +1113 verbose headers age: '5657', +1113 verbose headers 'cache-control': 'public, max-age=300', +1113 verbose headers etag: '"7f39a9aafcaefe8efbf43a9f2e56c4eb"', +1113 verbose headers 'last-modified': 'Sun, 27 May 2018 05:41:03 GMT', +1113 verbose headers vary: 'Accept-Encoding', +1113 verbose headers 'cf-cache-status': 'HIT', +1113 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1113 verbose headers server: 'cloudflare', +1113 verbose headers 'cf-request-id': '02ddd01b1e0000d6e132367200000001' } +1114 silly get cb [ 304, +1114 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1114 silly get connection: 'keep-alive', +1114 silly get 'set-cookie': +1114 silly get [ '__cfduid=dd03692ace9824ebd46c46f408f2989131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1114 silly get 'cf-ray': '59764fa4fe54d6e1-FRA', +1114 silly get age: '5657', +1114 silly get 'cache-control': 'public, max-age=300', +1114 silly get etag: '"7f39a9aafcaefe8efbf43a9f2e56c4eb"', +1114 silly get 'last-modified': 'Sun, 27 May 2018 05:41:03 GMT', +1114 silly get vary: 'Accept-Encoding', +1114 silly get 'cf-cache-status': 'HIT', +1114 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1114 silly get server: 'cloudflare', +1114 silly get 'cf-request-id': '02ddd01b1e0000d6e132367200000001' } ] +1115 verbose etag https://registry.npmjs.org/json-stringify-safe from cache +1116 verbose get saving json-stringify-safe to /home/christine/.npm/registry.npmjs.org/json-stringify-safe/.cache.json +1117 silly cache afterAdd http-signature@1.2.0 +1118 verbose afterAdd /home/christine/.npm/http-signature/1.2.0/package/package.json not in flight; writing +1119 verbose afterAdd /home/christine/.npm/combined-stream/1.0.8/package/package.json written +1120 verbose afterAdd /home/christine/.npm/extend/3.0.2/package/package.json written +1121 verbose afterAdd /home/christine/.npm/aws4/1.9.1/package/package.json written +1122 silly resolveWithNewModule isstream@0.1.2 checking installable status +1123 silly cache add args [ 'isstream@~0.1.2', null ] +1124 verbose cache add spec isstream@~0.1.2 +1125 silly cache add parsed spec Result { +1125 silly cache add raw: 'isstream@~0.1.2', +1125 silly cache add scope: null, +1125 silly cache add name: 'isstream', +1125 silly cache add rawSpec: '~0.1.2', +1125 silly cache add spec: '>=0.1.2 <0.2.0', +1125 silly cache add type: 'range' } +1126 silly addNamed isstream@>=0.1.2 <0.2.0 +1127 verbose addNamed ">=0.1.2 <0.2.0" is a valid semver range for isstream +1128 silly addNameRange { name: 'isstream', range: '>=0.1.2 <0.2.0', hasData: false } +1129 silly mapToRegistry name isstream +1130 silly mapToRegistry using default registry +1131 silly mapToRegistry registry https://registry.npmjs.org/ +1132 silly mapToRegistry uri https://registry.npmjs.org/isstream +1133 verbose addNameRange registry:https://registry.npmjs.org/isstream not in flight; fetching +1134 http 304 https://registry.npmjs.org/tunnel-agent +1135 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1135 verbose headers connection: 'keep-alive', +1135 verbose headers 'set-cookie': +1135 verbose headers [ '__cfduid=dd8a9957676dab4f7a1bd7377a7d9ca671590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1135 verbose headers 'cf-ray': '59764fa51970c2f9-FRA', +1135 verbose headers age: '5655', +1135 verbose headers 'cache-control': 'public, max-age=300', +1135 verbose headers etag: '"03911fc1f433b33bccf8a4a2a5de2375"', +1135 verbose headers 'last-modified': 'Sun, 27 May 2018 20:02:57 GMT', +1135 verbose headers vary: 'Accept-Encoding', +1135 verbose headers 'cf-cache-status': 'HIT', +1135 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1135 verbose headers server: 'cloudflare', +1135 verbose headers 'cf-request-id': '02ddd01b2a0000c2f926071200000001' } +1136 silly get cb [ 304, +1136 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1136 silly get connection: 'keep-alive', +1136 silly get 'set-cookie': +1136 silly get [ '__cfduid=dd8a9957676dab4f7a1bd7377a7d9ca671590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1136 silly get 'cf-ray': '59764fa51970c2f9-FRA', +1136 silly get age: '5655', +1136 silly get 'cache-control': 'public, max-age=300', +1136 silly get etag: '"03911fc1f433b33bccf8a4a2a5de2375"', +1136 silly get 'last-modified': 'Sun, 27 May 2018 20:02:57 GMT', +1136 silly get vary: 'Accept-Encoding', +1136 silly get 'cf-cache-status': 'HIT', +1136 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1136 silly get server: 'cloudflare', +1136 silly get 'cf-request-id': '02ddd01b2a0000c2f926071200000001' } ] +1137 verbose etag https://registry.npmjs.org/tunnel-agent from cache +1138 verbose get saving tunnel-agent to /home/christine/.npm/registry.npmjs.org/tunnel-agent/.cache.json +1139 verbose afterAdd /home/christine/.npm/http-signature/1.2.0/package/package.json written +1140 http 304 https://registry.npmjs.org/performance-now +1141 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1141 verbose headers connection: 'keep-alive', +1141 verbose headers 'set-cookie': +1141 verbose headers [ '__cfduid=d42ce80dcff65dca26b6883967f7411d41590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1141 verbose headers 'cf-ray': '59764fa51f721772-FRA', +1141 verbose headers age: '5657', +1141 verbose headers 'cache-control': 'public, max-age=300', +1141 verbose headers etag: '"5f12ad497b3e39323dcdde75c34f5767"', +1141 verbose headers 'last-modified': 'Sun, 27 May 2018 12:05:53 GMT', +1141 verbose headers vary: 'Accept-Encoding', +1141 verbose headers 'cf-cache-status': 'HIT', +1141 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1141 verbose headers server: 'cloudflare', +1141 verbose headers 'cf-request-id': '02ddd01b2a0000177264160200000001' } +1142 silly get cb [ 304, +1142 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1142 silly get connection: 'keep-alive', +1142 silly get 'set-cookie': +1142 silly get [ '__cfduid=d42ce80dcff65dca26b6883967f7411d41590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1142 silly get 'cf-ray': '59764fa51f721772-FRA', +1142 silly get age: '5657', +1142 silly get 'cache-control': 'public, max-age=300', +1142 silly get etag: '"5f12ad497b3e39323dcdde75c34f5767"', +1142 silly get 'last-modified': 'Sun, 27 May 2018 12:05:53 GMT', +1142 silly get vary: 'Accept-Encoding', +1142 silly get 'cf-cache-status': 'HIT', +1142 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1142 silly get server: 'cloudflare', +1142 silly get 'cf-request-id': '02ddd01b2a0000177264160200000001' } ] +1143 verbose etag https://registry.npmjs.org/performance-now from cache +1144 verbose get saving performance-now to /home/christine/.npm/registry.npmjs.org/performance-now/.cache.json +1145 silly resolveWithNewModule json-stringify-safe@5.0.1 checking installable status +1146 silly cache add args [ 'json-stringify-safe@~5.0.1', null ] +1147 verbose cache add spec json-stringify-safe@~5.0.1 +1148 silly cache add parsed spec Result { +1148 silly cache add raw: 'json-stringify-safe@~5.0.1', +1148 silly cache add scope: null, +1148 silly cache add name: 'json-stringify-safe', +1148 silly cache add rawSpec: '~5.0.1', +1148 silly cache add spec: '>=5.0.1 <5.1.0', +1148 silly cache add type: 'range' } +1149 silly addNamed json-stringify-safe@>=5.0.1 <5.1.0 +1150 verbose addNamed ">=5.0.1 <5.1.0" is a valid semver range for json-stringify-safe +1151 silly addNameRange { name: 'json-stringify-safe', +1151 silly addNameRange range: '>=5.0.1 <5.1.0', +1151 silly addNameRange hasData: false } +1152 silly mapToRegistry name json-stringify-safe +1153 silly mapToRegistry using default registry +1154 silly mapToRegistry registry https://registry.npmjs.org/ +1155 silly mapToRegistry uri https://registry.npmjs.org/json-stringify-safe +1156 verbose addNameRange registry:https://registry.npmjs.org/json-stringify-safe not in flight; fetching +1157 verbose get https://registry.npmjs.org/isstream not expired, no request +1158 silly addNameRange number 2 { name: 'isstream', range: '>=0.1.2 <0.2.0', hasData: true } +1159 silly addNameRange versions [ 'isstream', [ '0.0.0', '0.1.0', '0.1.1', '0.1.2' ] ] +1160 silly addNamed isstream@0.1.2 +1161 verbose addNamed "0.1.2" is a plain semver version for isstream +1162 http 200 https://registry.npmjs.org/safe-buffer +1163 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1163 verbose headers 'content-type': 'application/json', +1163 verbose headers 'transfer-encoding': 'chunked', +1163 verbose headers connection: 'keep-alive', +1163 verbose headers 'set-cookie': +1163 verbose headers [ '__cfduid=d242459e8d4d49451c98a98743f04b3251590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1163 verbose headers 'cf-ray': '59764fa51a7b0eab-FRA', +1163 verbose headers age: '5658', +1163 verbose headers 'cache-control': 'public, max-age=300', +1163 verbose headers etag: 'W/"7d10eeac57e4baa4c8bd0dd7caa1703c"', +1163 verbose headers 'last-modified': 'Sun, 10 May 2020 16:37:34 GMT', +1163 verbose headers vary: 'accept-encoding, accept', +1163 verbose headers 'cf-cache-status': 'HIT', +1163 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1163 verbose headers server: 'cloudflare', +1163 verbose headers 'content-encoding': 'gzip', +1163 verbose headers 'cf-request-id': '02ddd01b2a00000eabe9143200000001' } +1164 silly get cb [ 200, +1164 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1164 silly get 'content-type': 'application/json', +1164 silly get 'transfer-encoding': 'chunked', +1164 silly get connection: 'keep-alive', +1164 silly get 'set-cookie': +1164 silly get [ '__cfduid=d242459e8d4d49451c98a98743f04b3251590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1164 silly get 'cf-ray': '59764fa51a7b0eab-FRA', +1164 silly get age: '5658', +1164 silly get 'cache-control': 'public, max-age=300', +1164 silly get etag: 'W/"7d10eeac57e4baa4c8bd0dd7caa1703c"', +1164 silly get 'last-modified': 'Sun, 10 May 2020 16:37:34 GMT', +1164 silly get vary: 'accept-encoding, accept', +1164 silly get 'cf-cache-status': 'HIT', +1164 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1164 silly get server: 'cloudflare', +1164 silly get 'content-encoding': 'gzip', +1164 silly get 'cf-request-id': '02ddd01b2a00000eabe9143200000001' } ] +1165 verbose get saving safe-buffer to /home/christine/.npm/registry.npmjs.org/safe-buffer/.cache.json +1166 http 304 https://registry.npmjs.org/oauth-sign +1167 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1167 verbose headers connection: 'keep-alive', +1167 verbose headers 'set-cookie': +1167 verbose headers [ '__cfduid=d287f9144cf6663f63602865423a0b4ea1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1167 verbose headers 'cf-ray': '59764fa51ff7dfbb-FRA', +1167 verbose headers age: '5355', +1167 verbose headers 'cache-control': 'public, max-age=300', +1167 verbose headers etag: '"3032c1efe9ec61d748d027a1da2bab61"', +1167 verbose headers 'last-modified': 'Thu, 02 Aug 2018 18:04:02 GMT', +1167 verbose headers vary: 'Accept-Encoding', +1167 verbose headers 'cf-cache-status': 'HIT', +1167 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1167 verbose headers server: 'cloudflare', +1167 verbose headers 'cf-request-id': '02ddd01b2a0000dfbb5fa74200000001' } +1168 silly get cb [ 304, +1168 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1168 silly get connection: 'keep-alive', +1168 silly get 'set-cookie': +1168 silly get [ '__cfduid=d287f9144cf6663f63602865423a0b4ea1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1168 silly get 'cf-ray': '59764fa51ff7dfbb-FRA', +1168 silly get age: '5355', +1168 silly get 'cache-control': 'public, max-age=300', +1168 silly get etag: '"3032c1efe9ec61d748d027a1da2bab61"', +1168 silly get 'last-modified': 'Thu, 02 Aug 2018 18:04:02 GMT', +1168 silly get vary: 'Accept-Encoding', +1168 silly get 'cf-cache-status': 'HIT', +1168 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1168 silly get server: 'cloudflare', +1168 silly get 'cf-request-id': '02ddd01b2a0000dfbb5fa74200000001' } ] +1169 verbose etag https://registry.npmjs.org/oauth-sign from cache +1170 verbose get saving oauth-sign to /home/christine/.npm/registry.npmjs.org/oauth-sign/.cache.json +1171 verbose get https://registry.npmjs.org/json-stringify-safe not expired, no request +1172 silly addNameRange number 2 { name: 'json-stringify-safe', +1172 silly addNameRange range: '>=5.0.1 <5.1.0', +1172 silly addNameRange hasData: true } +1173 silly addNameRange versions [ 'json-stringify-safe', +1173 silly addNameRange [ '2.0.0', '3.0.0', '4.0.0', '5.0.0', '5.0.1' ] ] +1174 silly addNamed json-stringify-safe@5.0.1 +1175 verbose addNamed "5.0.1" is a plain semver version for json-stringify-safe +1176 silly resolveWithNewModule tunnel-agent@0.6.0 checking installable status +1177 silly cache add args [ 'tunnel-agent@^0.6.0', null ] +1178 verbose cache add spec tunnel-agent@^0.6.0 +1179 silly cache add parsed spec Result { +1179 silly cache add raw: 'tunnel-agent@^0.6.0', +1179 silly cache add scope: null, +1179 silly cache add name: 'tunnel-agent', +1179 silly cache add rawSpec: '^0.6.0', +1179 silly cache add spec: '>=0.6.0 <0.7.0', +1179 silly cache add type: 'range' } +1180 silly addNamed tunnel-agent@>=0.6.0 <0.7.0 +1181 verbose addNamed ">=0.6.0 <0.7.0" is a valid semver range for tunnel-agent +1182 silly addNameRange { name: 'tunnel-agent', range: '>=0.6.0 <0.7.0', hasData: false } +1183 silly mapToRegistry name tunnel-agent +1184 silly mapToRegistry using default registry +1185 silly mapToRegistry registry https://registry.npmjs.org/ +1186 silly mapToRegistry uri https://registry.npmjs.org/tunnel-agent +1187 verbose addNameRange registry:https://registry.npmjs.org/tunnel-agent not in flight; fetching +1188 silly resolveWithNewModule performance-now@2.1.0 checking installable status +1189 silly cache add args [ 'performance-now@^2.1.0', null ] +1190 verbose cache add spec performance-now@^2.1.0 +1191 silly cache add parsed spec Result { +1191 silly cache add raw: 'performance-now@^2.1.0', +1191 silly cache add scope: null, +1191 silly cache add name: 'performance-now', +1191 silly cache add rawSpec: '^2.1.0', +1191 silly cache add spec: '>=2.1.0 <3.0.0', +1191 silly cache add type: 'range' } +1192 silly addNamed performance-now@>=2.1.0 <3.0.0 +1193 verbose addNamed ">=2.1.0 <3.0.0" is a valid semver range for performance-now +1194 silly addNameRange { name: 'performance-now', +1194 silly addNameRange range: '>=2.1.0 <3.0.0', +1194 silly addNameRange hasData: false } +1195 silly mapToRegistry name performance-now +1196 silly mapToRegistry using default registry +1197 silly mapToRegistry registry https://registry.npmjs.org/ +1198 silly mapToRegistry uri https://registry.npmjs.org/performance-now +1199 verbose addNameRange registry:https://registry.npmjs.org/performance-now not in flight; fetching +1200 silly cache afterAdd isstream@0.1.2 +1201 verbose afterAdd /home/christine/.npm/isstream/0.1.2/package/package.json not in flight; writing +1202 http 200 https://registry.npmjs.org/tough-cookie +1203 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1203 verbose headers 'content-type': 'application/json', +1203 verbose headers 'transfer-encoding': 'chunked', +1203 verbose headers connection: 'keep-alive', +1203 verbose headers 'set-cookie': +1203 verbose headers [ '__cfduid=d898cd72de597ecab2d8a354f76a0072c1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1203 verbose headers 'cf-ray': '59764fa518cb05e9-FRA', +1203 verbose headers age: '5655', +1203 verbose headers 'cache-control': 'public, max-age=300', +1203 verbose headers etag: 'W/"818fa172eb6f27e219e81140db530363"', +1203 verbose headers 'last-modified': 'Thu, 19 Mar 2020 19:20:30 GMT', +1203 verbose headers vary: 'accept-encoding, accept', +1203 verbose headers 'cf-cache-status': 'HIT', +1203 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1203 verbose headers server: 'cloudflare', +1203 verbose headers 'content-encoding': 'gzip', +1203 verbose headers 'cf-request-id': '02ddd01b2a000005e903b1d200000001' } +1204 silly get cb [ 200, +1204 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1204 silly get 'content-type': 'application/json', +1204 silly get 'transfer-encoding': 'chunked', +1204 silly get connection: 'keep-alive', +1204 silly get 'set-cookie': +1204 silly get [ '__cfduid=d898cd72de597ecab2d8a354f76a0072c1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1204 silly get 'cf-ray': '59764fa518cb05e9-FRA', +1204 silly get age: '5655', +1204 silly get 'cache-control': 'public, max-age=300', +1204 silly get etag: 'W/"818fa172eb6f27e219e81140db530363"', +1204 silly get 'last-modified': 'Thu, 19 Mar 2020 19:20:30 GMT', +1204 silly get vary: 'accept-encoding, accept', +1204 silly get 'cf-cache-status': 'HIT', +1204 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1204 silly get server: 'cloudflare', +1204 silly get 'content-encoding': 'gzip', +1204 silly get 'cf-request-id': '02ddd01b2a000005e903b1d200000001' } ] +1205 verbose get saving tough-cookie to /home/christine/.npm/registry.npmjs.org/tough-cookie/.cache.json +1206 silly cache afterAdd json-stringify-safe@5.0.1 +1207 verbose afterAdd /home/christine/.npm/json-stringify-safe/5.0.1/package/package.json not in flight; writing +1208 silly resolveWithNewModule safe-buffer@5.2.1 checking installable status +1209 silly cache add args [ 'safe-buffer@^5.1.2', null ] +1210 verbose cache add spec safe-buffer@^5.1.2 +1211 silly cache add parsed spec Result { +1211 silly cache add raw: 'safe-buffer@^5.1.2', +1211 silly cache add scope: null, +1211 silly cache add name: 'safe-buffer', +1211 silly cache add rawSpec: '^5.1.2', +1211 silly cache add spec: '>=5.1.2 <6.0.0', +1211 silly cache add type: 'range' } +1212 silly addNamed safe-buffer@>=5.1.2 <6.0.0 +1213 verbose addNamed ">=5.1.2 <6.0.0" is a valid semver range for safe-buffer +1214 silly addNameRange { name: 'safe-buffer', range: '>=5.1.2 <6.0.0', hasData: false } +1215 silly mapToRegistry name safe-buffer +1216 silly mapToRegistry using default registry +1217 silly mapToRegistry registry https://registry.npmjs.org/ +1218 silly mapToRegistry uri https://registry.npmjs.org/safe-buffer +1219 verbose addNameRange registry:https://registry.npmjs.org/safe-buffer not in flight; fetching +1220 http 200 https://registry.npmjs.org/mime-types +1221 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1221 verbose headers 'content-type': 'application/json', +1221 verbose headers 'transfer-encoding': 'chunked', +1221 verbose headers connection: 'keep-alive', +1221 verbose headers 'set-cookie': +1221 verbose headers [ '__cfduid=d8091989cd66bf129670ccfa4d20cf63d1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1221 verbose headers 'cf-ray': '59764fa51e27c2ae-FRA', +1221 verbose headers age: '5656', +1221 verbose headers 'cache-control': 'public, max-age=300', +1221 verbose headers etag: 'W/"b0572cbc8ddbbb6b61205820d06deb3a"', +1221 verbose headers 'last-modified': 'Fri, 24 Apr 2020 03:36:16 GMT', +1221 verbose headers vary: 'accept-encoding, accept', +1221 verbose headers 'cf-cache-status': 'HIT', +1221 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1221 verbose headers server: 'cloudflare', +1221 verbose headers 'content-encoding': 'gzip', +1221 verbose headers 'cf-request-id': '02ddd01b2a0000c2aea0161200000001' } +1222 silly get cb [ 200, +1222 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1222 silly get 'content-type': 'application/json', +1222 silly get 'transfer-encoding': 'chunked', +1222 silly get connection: 'keep-alive', +1222 silly get 'set-cookie': +1222 silly get [ '__cfduid=d8091989cd66bf129670ccfa4d20cf63d1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1222 silly get 'cf-ray': '59764fa51e27c2ae-FRA', +1222 silly get age: '5656', +1222 silly get 'cache-control': 'public, max-age=300', +1222 silly get etag: 'W/"b0572cbc8ddbbb6b61205820d06deb3a"', +1222 silly get 'last-modified': 'Fri, 24 Apr 2020 03:36:16 GMT', +1222 silly get vary: 'accept-encoding, accept', +1222 silly get 'cf-cache-status': 'HIT', +1222 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1222 silly get server: 'cloudflare', +1222 silly get 'content-encoding': 'gzip', +1222 silly get 'cf-request-id': '02ddd01b2a0000c2aea0161200000001' } ] +1223 verbose get saving mime-types to /home/christine/.npm/registry.npmjs.org/mime-types/.cache.json +1224 verbose get https://registry.npmjs.org/tunnel-agent not expired, no request +1225 silly addNameRange number 2 { name: 'tunnel-agent', range: '>=0.6.0 <0.7.0', hasData: true } +1226 silly addNameRange versions [ 'tunnel-agent', +1226 silly addNameRange [ '0.2.0', +1226 silly addNameRange '0.3.0', +1226 silly addNameRange '0.4.0', +1226 silly addNameRange '0.4.1', +1226 silly addNameRange '0.4.2', +1226 silly addNameRange '0.4.3', +1226 silly addNameRange '0.5.0', +1226 silly addNameRange '0.6.0' ] ] +1227 silly addNamed tunnel-agent@0.6.0 +1228 verbose addNamed "0.6.0" is a plain semver version for tunnel-agent +1229 silly resolveWithNewModule oauth-sign@0.9.0 checking installable status +1230 silly cache add args [ 'oauth-sign@~0.9.0', null ] +1231 verbose cache add spec oauth-sign@~0.9.0 +1232 silly cache add parsed spec Result { +1232 silly cache add raw: 'oauth-sign@~0.9.0', +1232 silly cache add scope: null, +1232 silly cache add name: 'oauth-sign', +1232 silly cache add rawSpec: '~0.9.0', +1232 silly cache add spec: '>=0.9.0 <0.10.0', +1232 silly cache add type: 'range' } +1233 silly addNamed oauth-sign@>=0.9.0 <0.10.0 +1234 verbose addNamed ">=0.9.0 <0.10.0" is a valid semver range for oauth-sign +1235 silly addNameRange { name: 'oauth-sign', range: '>=0.9.0 <0.10.0', hasData: false } +1236 silly mapToRegistry name oauth-sign +1237 silly mapToRegistry using default registry +1238 silly mapToRegistry registry https://registry.npmjs.org/ +1239 silly mapToRegistry uri https://registry.npmjs.org/oauth-sign +1240 verbose addNameRange registry:https://registry.npmjs.org/oauth-sign not in flight; fetching +1241 verbose get https://registry.npmjs.org/performance-now not expired, no request +1242 silly addNameRange number 2 { name: 'performance-now', +1242 silly addNameRange range: '>=2.1.0 <3.0.0', +1242 silly addNameRange hasData: true } +1243 silly addNameRange versions [ 'performance-now', +1243 silly addNameRange [ '0.1.0', +1243 silly addNameRange '0.1.1', +1243 silly addNameRange '0.1.2', +1243 silly addNameRange '0.1.3', +1243 silly addNameRange '0.1.4', +1243 silly addNameRange '0.2.0', +1243 silly addNameRange '1.0.0', +1243 silly addNameRange '1.0.1', +1243 silly addNameRange '1.0.2', +1243 silly addNameRange '2.0.0', +1243 silly addNameRange '2.1.0' ] ] +1244 silly addNamed performance-now@2.1.0 +1245 verbose addNamed "2.1.0" is a plain semver version for performance-now +1246 verbose afterAdd /home/christine/.npm/isstream/0.1.2/package/package.json written +1247 http 200 https://registry.npmjs.org/uuid +1248 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1248 verbose headers 'content-type': 'application/json', +1248 verbose headers 'transfer-encoding': 'chunked', +1248 verbose headers connection: 'keep-alive', +1248 verbose headers 'set-cookie': +1248 verbose headers [ '__cfduid=d42e977fd11818895c4979b1006ea23be1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1248 verbose headers 'cf-ray': '59764fa5195d1f2d-FRA', +1248 verbose headers age: '5355', +1248 verbose headers 'cache-control': 'public, max-age=300', +1248 verbose headers etag: 'W/"3fc4e0f16b6e5d55bc0144a7f38b6e49"', +1248 verbose headers 'last-modified': 'Wed, 20 May 2020 18:52:41 GMT', +1248 verbose headers vary: 'accept-encoding, accept', +1248 verbose headers 'cf-cache-status': 'HIT', +1248 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1248 verbose headers server: 'cloudflare', +1248 verbose headers 'content-encoding': 'gzip', +1248 verbose headers 'cf-request-id': '02ddd01b2a00001f2df51ed200000001' } +1249 silly get cb [ 200, +1249 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1249 silly get 'content-type': 'application/json', +1249 silly get 'transfer-encoding': 'chunked', +1249 silly get connection: 'keep-alive', +1249 silly get 'set-cookie': +1249 silly get [ '__cfduid=d42e977fd11818895c4979b1006ea23be1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1249 silly get 'cf-ray': '59764fa5195d1f2d-FRA', +1249 silly get age: '5355', +1249 silly get 'cache-control': 'public, max-age=300', +1249 silly get etag: 'W/"3fc4e0f16b6e5d55bc0144a7f38b6e49"', +1249 silly get 'last-modified': 'Wed, 20 May 2020 18:52:41 GMT', +1249 silly get vary: 'accept-encoding, accept', +1249 silly get 'cf-cache-status': 'HIT', +1249 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1249 silly get server: 'cloudflare', +1249 silly get 'content-encoding': 'gzip', +1249 silly get 'cf-request-id': '02ddd01b2a00001f2df51ed200000001' } ] +1250 verbose get saving uuid to /home/christine/.npm/registry.npmjs.org/uuid/.cache.json +1251 verbose get https://registry.npmjs.org/safe-buffer not expired, no request +1252 silly addNameRange number 2 { name: 'safe-buffer', range: '>=5.1.2 <6.0.0', hasData: true } +1253 silly addNameRange versions [ 'safe-buffer', +1253 silly addNameRange [ '1.0.0', +1253 silly addNameRange '2.0.0', +1253 silly addNameRange '3.0.0', +1253 silly addNameRange '4.0.0', +1253 silly addNameRange '5.0.0', +1253 silly addNameRange '5.0.1', +1253 silly addNameRange '5.1.0', +1253 silly addNameRange '5.1.1', +1253 silly addNameRange '5.1.2', +1253 silly addNameRange '5.2.0', +1253 silly addNameRange '5.2.1' ] ] +1254 silly addNamed safe-buffer@5.2.1 +1255 verbose addNamed "5.2.1" is a plain semver version for safe-buffer +1256 verbose afterAdd /home/christine/.npm/json-stringify-safe/5.0.1/package/package.json written +1257 verbose get https://registry.npmjs.org/oauth-sign not expired, no request +1258 silly addNameRange number 2 { name: 'oauth-sign', range: '>=0.9.0 <0.10.0', hasData: true } +1259 silly addNameRange versions [ 'oauth-sign', +1259 silly addNameRange [ '0.2.0', +1259 silly addNameRange '0.3.0', +1259 silly addNameRange '0.4.0', +1259 silly addNameRange '0.5.0', +1259 silly addNameRange '0.6.0', +1259 silly addNameRange '0.7.0', +1259 silly addNameRange '0.8.0', +1259 silly addNameRange '0.8.1', +1259 silly addNameRange '0.8.2', +1259 silly addNameRange '0.9.0' ] ] +1260 silly addNamed oauth-sign@0.9.0 +1261 verbose addNamed "0.9.0" is a plain semver version for oauth-sign +1262 silly mapToRegistry name safe-buffer +1263 silly mapToRegistry using default registry +1264 silly mapToRegistry registry https://registry.npmjs.org/ +1265 silly mapToRegistry uri https://registry.npmjs.org/safe-buffer +1266 verbose addRemoteTarball https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz not in flight; adding +1267 verbose addRemoteTarball [ 'https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz', +1267 verbose addRemoteTarball '1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6' ] +1268 silly resolveWithNewModule tough-cookie@2.5.0 checking installable status +1269 silly cache add args [ 'tough-cookie@~2.5.0', null ] +1270 verbose cache add spec tough-cookie@~2.5.0 +1271 silly cache add parsed spec Result { +1271 silly cache add raw: 'tough-cookie@~2.5.0', +1271 silly cache add scope: null, +1271 silly cache add name: 'tough-cookie', +1271 silly cache add rawSpec: '~2.5.0', +1271 silly cache add spec: '>=2.5.0 <2.6.0', +1271 silly cache add type: 'range' } +1272 silly addNamed tough-cookie@>=2.5.0 <2.6.0 +1273 verbose addNamed ">=2.5.0 <2.6.0" is a valid semver range for tough-cookie +1274 silly addNameRange { name: 'tough-cookie', range: '>=2.5.0 <2.6.0', hasData: false } +1275 silly mapToRegistry name tough-cookie +1276 silly mapToRegistry using default registry +1277 silly mapToRegistry registry https://registry.npmjs.org/ +1278 silly mapToRegistry uri https://registry.npmjs.org/tough-cookie +1279 verbose addNameRange registry:https://registry.npmjs.org/tough-cookie not in flight; fetching +1280 silly cache afterAdd tunnel-agent@0.6.0 +1281 verbose afterAdd /home/christine/.npm/tunnel-agent/0.6.0/package/package.json not in flight; writing +1282 silly cache afterAdd performance-now@2.1.0 +1283 verbose afterAdd /home/christine/.npm/performance-now/2.1.0/package/package.json not in flight; writing +1284 silly resolveWithNewModule mime-types@2.1.27 checking installable status +1285 silly cache add args [ 'mime-types@~2.1.19', null ] +1286 verbose cache add spec mime-types@~2.1.19 +1287 silly cache add parsed spec Result { +1287 silly cache add raw: 'mime-types@~2.1.19', +1287 silly cache add scope: null, +1287 silly cache add name: 'mime-types', +1287 silly cache add rawSpec: '~2.1.19', +1287 silly cache add spec: '>=2.1.19 <2.2.0', +1287 silly cache add type: 'range' } +1288 silly addNamed mime-types@>=2.1.19 <2.2.0 +1289 verbose addNamed ">=2.1.19 <2.2.0" is a valid semver range for mime-types +1290 silly addNameRange { name: 'mime-types', range: '>=2.1.19 <2.2.0', hasData: false } +1291 silly mapToRegistry name mime-types +1292 silly mapToRegistry using default registry +1293 silly mapToRegistry registry https://registry.npmjs.org/ +1294 silly mapToRegistry uri https://registry.npmjs.org/mime-types +1295 verbose addNameRange registry:https://registry.npmjs.org/mime-types not in flight; fetching +1296 http 200 https://registry.npmjs.org/qs +1297 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1297 verbose headers 'content-type': 'application/json', +1297 verbose headers 'transfer-encoding': 'chunked', +1297 verbose headers connection: 'keep-alive', +1297 verbose headers 'set-cookie': +1297 verbose headers [ '__cfduid=dd8aaa3b832fe3de3ea175ff8604d63411590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1297 verbose headers 'cf-ray': '59764fa5183d176a-FRA', +1297 verbose headers age: '5657', +1297 verbose headers 'cache-control': 'public, max-age=300', +1297 verbose headers etag: 'W/"679aa380b84cf75f89f99363ed5f9c98"', +1297 verbose headers 'last-modified': 'Sun, 03 May 2020 21:52:54 GMT', +1297 verbose headers vary: 'accept-encoding, accept', +1297 verbose headers 'cf-cache-status': 'HIT', +1297 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1297 verbose headers server: 'cloudflare', +1297 verbose headers 'content-encoding': 'gzip', +1297 verbose headers 'cf-request-id': '02ddd01b2a0000176a65b45200000001' } +1298 silly get cb [ 200, +1298 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1298 silly get 'content-type': 'application/json', +1298 silly get 'transfer-encoding': 'chunked', +1298 silly get connection: 'keep-alive', +1298 silly get 'set-cookie': +1298 silly get [ '__cfduid=dd8aaa3b832fe3de3ea175ff8604d63411590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1298 silly get 'cf-ray': '59764fa5183d176a-FRA', +1298 silly get age: '5657', +1298 silly get 'cache-control': 'public, max-age=300', +1298 silly get etag: 'W/"679aa380b84cf75f89f99363ed5f9c98"', +1298 silly get 'last-modified': 'Sun, 03 May 2020 21:52:54 GMT', +1298 silly get vary: 'accept-encoding, accept', +1298 silly get 'cf-cache-status': 'HIT', +1298 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1298 silly get server: 'cloudflare', +1298 silly get 'content-encoding': 'gzip', +1298 silly get 'cf-request-id': '02ddd01b2a0000176a65b45200000001' } ] +1299 verbose get saving qs to /home/christine/.npm/registry.npmjs.org/qs/.cache.json +1300 info retry fetch attempt 1 at 13:48:57 +1301 info attempt registry request try #1 at 13:48:57 +1302 http fetch GET https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz +1303 verbose get https://registry.npmjs.org/tough-cookie not expired, no request +1304 silly addNameRange number 2 { name: 'tough-cookie', range: '>=2.5.0 <2.6.0', hasData: true } +1305 silly addNameRange versions [ 'tough-cookie', +1305 silly addNameRange [ '0.9.0', +1305 silly addNameRange '0.9.1', +1305 silly addNameRange '0.9.3', +1305 silly addNameRange '0.9.4', +1305 silly addNameRange '0.9.5', +1305 silly addNameRange '0.9.6', +1305 silly addNameRange '0.9.7', +1305 silly addNameRange '0.9.8', +1305 silly addNameRange '0.9.9', +1305 silly addNameRange '0.9.11', +1305 silly addNameRange '0.9.12', +1305 silly addNameRange '0.9.13', +1305 silly addNameRange '0.9.14', +1305 silly addNameRange '0.9.15', +1305 silly addNameRange '0.10.0', +1305 silly addNameRange '0.11.0', +1305 silly addNameRange '0.12.0', +1305 silly addNameRange '0.12.1', +1305 silly addNameRange '0.13.0', +1305 silly addNameRange '1.0.0', +1305 silly addNameRange '1.1.0', +1305 silly addNameRange '1.2.0', +1305 silly addNameRange '2.0.0', +1305 silly addNameRange '2.1.0', +1305 silly addNameRange '2.2.0', +1305 silly addNameRange '2.2.1', +1305 silly addNameRange '2.2.2', +1305 silly addNameRange '2.3.0', +1305 silly addNameRange '2.3.1', +1305 silly addNameRange '2.3.2', +1305 silly addNameRange '2.3.3', +1305 silly addNameRange '2.3.4', +1305 silly addNameRange '2.4.2', +1305 silly addNameRange '2.4.3', +1305 silly addNameRange '2.5.0', +1305 silly addNameRange '3.0.0', +1305 silly addNameRange '3.0.1', +1305 silly addNameRange '4.0.0' ] ] +1306 silly addNamed tough-cookie@2.5.0 +1307 verbose addNamed "2.5.0" is a plain semver version for tough-cookie +1308 silly cache afterAdd oauth-sign@0.9.0 +1309 verbose afterAdd /home/christine/.npm/oauth-sign/0.9.0/package/package.json not in flight; writing +1310 silly resolveWithNewModule uuid@3.4.0 checking installable status +1311 silly cache add args [ 'uuid@^3.3.2', null ] +1312 verbose cache add spec uuid@^3.3.2 +1313 silly cache add parsed spec Result { +1313 silly cache add raw: 'uuid@^3.3.2', +1313 silly cache add scope: null, +1313 silly cache add name: 'uuid', +1313 silly cache add rawSpec: '^3.3.2', +1313 silly cache add spec: '>=3.3.2 <4.0.0', +1313 silly cache add type: 'range' } +1314 silly addNamed uuid@>=3.3.2 <4.0.0 +1315 verbose addNamed ">=3.3.2 <4.0.0" is a valid semver range for uuid +1316 silly addNameRange { name: 'uuid', range: '>=3.3.2 <4.0.0', hasData: false } +1317 silly mapToRegistry name uuid +1318 silly mapToRegistry using default registry +1319 silly mapToRegistry registry https://registry.npmjs.org/ +1320 silly mapToRegistry uri https://registry.npmjs.org/uuid +1321 verbose addNameRange registry:https://registry.npmjs.org/uuid not in flight; fetching +1322 verbose afterAdd /home/christine/.npm/tunnel-agent/0.6.0/package/package.json written +1323 silly mapToRegistry name tough-cookie +1324 silly mapToRegistry using default registry +1325 silly mapToRegistry registry https://registry.npmjs.org/ +1326 silly mapToRegistry uri https://registry.npmjs.org/tough-cookie +1327 verbose addRemoteTarball https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz not in flight; adding +1328 verbose addRemoteTarball [ 'https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz', +1328 verbose addRemoteTarball 'cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2' ] +1329 verbose afterAdd /home/christine/.npm/performance-now/2.1.0/package/package.json written +1330 verbose get https://registry.npmjs.org/mime-types not expired, no request +1331 silly addNameRange number 2 { name: 'mime-types', range: '>=2.1.19 <2.2.0', hasData: true } +1332 silly addNameRange versions [ 'mime-types', +1332 silly addNameRange [ '0.1.0', +1332 silly addNameRange '1.0.0', +1332 silly addNameRange '1.0.1', +1332 silly addNameRange '1.0.2', +1332 silly addNameRange '2.0.0', +1332 silly addNameRange '2.0.1', +1332 silly addNameRange '2.0.2', +1332 silly addNameRange '2.0.3', +1332 silly addNameRange '2.0.4', +1332 silly addNameRange '2.0.5', +1332 silly addNameRange '2.0.6', +1332 silly addNameRange '2.0.7', +1332 silly addNameRange '2.0.8', +1332 silly addNameRange '2.0.9', +1332 silly addNameRange '2.0.10', +1332 silly addNameRange '2.0.11', +1332 silly addNameRange '2.0.12', +1332 silly addNameRange '2.0.13', +1332 silly addNameRange '2.0.14', +1332 silly addNameRange '2.1.0', +1332 silly addNameRange '2.1.1', +1332 silly addNameRange '2.1.2', +1332 silly addNameRange '2.1.3', +1332 silly addNameRange '2.1.4', +1332 silly addNameRange '2.1.5', +1332 silly addNameRange '2.1.6', +1332 silly addNameRange '2.1.7', +1332 silly addNameRange '2.1.8', +1332 silly addNameRange '2.1.9', +1332 silly addNameRange '2.1.10', +1332 silly addNameRange '2.1.11', +1332 silly addNameRange '2.1.12', +1332 silly addNameRange '2.1.13', +1332 silly addNameRange '2.1.14', +1332 silly addNameRange '2.1.15', +1332 silly addNameRange '2.1.16', +1332 silly addNameRange '2.1.17', +1332 silly addNameRange '2.1.18', +1332 silly addNameRange '2.1.19', +1332 silly addNameRange '2.1.20', +1332 silly addNameRange '2.1.21', +1332 silly addNameRange '2.1.22', +1332 silly addNameRange '2.1.23', +1332 silly addNameRange '2.1.24', +1332 silly addNameRange '2.1.25', +1332 silly addNameRange '2.1.26', +1332 silly addNameRange '2.1.27' ] ] +1333 silly addNamed mime-types@2.1.27 +1334 verbose addNamed "2.1.27" is a plain semver version for mime-types +1335 silly mapToRegistry name mime-types +1336 silly mapToRegistry using default registry +1337 silly mapToRegistry registry https://registry.npmjs.org/ +1338 silly mapToRegistry uri https://registry.npmjs.org/mime-types +1339 verbose addRemoteTarball https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz not in flight; adding +1340 verbose addRemoteTarball [ 'https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz', +1340 verbose addRemoteTarball '47949f98e279ea53119f5722e0f34e529bec009f' ] +1341 info retry fetch attempt 1 at 13:48:57 +1342 info attempt registry request try #1 at 13:48:57 +1343 http fetch GET https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz +1344 verbose get https://registry.npmjs.org/uuid not expired, no request +1345 silly addNameRange number 2 { name: 'uuid', range: '>=3.3.2 <4.0.0', hasData: true } +1346 silly addNameRange versions [ 'uuid', +1346 silly addNameRange [ '0.0.1', +1346 silly addNameRange '0.0.2', +1346 silly addNameRange '1.4.0', +1346 silly addNameRange '1.4.1', +1346 silly addNameRange '1.4.2', +1346 silly addNameRange '2.0.0', +1346 silly addNameRange '2.0.1', +1346 silly addNameRange '2.0.2', +1346 silly addNameRange '2.0.3', +1346 silly addNameRange '3.0.0', +1346 silly addNameRange '3.0.1', +1346 silly addNameRange '3.1.0', +1346 silly addNameRange '3.2.0', +1346 silly addNameRange '3.2.1', +1346 silly addNameRange '3.3.0', +1346 silly addNameRange '3.3.2', +1346 silly addNameRange '3.3.3', +1346 silly addNameRange '3.4.0', +1346 silly addNameRange '7.0.0-beta.0', +1346 silly addNameRange '7.0.0', +1346 silly addNameRange '7.0.1', +1346 silly addNameRange '7.0.2-beta.0', +1346 silly addNameRange '7.0.2', +1346 silly addNameRange '7.0.3', +1346 silly addNameRange '8.0.0-beta.0', +1346 silly addNameRange '8.0.0', +1346 silly addNameRange '8.1.0' ] ] +1347 silly addNamed uuid@3.4.0 +1348 verbose addNamed "3.4.0" is a plain semver version for uuid +1349 silly resolveWithNewModule qs@6.5.2 checking installable status +1350 silly cache add args [ 'qs@~6.5.2', null ] +1351 verbose cache add spec qs@~6.5.2 +1352 silly cache add parsed spec Result { +1352 silly cache add raw: 'qs@~6.5.2', +1352 silly cache add scope: null, +1352 silly cache add name: 'qs', +1352 silly cache add rawSpec: '~6.5.2', +1352 silly cache add spec: '>=6.5.2 <6.6.0', +1352 silly cache add type: 'range' } +1353 silly addNamed qs@>=6.5.2 <6.6.0 +1354 verbose addNamed ">=6.5.2 <6.6.0" is a valid semver range for qs +1355 silly addNameRange { name: 'qs', range: '>=6.5.2 <6.6.0', hasData: false } +1356 silly mapToRegistry name qs +1357 silly mapToRegistry using default registry +1358 silly mapToRegistry registry https://registry.npmjs.org/ +1359 silly mapToRegistry uri https://registry.npmjs.org/qs +1360 verbose addNameRange registry:https://registry.npmjs.org/qs not in flight; fetching +1361 verbose afterAdd /home/christine/.npm/oauth-sign/0.9.0/package/package.json written +1362 http fetch 200 https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz +1363 info retry fetch attempt 1 at 13:48:57 +1364 info attempt registry request try #1 at 13:48:57 +1365 http fetch GET https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz +1366 verbose get https://registry.npmjs.org/qs not expired, no request +1367 silly addNameRange number 2 { name: 'qs', range: '>=6.5.2 <6.6.0', hasData: true } +1368 silly addNameRange versions [ 'qs', +1368 silly addNameRange [ '0.0.1', +1368 silly addNameRange '0.0.2', +1368 silly addNameRange '0.0.3', +1368 silly addNameRange '0.0.4', +1368 silly addNameRange '0.0.5', +1368 silly addNameRange '0.0.6', +1368 silly addNameRange '0.0.7', +1368 silly addNameRange '0.1.0', +1368 silly addNameRange '0.2.0', +1368 silly addNameRange '0.3.0', +1368 silly addNameRange '0.3.1', +1368 silly addNameRange '0.3.2', +1368 silly addNameRange '0.4.0', +1368 silly addNameRange '0.4.1', +1368 silly addNameRange '0.4.2', +1368 silly addNameRange '0.5.0', +1368 silly addNameRange '0.5.1', +1368 silly addNameRange '0.5.2', +1368 silly addNameRange '0.5.3', +1368 silly addNameRange '0.5.4', +1368 silly addNameRange '0.5.5', +1368 silly addNameRange '0.5.6', +1368 silly addNameRange '0.6.0', +1368 silly addNameRange '0.6.1', +1368 silly addNameRange '0.6.2', +1368 silly addNameRange '0.6.3', +1368 silly addNameRange '0.6.4', +1368 silly addNameRange '0.6.5', +1368 silly addNameRange '0.6.6', +1368 silly addNameRange '1.0.0', +1368 silly addNameRange '1.0.1', +1368 silly addNameRange '1.0.2', +1368 silly addNameRange '1.1.0', +1368 silly addNameRange '1.2.0', +1368 silly addNameRange '1.2.1', +1368 silly addNameRange '1.2.2', +1368 silly addNameRange '2.0.0', +1368 silly addNameRange '2.1.0', +1368 silly addNameRange '2.2.0', +1368 silly addNameRange '2.2.1', +1368 silly addNameRange '2.2.2', +1368 silly addNameRange '2.2.3', +1368 silly addNameRange '2.2.4', +1368 silly addNameRange '2.2.5', +1368 silly addNameRange '2.3.0', +1368 silly addNameRange '2.3.1', +1368 silly addNameRange '2.3.2', +1368 silly addNameRange '2.3.3', +1368 silly addNameRange '2.4.0', +1368 silly addNameRange '2.4.1', +1368 silly addNameRange '2.4.2', +1368 silly addNameRange '3.0.0', +1368 silly addNameRange '3.1.0', +1368 silly addNameRange '4.0.0', +1368 silly addNameRange '5.0.0', +1368 silly addNameRange '5.1.0', +1368 silly addNameRange '5.2.0', +1368 silly addNameRange '6.0.0', +1368 silly addNameRange '6.0.1', +1368 silly addNameRange '6.0.2', +1368 silly addNameRange '6.1.0', +1368 silly addNameRange '6.2.0', +1368 silly addNameRange '5.2.1', +1368 silly addNameRange '6.2.1', +1368 silly addNameRange '6.3.0', +1368 silly addNameRange '6.3.1', +1368 silly addNameRange '6.1.1', +1368 silly addNameRange '6.0.3', +1368 silly addNameRange '6.2.2', +1368 silly addNameRange '6.4.0', +1368 silly addNameRange '6.3.2', +1368 silly addNameRange '6.2.3', +1368 silly addNameRange '6.1.2', +1368 silly addNameRange '6.0.4', +1368 silly addNameRange '6.5.0', +1368 silly addNameRange '6.5.1', +1368 silly addNameRange '6.5.2', +1368 silly addNameRange '6.6.0', +1368 silly addNameRange '6.7.0', +1368 silly addNameRange '6.8.0', +1368 silly addNameRange '6.9.0', +1368 silly addNameRange '6.9.1', +1368 silly addNameRange '6.9.2', +1368 silly addNameRange '6.8.1', +1368 silly addNameRange '6.7.1', +1368 silly addNameRange '6.7.2', +1368 silly addNameRange '6.8.2', +1368 silly addNameRange '6.9.3', +1368 silly addNameRange '6.9.4' ] ] +1369 silly addNamed qs@6.5.2 +1370 verbose addNamed "6.5.2" is a plain semver version for qs +1371 silly fetchAndShaCheck shasum 1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6 +1372 http fetch 200 https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz +1373 silly cache afterAdd uuid@3.4.0 +1374 verbose afterAdd /home/christine/.npm/uuid/3.4.0/package/package.json not in flight; writing +1375 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz not in flight; adding +1376 verbose addTmpTarball already have metadata; skipping unpack for safe-buffer@5.2.1 +1377 silly cache afterAdd qs@6.5.2 +1378 verbose afterAdd /home/christine/.npm/qs/6.5.2/package/package.json not in flight; writing +1379 verbose afterAdd /home/christine/.npm/uuid/3.4.0/package/package.json written +1380 silly fetchAndShaCheck shasum cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2 +1381 verbose afterAdd /home/christine/.npm/qs/6.5.2/package/package.json written +1382 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz not in flight; adding +1383 verbose addTmpTarball already have metadata; skipping unpack for tough-cookie@2.5.0 +1384 silly cache afterAdd safe-buffer@5.2.1 +1385 verbose afterAdd /home/christine/.npm/safe-buffer/5.2.1/package/package.json not in flight; writing +1386 verbose afterAdd /home/christine/.npm/safe-buffer/5.2.1/package/package.json written +1387 silly cache afterAdd tough-cookie@2.5.0 +1388 verbose afterAdd /home/christine/.npm/tough-cookie/2.5.0/package/package.json not in flight; writing +1389 verbose afterAdd /home/christine/.npm/tough-cookie/2.5.0/package/package.json written +1390 http fetch 200 https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz +1391 silly fetchAndShaCheck shasum 47949f98e279ea53119f5722e0f34e529bec009f +1392 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz not in flight; adding +1393 verbose addTmpTarball already have metadata; skipping unpack for mime-types@2.1.27 +1394 silly cache afterAdd mime-types@2.1.27 +1395 verbose afterAdd /home/christine/.npm/mime-types/2.1.27/package/package.json not in flight; writing +1396 verbose afterAdd /home/christine/.npm/mime-types/2.1.27/package/package.json written +1397 silly fetchNamedPackageData delayed-stream +1398 silly mapToRegistry name delayed-stream +1399 silly mapToRegistry using default registry +1400 silly mapToRegistry registry https://registry.npmjs.org/ +1401 silly mapToRegistry uri https://registry.npmjs.org/delayed-stream +1402 verbose request uri https://registry.npmjs.org/delayed-stream +1403 verbose request no auth needed +1404 info attempt registry request try #1 at 13:48:57 +1405 verbose etag W/"d93fb1e0b12584f566e6f17a70c49721" +1406 verbose lastModified Sat, 26 May 2018 21:57:10 GMT +1407 http request GET https://registry.npmjs.org/delayed-stream +1408 http 304 https://registry.npmjs.org/delayed-stream +1409 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1409 verbose headers connection: 'keep-alive', +1409 verbose headers 'set-cookie': +1409 verbose headers [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1409 verbose headers 'cf-ray': '59764fa5ecd6325c-FRA', +1409 verbose headers age: '5355', +1409 verbose headers 'cache-control': 'public, max-age=300', +1409 verbose headers etag: '"d93fb1e0b12584f566e6f17a70c49721"', +1409 verbose headers 'last-modified': 'Sat, 26 May 2018 21:57:10 GMT', +1409 verbose headers vary: 'Accept-Encoding', +1409 verbose headers 'cf-cache-status': 'HIT', +1409 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1409 verbose headers server: 'cloudflare', +1409 verbose headers 'cf-request-id': '02ddd01baf0000325c4c82b200000001' } +1410 silly get cb [ 304, +1410 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1410 silly get connection: 'keep-alive', +1410 silly get 'set-cookie': +1410 silly get [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1410 silly get 'cf-ray': '59764fa5ecd6325c-FRA', +1410 silly get age: '5355', +1410 silly get 'cache-control': 'public, max-age=300', +1410 silly get etag: '"d93fb1e0b12584f566e6f17a70c49721"', +1410 silly get 'last-modified': 'Sat, 26 May 2018 21:57:10 GMT', +1410 silly get vary: 'Accept-Encoding', +1410 silly get 'cf-cache-status': 'HIT', +1410 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1410 silly get server: 'cloudflare', +1410 silly get 'cf-request-id': '02ddd01baf0000325c4c82b200000001' } ] +1411 verbose etag https://registry.npmjs.org/delayed-stream from cache +1412 verbose get saving delayed-stream to /home/christine/.npm/registry.npmjs.org/delayed-stream/.cache.json +1413 silly resolveWithNewModule delayed-stream@1.0.0 checking installable status +1414 silly cache add args [ 'delayed-stream@~1.0.0', null ] +1415 verbose cache add spec delayed-stream@~1.0.0 +1416 silly cache add parsed spec Result { +1416 silly cache add raw: 'delayed-stream@~1.0.0', +1416 silly cache add scope: null, +1416 silly cache add name: 'delayed-stream', +1416 silly cache add rawSpec: '~1.0.0', +1416 silly cache add spec: '>=1.0.0 <1.1.0', +1416 silly cache add type: 'range' } +1417 silly addNamed delayed-stream@>=1.0.0 <1.1.0 +1418 verbose addNamed ">=1.0.0 <1.1.0" is a valid semver range for delayed-stream +1419 silly addNameRange { name: 'delayed-stream', +1419 silly addNameRange range: '>=1.0.0 <1.1.0', +1419 silly addNameRange hasData: false } +1420 silly mapToRegistry name delayed-stream +1421 silly mapToRegistry using default registry +1422 silly mapToRegistry registry https://registry.npmjs.org/ +1423 silly mapToRegistry uri https://registry.npmjs.org/delayed-stream +1424 verbose addNameRange registry:https://registry.npmjs.org/delayed-stream not in flight; fetching +1425 verbose get https://registry.npmjs.org/delayed-stream not expired, no request +1426 silly addNameRange number 2 { name: 'delayed-stream', +1426 silly addNameRange range: '>=1.0.0 <1.1.0', +1426 silly addNameRange hasData: true } +1427 silly addNameRange versions [ 'delayed-stream', +1427 silly addNameRange [ '0.0.0', +1427 silly addNameRange '0.0.1', +1427 silly addNameRange '0.0.2', +1427 silly addNameRange '0.0.3', +1427 silly addNameRange '0.0.4', +1427 silly addNameRange '0.0.5', +1427 silly addNameRange '0.0.6', +1427 silly addNameRange '0.0.7', +1427 silly addNameRange '1.0.0' ] ] +1428 silly addNamed delayed-stream@1.0.0 +1429 verbose addNamed "1.0.0" is a plain semver version for delayed-stream +1430 silly cache afterAdd delayed-stream@1.0.0 +1431 verbose afterAdd /home/christine/.npm/delayed-stream/1.0.0/package/package.json not in flight; writing +1432 verbose afterAdd /home/christine/.npm/delayed-stream/1.0.0/package/package.json written +1433 silly fetchNamedPackageData asynckit +1434 silly mapToRegistry name asynckit +1435 silly mapToRegistry using default registry +1436 silly mapToRegistry registry https://registry.npmjs.org/ +1437 silly mapToRegistry uri https://registry.npmjs.org/asynckit +1438 verbose request uri https://registry.npmjs.org/asynckit +1439 verbose request no auth needed +1440 info attempt registry request try #1 at 13:48:57 +1441 verbose etag W/"34349b180d8fff99867769eadfb4b93e" +1442 verbose lastModified Sat, 26 May 2018 17:31:47 GMT +1443 http request GET https://registry.npmjs.org/asynckit +1444 http 304 https://registry.npmjs.org/asynckit +1445 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', +1445 verbose headers connection: 'keep-alive', +1445 verbose headers 'set-cookie': +1445 verbose headers [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1445 verbose headers 'cf-ray': '59764fa64d096347-FRA', +1445 verbose headers age: '5354', +1445 verbose headers 'cache-control': 'public, max-age=300', +1445 verbose headers etag: '"34349b180d8fff99867769eadfb4b93e"', +1445 verbose headers 'last-modified': 'Sat, 26 May 2018 17:31:47 GMT', +1445 verbose headers vary: 'Accept-Encoding', +1445 verbose headers 'cf-cache-status': 'HIT', +1445 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1445 verbose headers server: 'cloudflare', +1445 verbose headers 'cf-request-id': '02ddd01be900006347e88c6200000001' } +1446 silly get cb [ 304, +1446 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', +1446 silly get connection: 'keep-alive', +1446 silly get 'set-cookie': +1446 silly get [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1446 silly get 'cf-ray': '59764fa64d096347-FRA', +1446 silly get age: '5354', +1446 silly get 'cache-control': 'public, max-age=300', +1446 silly get etag: '"34349b180d8fff99867769eadfb4b93e"', +1446 silly get 'last-modified': 'Sat, 26 May 2018 17:31:47 GMT', +1446 silly get vary: 'Accept-Encoding', +1446 silly get 'cf-cache-status': 'HIT', +1446 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1446 silly get server: 'cloudflare', +1446 silly get 'cf-request-id': '02ddd01be900006347e88c6200000001' } ] +1447 verbose etag https://registry.npmjs.org/asynckit from cache +1448 verbose get saving asynckit to /home/christine/.npm/registry.npmjs.org/asynckit/.cache.json +1449 silly resolveWithNewModule asynckit@0.4.0 checking installable status +1450 silly cache add args [ 'asynckit@^0.4.0', null ] +1451 verbose cache add spec asynckit@^0.4.0 +1452 silly cache add parsed spec Result { +1452 silly cache add raw: 'asynckit@^0.4.0', +1452 silly cache add scope: null, +1452 silly cache add name: 'asynckit', +1452 silly cache add rawSpec: '^0.4.0', +1452 silly cache add spec: '>=0.4.0 <0.5.0', +1452 silly cache add type: 'range' } +1453 silly addNamed asynckit@>=0.4.0 <0.5.0 +1454 verbose addNamed ">=0.4.0 <0.5.0" is a valid semver range for asynckit +1455 silly addNameRange { name: 'asynckit', range: '>=0.4.0 <0.5.0', hasData: false } +1456 silly mapToRegistry name asynckit +1457 silly mapToRegistry using default registry +1458 silly mapToRegistry registry https://registry.npmjs.org/ +1459 silly mapToRegistry uri https://registry.npmjs.org/asynckit +1460 verbose addNameRange registry:https://registry.npmjs.org/asynckit not in flight; fetching +1461 verbose get https://registry.npmjs.org/asynckit not expired, no request +1462 silly addNameRange number 2 { name: 'asynckit', range: '>=0.4.0 <0.5.0', hasData: true } +1463 silly addNameRange versions [ 'asynckit', [ '0.1.0', '0.2.0', '0.3.0', '0.4.0' ] ] +1464 silly addNamed asynckit@0.4.0 +1465 verbose addNamed "0.4.0" is a plain semver version for asynckit +1466 silly cache afterAdd asynckit@0.4.0 +1467 verbose afterAdd /home/christine/.npm/asynckit/0.4.0/package/package.json not in flight; writing +1468 verbose afterAdd /home/christine/.npm/asynckit/0.4.0/package/package.json written +1469 silly fetchNamedPackageData mime-db +1470 silly mapToRegistry name mime-db +1471 silly mapToRegistry using default registry +1472 silly mapToRegistry registry https://registry.npmjs.org/ +1473 silly mapToRegistry uri https://registry.npmjs.org/mime-db +1474 verbose request uri https://registry.npmjs.org/mime-db +1475 verbose request no auth needed +1476 info attempt registry request try #1 at 13:48:57 +1477 verbose etag W/"2b27fd56fd1f376697dd3c190a16cbca" +1478 verbose lastModified Mon, 06 Jan 2020 03:24:41 GMT +1479 http request GET https://registry.npmjs.org/mime-db +1480 http 200 https://registry.npmjs.org/mime-db +1481 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1481 verbose headers 'content-type': 'application/json', +1481 verbose headers 'transfer-encoding': 'chunked', +1481 verbose headers connection: 'keep-alive', +1481 verbose headers 'set-cookie': +1481 verbose headers [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1481 verbose headers 'cf-ray': '59764fa68978648b-FRA', +1481 verbose headers age: '5355', +1481 verbose headers 'cache-control': 'public, max-age=300', +1481 verbose headers etag: 'W/"b954c5c9a96f2fe6e200fdac9b6d1184"', +1481 verbose headers 'last-modified': 'Thu, 23 Apr 2020 00:55:28 GMT', +1481 verbose headers vary: 'accept-encoding, accept', +1481 verbose headers 'cf-cache-status': 'HIT', +1481 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1481 verbose headers server: 'cloudflare', +1481 verbose headers 'content-encoding': 'gzip', +1481 verbose headers 'cf-request-id': '02ddd01c160000648bda012200000001' } +1482 silly get cb [ 200, +1482 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1482 silly get 'content-type': 'application/json', +1482 silly get 'transfer-encoding': 'chunked', +1482 silly get connection: 'keep-alive', +1482 silly get 'set-cookie': +1482 silly get [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1482 silly get 'cf-ray': '59764fa68978648b-FRA', +1482 silly get age: '5355', +1482 silly get 'cache-control': 'public, max-age=300', +1482 silly get etag: 'W/"b954c5c9a96f2fe6e200fdac9b6d1184"', +1482 silly get 'last-modified': 'Thu, 23 Apr 2020 00:55:28 GMT', +1482 silly get vary: 'accept-encoding, accept', +1482 silly get 'cf-cache-status': 'HIT', +1482 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1482 silly get server: 'cloudflare', +1482 silly get 'content-encoding': 'gzip', +1482 silly get 'cf-request-id': '02ddd01c160000648bda012200000001' } ] +1483 verbose get saving mime-db to /home/christine/.npm/registry.npmjs.org/mime-db/.cache.json +1484 silly resolveWithNewModule mime-db@1.44.0 checking installable status +1485 silly cache add args [ 'mime-db@1.44.0', null ] +1486 verbose cache add spec mime-db@1.44.0 +1487 silly cache add parsed spec Result { +1487 silly cache add raw: 'mime-db@1.44.0', +1487 silly cache add scope: null, +1487 silly cache add name: 'mime-db', +1487 silly cache add rawSpec: '1.44.0', +1487 silly cache add spec: '1.44.0', +1487 silly cache add type: 'version' } +1488 silly addNamed mime-db@1.44.0 +1489 verbose addNamed "1.44.0" is a plain semver version for mime-db +1490 silly mapToRegistry name mime-db +1491 silly mapToRegistry using default registry +1492 silly mapToRegistry registry https://registry.npmjs.org/ +1493 silly mapToRegistry uri https://registry.npmjs.org/mime-db +1494 verbose addNameVersion registry:https://registry.npmjs.org/mime-db not in flight; fetching +1495 verbose get https://registry.npmjs.org/mime-db not expired, no request +1496 silly mapToRegistry name mime-db +1497 silly mapToRegistry using default registry +1498 silly mapToRegistry registry https://registry.npmjs.org/ +1499 silly mapToRegistry uri https://registry.npmjs.org/mime-db +1500 verbose addRemoteTarball https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz not in flight; adding +1501 verbose addRemoteTarball [ 'https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz', +1501 verbose addRemoteTarball 'fa11c5eb0aca1334b4233cb4d52f10c5a6272f92' ] +1502 info retry fetch attempt 1 at 13:48:58 +1503 info attempt registry request try #1 at 13:48:58 +1504 http fetch GET https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz +1505 http fetch 200 https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz +1506 silly fetchAndShaCheck shasum fa11c5eb0aca1334b4233cb4d52f10c5a6272f92 +1507 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz not in flight; adding +1508 verbose addTmpTarball already have metadata; skipping unpack for mime-db@1.44.0 +1509 silly cache afterAdd mime-db@1.44.0 +1510 verbose afterAdd /home/christine/.npm/mime-db/1.44.0/package/package.json not in flight; writing +1511 verbose afterAdd /home/christine/.npm/mime-db/1.44.0/package/package.json written +1512 silly fetchNamedPackageData ajv +1513 silly mapToRegistry name ajv +1514 silly mapToRegistry using default registry +1515 silly mapToRegistry registry https://registry.npmjs.org/ +1516 silly mapToRegistry uri https://registry.npmjs.org/ajv +1517 silly fetchNamedPackageData har-schema +1518 silly mapToRegistry name har-schema +1519 silly mapToRegistry using default registry +1520 silly mapToRegistry registry https://registry.npmjs.org/ +1521 silly mapToRegistry uri https://registry.npmjs.org/har-schema +1522 verbose request uri https://registry.npmjs.org/har-schema +1523 verbose request no auth needed +1524 info attempt registry request try #1 at 13:48:58 +1525 verbose etag W/"63c48c25d01ab9ec3e3fb5fe89f0600c" +1526 verbose lastModified Tue, 08 Jan 2019 06:13:01 GMT +1527 http request GET https://registry.npmjs.org/har-schema +1528 verbose request uri https://registry.npmjs.org/ajv +1529 verbose request no auth needed +1530 info attempt registry request try #1 at 13:48:58 +1531 verbose etag W/"da116ce9064cf3ae300f7c5410f85976" +1532 verbose lastModified Sat, 22 Feb 2020 13:51:53 GMT +1533 http request GET https://registry.npmjs.org/ajv +1534 http 304 https://registry.npmjs.org/har-schema +1535 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1535 verbose headers connection: 'keep-alive', +1535 verbose headers 'set-cookie': +1535 verbose headers [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1535 verbose headers 'cf-ray': '59764fa77b11175a-FRA', +1535 verbose headers age: '5352', +1535 verbose headers 'cache-control': 'public, max-age=300', +1535 verbose headers etag: '"63c48c25d01ab9ec3e3fb5fe89f0600c"', +1535 verbose headers 'last-modified': 'Tue, 08 Jan 2019 06:13:01 GMT', +1535 verbose headers vary: 'Accept-Encoding', +1535 verbose headers 'cf-cache-status': 'HIT', +1535 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1535 verbose headers server: 'cloudflare', +1535 verbose headers 'cf-request-id': '02ddd01caf0000175a1e21a200000001' } +1536 silly get cb [ 304, +1536 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1536 silly get connection: 'keep-alive', +1536 silly get 'set-cookie': +1536 silly get [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1536 silly get 'cf-ray': '59764fa77b11175a-FRA', +1536 silly get age: '5352', +1536 silly get 'cache-control': 'public, max-age=300', +1536 silly get etag: '"63c48c25d01ab9ec3e3fb5fe89f0600c"', +1536 silly get 'last-modified': 'Tue, 08 Jan 2019 06:13:01 GMT', +1536 silly get vary: 'Accept-Encoding', +1536 silly get 'cf-cache-status': 'HIT', +1536 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1536 silly get server: 'cloudflare', +1536 silly get 'cf-request-id': '02ddd01caf0000175a1e21a200000001' } ] +1537 verbose etag https://registry.npmjs.org/har-schema from cache +1538 verbose get saving har-schema to /home/christine/.npm/registry.npmjs.org/har-schema/.cache.json +1539 silly resolveWithNewModule har-schema@2.0.0 checking installable status +1540 silly cache add args [ 'har-schema@^2.0.0', null ] +1541 verbose cache add spec har-schema@^2.0.0 +1542 silly cache add parsed spec Result { +1542 silly cache add raw: 'har-schema@^2.0.0', +1542 silly cache add scope: null, +1542 silly cache add name: 'har-schema', +1542 silly cache add rawSpec: '^2.0.0', +1542 silly cache add spec: '>=2.0.0 <3.0.0', +1542 silly cache add type: 'range' } +1543 silly addNamed har-schema@>=2.0.0 <3.0.0 +1544 verbose addNamed ">=2.0.0 <3.0.0" is a valid semver range for har-schema +1545 silly addNameRange { name: 'har-schema', range: '>=2.0.0 <3.0.0', hasData: false } +1546 silly mapToRegistry name har-schema +1547 silly mapToRegistry using default registry +1548 silly mapToRegistry registry https://registry.npmjs.org/ +1549 silly mapToRegistry uri https://registry.npmjs.org/har-schema +1550 verbose addNameRange registry:https://registry.npmjs.org/har-schema not in flight; fetching +1551 verbose get https://registry.npmjs.org/har-schema not expired, no request +1552 silly addNameRange number 2 { name: 'har-schema', range: '>=2.0.0 <3.0.0', hasData: true } +1553 silly addNameRange versions [ 'har-schema', +1553 silly addNameRange [ '0.0.1', +1553 silly addNameRange '0.1.0', +1553 silly addNameRange '0.2.0', +1553 silly addNameRange '1.0.0', +1553 silly addNameRange '1.0.1', +1553 silly addNameRange '1.0.2', +1553 silly addNameRange '1.0.3', +1553 silly addNameRange '1.0.4', +1553 silly addNameRange '1.0.5', +1553 silly addNameRange '2.0.0' ] ] +1554 silly addNamed har-schema@2.0.0 +1555 verbose addNamed "2.0.0" is a plain semver version for har-schema +1556 silly cache afterAdd har-schema@2.0.0 +1557 verbose afterAdd /home/christine/.npm/har-schema/2.0.0/package/package.json not in flight; writing +1558 verbose afterAdd /home/christine/.npm/har-schema/2.0.0/package/package.json written +1559 http 200 https://registry.npmjs.org/ajv +1560 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1560 verbose headers 'content-type': 'application/json', +1560 verbose headers 'transfer-encoding': 'chunked', +1560 verbose headers connection: 'keep-alive', +1560 verbose headers 'set-cookie': +1560 verbose headers [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1560 verbose headers 'cf-ray': '59764fa798ddd715-FRA', +1560 verbose headers age: '5352', +1560 verbose headers 'cache-control': 'public, max-age=300', +1560 verbose headers etag: 'W/"ba29f88f088d4acc36748d3083785459"', +1560 verbose headers 'last-modified': 'Sun, 19 Apr 2020 23:18:27 GMT', +1560 verbose headers vary: 'accept-encoding, accept', +1560 verbose headers 'cf-cache-status': 'HIT', +1560 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1560 verbose headers server: 'cloudflare', +1560 verbose headers 'content-encoding': 'gzip', +1560 verbose headers 'cf-request-id': '02ddd01cc30000d715c1209200000001' } +1561 silly get cb [ 200, +1561 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1561 silly get 'content-type': 'application/json', +1561 silly get 'transfer-encoding': 'chunked', +1561 silly get connection: 'keep-alive', +1561 silly get 'set-cookie': +1561 silly get [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1561 silly get 'cf-ray': '59764fa798ddd715-FRA', +1561 silly get age: '5352', +1561 silly get 'cache-control': 'public, max-age=300', +1561 silly get etag: 'W/"ba29f88f088d4acc36748d3083785459"', +1561 silly get 'last-modified': 'Sun, 19 Apr 2020 23:18:27 GMT', +1561 silly get vary: 'accept-encoding, accept', +1561 silly get 'cf-cache-status': 'HIT', +1561 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1561 silly get server: 'cloudflare', +1561 silly get 'content-encoding': 'gzip', +1561 silly get 'cf-request-id': '02ddd01cc30000d715c1209200000001' } ] +1562 verbose get saving ajv to /home/christine/.npm/registry.npmjs.org/ajv/.cache.json +1563 silly resolveWithNewModule ajv@6.12.2 checking installable status +1564 silly cache add args [ 'ajv@^6.5.5', null ] +1565 verbose cache add spec ajv@^6.5.5 +1566 silly cache add parsed spec Result { +1566 silly cache add raw: 'ajv@^6.5.5', +1566 silly cache add scope: null, +1566 silly cache add name: 'ajv', +1566 silly cache add rawSpec: '^6.5.5', +1566 silly cache add spec: '>=6.5.5 <7.0.0', +1566 silly cache add type: 'range' } +1567 silly addNamed ajv@>=6.5.5 <7.0.0 +1568 verbose addNamed ">=6.5.5 <7.0.0" is a valid semver range for ajv +1569 silly addNameRange { name: 'ajv', range: '>=6.5.5 <7.0.0', hasData: false } +1570 silly mapToRegistry name ajv +1571 silly mapToRegistry using default registry +1572 silly mapToRegistry registry https://registry.npmjs.org/ +1573 silly mapToRegistry uri https://registry.npmjs.org/ajv +1574 verbose addNameRange registry:https://registry.npmjs.org/ajv not in flight; fetching +1575 verbose get https://registry.npmjs.org/ajv not expired, no request +1576 silly addNameRange number 2 { name: 'ajv', range: '>=6.5.5 <7.0.0', hasData: true } +1577 silly addNameRange versions [ 'ajv', +1577 silly addNameRange [ '0.0.4', +1577 silly addNameRange '0.0.5', +1577 silly addNameRange '0.0.6', +1577 silly addNameRange '0.0.7', +1577 silly addNameRange '0.0.8', +1577 silly addNameRange '0.0.9', +1577 silly addNameRange '0.0.10', +1577 silly addNameRange '0.0.11', +1577 silly addNameRange '0.0.12', +1577 silly addNameRange '0.1.0', +1577 silly addNameRange '0.1.1', +1577 silly addNameRange '0.1.2', +1577 silly addNameRange '0.1.3', +1577 silly addNameRange '0.1.4', +1577 silly addNameRange '0.1.5', +1577 silly addNameRange '0.1.6', +1577 silly addNameRange '0.1.7', +1577 silly addNameRange '0.1.8', +1577 silly addNameRange '0.1.9', +1577 silly addNameRange '0.1.10', +1577 silly addNameRange '0.1.11', +1577 silly addNameRange '0.1.12', +1577 silly addNameRange '0.1.13', +1577 silly addNameRange '0.1.14', +1577 silly addNameRange '0.1.15', +1577 silly addNameRange '0.1.16', +1577 silly addNameRange '0.2.0', +1577 silly addNameRange '0.2.1', +1577 silly addNameRange '0.2.2', +1577 silly addNameRange '0.2.3', +1577 silly addNameRange '0.2.4', +1577 silly addNameRange '0.2.5', +1577 silly addNameRange '0.2.6', +1577 silly addNameRange '0.2.7', +1577 silly addNameRange '0.2.8', +1577 silly addNameRange '0.2.9', +1577 silly addNameRange '0.3.0', +1577 silly addNameRange '0.3.1', +1577 silly addNameRange '0.3.2', +1577 silly addNameRange '0.3.3', +1577 silly addNameRange '0.3.4', +1577 silly addNameRange '0.3.5', +1577 silly addNameRange '0.3.6', +1577 silly addNameRange '0.3.7', +1577 silly addNameRange '0.3.8', +1577 silly addNameRange '0.3.11', +1577 silly addNameRange '0.3.12', +1577 silly addNameRange '0.4.0', +1577 silly addNameRange '0.4.1', +1577 silly addNameRange '0.4.2', +1577 silly addNameRange '0.4.3', +1577 silly addNameRange '0.4.4', +1577 silly addNameRange '0.4.5', +1577 silly addNameRange '0.4.6', +1577 silly addNameRange '0.4.7', +1577 silly addNameRange '0.4.8', +1577 silly addNameRange '0.4.9', +1577 silly addNameRange '0.4.10', +1577 silly addNameRange '0.4.12', +1577 silly addNameRange '0.4.14', +1577 silly addNameRange '0.4.15', +1577 silly addNameRange '0.5.0', +1577 silly addNameRange '0.5.2', +1577 silly addNameRange '0.5.3', +1577 silly addNameRange '0.5.4', +1577 silly addNameRange '0.5.5', +1577 silly addNameRange '0.5.6', +1577 silly addNameRange '0.5.7', +1577 silly addNameRange '0.5.8', +1577 silly addNameRange '0.5.9', +1577 silly addNameRange '0.5.10', +1577 silly addNameRange '0.5.11', +1577 silly addNameRange '0.5.12', +1577 silly addNameRange '0.6.0', +1577 silly addNameRange '0.6.1', +1577 silly addNameRange '0.6.2', +1577 silly addNameRange '0.6.3', +1577 silly addNameRange '0.6.4', +1577 silly addNameRange '0.6.5', +1577 silly addNameRange '0.6.6', +1577 silly addNameRange '0.6.7', +1577 silly addNameRange '0.6.8', +1577 silly addNameRange '0.6.9', +1577 silly addNameRange '0.6.10', +1577 silly addNameRange '0.6.11', +1577 silly addNameRange '0.6.12', +1577 silly addNameRange '0.6.13', +1577 silly addNameRange '0.6.14', +1577 silly addNameRange '0.6.15', +1577 silly addNameRange '0.7.0', +1577 silly addNameRange '0.7.1', +1577 silly addNameRange '0.7.2', +1577 silly addNameRange '1.0.0', +1577 silly addNameRange '1.0.1', +1577 silly addNameRange '1.1.1', +1577 silly addNameRange '1.2.0', +1577 silly addNameRange '1.2.1', +1577 silly addNameRange '1.3.0', +1577 silly addNameRange '1.3.1', +1577 silly addNameRange '1.3.2', +1577 silly addNameRange ... 185 more items ] ] +1578 silly addNamed ajv@6.12.2 +1579 verbose addNamed "6.12.2" is a plain semver version for ajv +1580 silly mapToRegistry name ajv +1581 silly mapToRegistry using default registry +1582 silly mapToRegistry registry https://registry.npmjs.org/ +1583 silly mapToRegistry uri https://registry.npmjs.org/ajv +1584 verbose addRemoteTarball https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz not in flight; adding +1585 verbose addRemoteTarball [ 'https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz', +1585 verbose addRemoteTarball 'c629c5eced17baf314437918d2da88c99d5958cd' ] +1586 info retry fetch attempt 1 at 13:48:58 +1587 info attempt registry request try #1 at 13:48:58 +1588 http fetch GET https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz +1589 http fetch 200 https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz +1590 silly fetchAndShaCheck shasum c629c5eced17baf314437918d2da88c99d5958cd +1591 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/ajv/-/ajv-6.12.2.tgz not in flight; adding +1592 verbose addTmpTarball already have metadata; skipping unpack for ajv@6.12.2 +1593 silly cache afterAdd ajv@6.12.2 +1594 verbose afterAdd /home/christine/.npm/ajv/6.12.2/package/package.json not in flight; writing +1595 verbose afterAdd /home/christine/.npm/ajv/6.12.2/package/package.json written +1596 silly fetchNamedPackageData fast-deep-equal +1597 silly mapToRegistry name fast-deep-equal +1598 silly mapToRegistry using default registry +1599 silly mapToRegistry registry https://registry.npmjs.org/ +1600 silly mapToRegistry uri https://registry.npmjs.org/fast-deep-equal +1601 silly fetchNamedPackageData fast-json-stable-stringify +1602 silly mapToRegistry name fast-json-stable-stringify +1603 silly mapToRegistry using default registry +1604 silly mapToRegistry registry https://registry.npmjs.org/ +1605 silly mapToRegistry uri https://registry.npmjs.org/fast-json-stable-stringify +1606 silly fetchNamedPackageData json-schema-traverse +1607 silly mapToRegistry name json-schema-traverse +1608 silly mapToRegistry using default registry +1609 silly mapToRegistry registry https://registry.npmjs.org/ +1610 silly mapToRegistry uri https://registry.npmjs.org/json-schema-traverse +1611 silly fetchNamedPackageData uri-js +1612 silly mapToRegistry name uri-js +1613 silly mapToRegistry using default registry +1614 silly mapToRegistry registry https://registry.npmjs.org/ +1615 silly mapToRegistry uri https://registry.npmjs.org/uri-js +1616 verbose request uri https://registry.npmjs.org/fast-deep-equal +1617 verbose request no auth needed +1618 info attempt registry request try #1 at 13:48:58 +1619 verbose etag W/"db2dac15e1de3baf39963d09ad4d32a5" +1620 verbose lastModified Wed, 22 Jan 2020 05:22:55 GMT +1621 http request GET https://registry.npmjs.org/fast-deep-equal +1622 verbose request uri https://registry.npmjs.org/json-schema-traverse +1623 verbose request no auth needed +1624 info attempt registry request try #1 at 13:48:58 +1625 verbose etag W/"ff9cf4d0fe6dae90110c679f03d42f51" +1626 verbose lastModified Sun, 10 Jun 2018 08:42:10 GMT +1627 http request GET https://registry.npmjs.org/json-schema-traverse +1628 verbose request uri https://registry.npmjs.org/fast-json-stable-stringify +1629 verbose request no auth needed +1630 info attempt registry request try #1 at 13:48:58 +1631 verbose etag W/"ae0fff93e18698c6aa2dc573fe85ad0a" +1632 verbose lastModified Sat, 14 Dec 2019 16:18:01 GMT +1633 http request GET https://registry.npmjs.org/fast-json-stable-stringify +1634 verbose request uri https://registry.npmjs.org/uri-js +1635 verbose request no auth needed +1636 info attempt registry request try #1 at 13:48:58 +1637 verbose etag W/"98dc8f4198063595fc640811868341b2" +1638 verbose lastModified Wed, 09 Jan 2019 05:32:41 GMT +1639 http request GET https://registry.npmjs.org/uri-js +1640 http 304 https://registry.npmjs.org/fast-deep-equal +1641 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1641 verbose headers connection: 'keep-alive', +1641 verbose headers 'set-cookie': +1641 verbose headers [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1641 verbose headers 'cf-ray': '59764fa919db05bb-FRA', +1641 verbose headers age: '5351', +1641 verbose headers 'cache-control': 'public, max-age=300', +1641 verbose headers etag: '"db2dac15e1de3baf39963d09ad4d32a5"', +1641 verbose headers 'last-modified': 'Wed, 22 Jan 2020 05:22:55 GMT', +1641 verbose headers vary: 'Accept-Encoding', +1641 verbose headers 'cf-cache-status': 'HIT', +1641 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1641 verbose headers server: 'cloudflare', +1641 verbose headers 'cf-request-id': '02ddd01db3000005bb0ca9e200000001' } +1642 silly get cb [ 304, +1642 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1642 silly get connection: 'keep-alive', +1642 silly get 'set-cookie': +1642 silly get [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1642 silly get 'cf-ray': '59764fa919db05bb-FRA', +1642 silly get age: '5351', +1642 silly get 'cache-control': 'public, max-age=300', +1642 silly get etag: '"db2dac15e1de3baf39963d09ad4d32a5"', +1642 silly get 'last-modified': 'Wed, 22 Jan 2020 05:22:55 GMT', +1642 silly get vary: 'Accept-Encoding', +1642 silly get 'cf-cache-status': 'HIT', +1642 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1642 silly get server: 'cloudflare', +1642 silly get 'cf-request-id': '02ddd01db3000005bb0ca9e200000001' } ] +1643 verbose etag https://registry.npmjs.org/fast-deep-equal from cache +1644 verbose get saving fast-deep-equal to /home/christine/.npm/registry.npmjs.org/fast-deep-equal/.cache.json +1645 silly resolveWithNewModule fast-deep-equal@3.1.1 checking installable status +1646 silly cache add args [ 'fast-deep-equal@^3.1.1', null ] +1647 verbose cache add spec fast-deep-equal@^3.1.1 +1648 silly cache add parsed spec Result { +1648 silly cache add raw: 'fast-deep-equal@^3.1.1', +1648 silly cache add scope: null, +1648 silly cache add name: 'fast-deep-equal', +1648 silly cache add rawSpec: '^3.1.1', +1648 silly cache add spec: '>=3.1.1 <4.0.0', +1648 silly cache add type: 'range' } +1649 silly addNamed fast-deep-equal@>=3.1.1 <4.0.0 +1650 verbose addNamed ">=3.1.1 <4.0.0" is a valid semver range for fast-deep-equal +1651 silly addNameRange { name: 'fast-deep-equal', +1651 silly addNameRange range: '>=3.1.1 <4.0.0', +1651 silly addNameRange hasData: false } +1652 silly mapToRegistry name fast-deep-equal +1653 silly mapToRegistry using default registry +1654 silly mapToRegistry registry https://registry.npmjs.org/ +1655 silly mapToRegistry uri https://registry.npmjs.org/fast-deep-equal +1656 verbose addNameRange registry:https://registry.npmjs.org/fast-deep-equal not in flight; fetching +1657 verbose get https://registry.npmjs.org/fast-deep-equal not expired, no request +1658 silly addNameRange number 2 { name: 'fast-deep-equal', +1658 silly addNameRange range: '>=3.1.1 <4.0.0', +1658 silly addNameRange hasData: true } +1659 silly addNameRange versions [ 'fast-deep-equal', +1659 silly addNameRange [ '0.0.1', +1659 silly addNameRange '0.1.0', +1659 silly addNameRange '1.0.0', +1659 silly addNameRange '1.1.0', +1659 silly addNameRange '2.0.0', +1659 silly addNameRange '2.0.1', +1659 silly addNameRange '3.0.0-beta.0', +1659 silly addNameRange '3.0.0-beta.1', +1659 silly addNameRange '3.0.0-beta.2', +1659 silly addNameRange '3.0.0', +1659 silly addNameRange '3.0.1', +1659 silly addNameRange '3.1.0', +1659 silly addNameRange '3.1.1' ] ] +1660 silly addNamed fast-deep-equal@3.1.1 +1661 verbose addNamed "3.1.1" is a plain semver version for fast-deep-equal +1662 silly cache afterAdd fast-deep-equal@3.1.1 +1663 verbose afterAdd /home/christine/.npm/fast-deep-equal/3.1.1/package/package.json not in flight; writing +1664 verbose afterAdd /home/christine/.npm/fast-deep-equal/3.1.1/package/package.json written +1665 http 304 https://registry.npmjs.org/fast-json-stable-stringify +1666 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1666 verbose headers connection: 'keep-alive', +1666 verbose headers 'set-cookie': +1666 verbose headers [ '__cfduid=d2af9fdb41f2d4571645353fe78c8280d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1666 verbose headers 'cf-ray': '59764fa92ba70eab-FRA', +1666 verbose headers age: '5351', +1666 verbose headers 'cache-control': 'public, max-age=300', +1666 verbose headers etag: '"ae0fff93e18698c6aa2dc573fe85ad0a"', +1666 verbose headers 'last-modified': 'Sat, 14 Dec 2019 16:18:01 GMT', +1666 verbose headers vary: 'Accept-Encoding', +1666 verbose headers 'cf-cache-status': 'HIT', +1666 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1666 verbose headers server: 'cloudflare', +1666 verbose headers 'cf-request-id': '02ddd01db900000eabe9180200000001' } +1667 silly get cb [ 304, +1667 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1667 silly get connection: 'keep-alive', +1667 silly get 'set-cookie': +1667 silly get [ '__cfduid=d2af9fdb41f2d4571645353fe78c8280d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1667 silly get 'cf-ray': '59764fa92ba70eab-FRA', +1667 silly get age: '5351', +1667 silly get 'cache-control': 'public, max-age=300', +1667 silly get etag: '"ae0fff93e18698c6aa2dc573fe85ad0a"', +1667 silly get 'last-modified': 'Sat, 14 Dec 2019 16:18:01 GMT', +1667 silly get vary: 'Accept-Encoding', +1667 silly get 'cf-cache-status': 'HIT', +1667 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1667 silly get server: 'cloudflare', +1667 silly get 'cf-request-id': '02ddd01db900000eabe9180200000001' } ] +1668 verbose etag https://registry.npmjs.org/fast-json-stable-stringify from cache +1669 verbose get saving fast-json-stable-stringify to /home/christine/.npm/registry.npmjs.org/fast-json-stable-stringify/.cache.json +1670 silly resolveWithNewModule fast-json-stable-stringify@2.1.0 checking installable status +1671 silly cache add args [ 'fast-json-stable-stringify@^2.0.0', null ] +1672 verbose cache add spec fast-json-stable-stringify@^2.0.0 +1673 silly cache add parsed spec Result { +1673 silly cache add raw: 'fast-json-stable-stringify@^2.0.0', +1673 silly cache add scope: null, +1673 silly cache add name: 'fast-json-stable-stringify', +1673 silly cache add rawSpec: '^2.0.0', +1673 silly cache add spec: '>=2.0.0 <3.0.0', +1673 silly cache add type: 'range' } +1674 silly addNamed fast-json-stable-stringify@>=2.0.0 <3.0.0 +1675 verbose addNamed ">=2.0.0 <3.0.0" is a valid semver range for fast-json-stable-stringify +1676 silly addNameRange { name: 'fast-json-stable-stringify', +1676 silly addNameRange range: '>=2.0.0 <3.0.0', +1676 silly addNameRange hasData: false } +1677 silly mapToRegistry name fast-json-stable-stringify +1678 silly mapToRegistry using default registry +1679 silly mapToRegistry registry https://registry.npmjs.org/ +1680 silly mapToRegistry uri https://registry.npmjs.org/fast-json-stable-stringify +1681 verbose addNameRange registry:https://registry.npmjs.org/fast-json-stable-stringify not in flight; fetching +1682 http 304 https://registry.npmjs.org/json-schema-traverse +1683 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1683 verbose headers connection: 'keep-alive', +1683 verbose headers 'set-cookie': +1683 verbose headers [ '__cfduid=d3221de8ef62ba021521e3facdf4646ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1683 verbose headers 'cf-ray': '59764fa928dbd6e1-FRA', +1683 verbose headers age: '5351', +1683 verbose headers 'cache-control': 'public, max-age=300', +1683 verbose headers etag: '"ff9cf4d0fe6dae90110c679f03d42f51"', +1683 verbose headers 'last-modified': 'Sun, 10 Jun 2018 08:42:10 GMT', +1683 verbose headers vary: 'Accept-Encoding', +1683 verbose headers 'cf-cache-status': 'HIT', +1683 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1683 verbose headers server: 'cloudflare', +1683 verbose headers 'cf-request-id': '02ddd01db80000d6e132393200000001' } +1684 silly get cb [ 304, +1684 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1684 silly get connection: 'keep-alive', +1684 silly get 'set-cookie': +1684 silly get [ '__cfduid=d3221de8ef62ba021521e3facdf4646ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1684 silly get 'cf-ray': '59764fa928dbd6e1-FRA', +1684 silly get age: '5351', +1684 silly get 'cache-control': 'public, max-age=300', +1684 silly get etag: '"ff9cf4d0fe6dae90110c679f03d42f51"', +1684 silly get 'last-modified': 'Sun, 10 Jun 2018 08:42:10 GMT', +1684 silly get vary: 'Accept-Encoding', +1684 silly get 'cf-cache-status': 'HIT', +1684 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1684 silly get server: 'cloudflare', +1684 silly get 'cf-request-id': '02ddd01db80000d6e132393200000001' } ] +1685 verbose etag https://registry.npmjs.org/json-schema-traverse from cache +1686 verbose get saving json-schema-traverse to /home/christine/.npm/registry.npmjs.org/json-schema-traverse/.cache.json +1687 http 304 https://registry.npmjs.org/uri-js +1688 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1688 verbose headers connection: 'keep-alive', +1688 verbose headers 'set-cookie': +1688 verbose headers [ '__cfduid=daac5443483b19b682dfd1142d78174b81590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1688 verbose headers 'cf-ray': '59764fa92aaec2f9-FRA', +1688 verbose headers age: '5351', +1688 verbose headers 'cache-control': 'public, max-age=300', +1688 verbose headers etag: '"98dc8f4198063595fc640811868341b2"', +1688 verbose headers 'last-modified': 'Wed, 09 Jan 2019 05:32:41 GMT', +1688 verbose headers vary: 'Accept-Encoding', +1688 verbose headers 'cf-cache-status': 'HIT', +1688 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1688 verbose headers server: 'cloudflare', +1688 verbose headers 'cf-request-id': '02ddd01db90000c2f92609d200000001' } +1689 silly get cb [ 304, +1689 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1689 silly get connection: 'keep-alive', +1689 silly get 'set-cookie': +1689 silly get [ '__cfduid=daac5443483b19b682dfd1142d78174b81590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1689 silly get 'cf-ray': '59764fa92aaec2f9-FRA', +1689 silly get age: '5351', +1689 silly get 'cache-control': 'public, max-age=300', +1689 silly get etag: '"98dc8f4198063595fc640811868341b2"', +1689 silly get 'last-modified': 'Wed, 09 Jan 2019 05:32:41 GMT', +1689 silly get vary: 'Accept-Encoding', +1689 silly get 'cf-cache-status': 'HIT', +1689 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1689 silly get server: 'cloudflare', +1689 silly get 'cf-request-id': '02ddd01db90000c2f92609d200000001' } ] +1690 verbose etag https://registry.npmjs.org/uri-js from cache +1691 verbose get saving uri-js to /home/christine/.npm/registry.npmjs.org/uri-js/.cache.json +1692 verbose get https://registry.npmjs.org/fast-json-stable-stringify not expired, no request +1693 silly addNameRange number 2 { name: 'fast-json-stable-stringify', +1693 silly addNameRange range: '>=2.0.0 <3.0.0', +1693 silly addNameRange hasData: true } +1694 silly addNameRange versions [ 'fast-json-stable-stringify', [ '1.0.2', '2.0.0', '2.1.0' ] ] +1695 silly addNamed fast-json-stable-stringify@2.1.0 +1696 verbose addNamed "2.1.0" is a plain semver version for fast-json-stable-stringify +1697 silly resolveWithNewModule json-schema-traverse@0.4.1 checking installable status +1698 silly cache add args [ 'json-schema-traverse@^0.4.1', null ] +1699 verbose cache add spec json-schema-traverse@^0.4.1 +1700 silly cache add parsed spec Result { +1700 silly cache add raw: 'json-schema-traverse@^0.4.1', +1700 silly cache add scope: null, +1700 silly cache add name: 'json-schema-traverse', +1700 silly cache add rawSpec: '^0.4.1', +1700 silly cache add spec: '>=0.4.1 <0.5.0', +1700 silly cache add type: 'range' } +1701 silly addNamed json-schema-traverse@>=0.4.1 <0.5.0 +1702 verbose addNamed ">=0.4.1 <0.5.0" is a valid semver range for json-schema-traverse +1703 silly addNameRange { name: 'json-schema-traverse', +1703 silly addNameRange range: '>=0.4.1 <0.5.0', +1703 silly addNameRange hasData: false } +1704 silly mapToRegistry name json-schema-traverse +1705 silly mapToRegistry using default registry +1706 silly mapToRegistry registry https://registry.npmjs.org/ +1707 silly mapToRegistry uri https://registry.npmjs.org/json-schema-traverse +1708 verbose addNameRange registry:https://registry.npmjs.org/json-schema-traverse not in flight; fetching +1709 silly resolveWithNewModule uri-js@4.2.2 checking installable status +1710 silly cache add args [ 'uri-js@^4.2.2', null ] +1711 verbose cache add spec uri-js@^4.2.2 +1712 silly cache add parsed spec Result { +1712 silly cache add raw: 'uri-js@^4.2.2', +1712 silly cache add scope: null, +1712 silly cache add name: 'uri-js', +1712 silly cache add rawSpec: '^4.2.2', +1712 silly cache add spec: '>=4.2.2 <5.0.0', +1712 silly cache add type: 'range' } +1713 silly addNamed uri-js@>=4.2.2 <5.0.0 +1714 verbose addNamed ">=4.2.2 <5.0.0" is a valid semver range for uri-js +1715 silly addNameRange { name: 'uri-js', range: '>=4.2.2 <5.0.0', hasData: false } +1716 silly mapToRegistry name uri-js +1717 silly mapToRegistry using default registry +1718 silly mapToRegistry registry https://registry.npmjs.org/ +1719 silly mapToRegistry uri https://registry.npmjs.org/uri-js +1720 verbose addNameRange registry:https://registry.npmjs.org/uri-js not in flight; fetching +1721 verbose get https://registry.npmjs.org/json-schema-traverse not expired, no request +1722 silly addNameRange number 2 { name: 'json-schema-traverse', +1722 silly addNameRange range: '>=0.4.1 <0.5.0', +1722 silly addNameRange hasData: true } +1723 silly addNameRange versions [ 'json-schema-traverse', +1723 silly addNameRange [ '0.0.1', '0.1.0', '0.2.0', '0.3.0', '0.3.1', '0.4.0', '0.4.1' ] ] +1724 silly addNamed json-schema-traverse@0.4.1 +1725 verbose addNamed "0.4.1" is a plain semver version for json-schema-traverse +1726 verbose get https://registry.npmjs.org/uri-js not expired, no request +1727 silly addNameRange number 2 { name: 'uri-js', range: '>=4.2.2 <5.0.0', hasData: true } +1728 silly addNameRange versions [ 'uri-js', +1728 silly addNameRange [ '1.4.0', +1728 silly addNameRange '1.4.2', +1728 silly addNameRange '2.0.0', +1728 silly addNameRange '2.1.0', +1728 silly addNameRange '2.1.1', +1728 silly addNameRange '3.0.0', +1728 silly addNameRange '3.0.1', +1728 silly addNameRange '3.0.2', +1728 silly addNameRange '4.2.0', +1728 silly addNameRange '4.2.1', +1728 silly addNameRange '4.2.2' ] ] +1729 silly addNamed uri-js@4.2.2 +1730 verbose addNamed "4.2.2" is a plain semver version for uri-js +1731 silly cache afterAdd fast-json-stable-stringify@2.1.0 +1732 verbose afterAdd /home/christine/.npm/fast-json-stable-stringify/2.1.0/package/package.json not in flight; writing +1733 verbose afterAdd /home/christine/.npm/fast-json-stable-stringify/2.1.0/package/package.json written +1734 silly cache afterAdd json-schema-traverse@0.4.1 +1735 verbose afterAdd /home/christine/.npm/json-schema-traverse/0.4.1/package/package.json not in flight; writing +1736 silly cache afterAdd uri-js@4.2.2 +1737 verbose afterAdd /home/christine/.npm/uri-js/4.2.2/package/package.json not in flight; writing +1738 verbose afterAdd /home/christine/.npm/json-schema-traverse/0.4.1/package/package.json written +1739 verbose afterAdd /home/christine/.npm/uri-js/4.2.2/package/package.json written +1740 silly fetchNamedPackageData punycode +1741 silly mapToRegistry name punycode +1742 silly mapToRegistry using default registry +1743 silly mapToRegistry registry https://registry.npmjs.org/ +1744 silly mapToRegistry uri https://registry.npmjs.org/punycode +1745 verbose request uri https://registry.npmjs.org/punycode +1746 verbose request no auth needed +1747 info attempt registry request try #1 at 13:48:58 +1748 verbose etag W/"27ef686d9a29403de9242fe625c85934" +1749 verbose lastModified Sun, 27 May 2018 13:11:15 GMT +1750 http request GET https://registry.npmjs.org/punycode +1751 http 304 https://registry.npmjs.org/punycode +1752 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1752 verbose headers connection: 'keep-alive', +1752 verbose headers 'set-cookie': +1752 verbose headers [ '__cfduid=d27785e001b27740005b62566f67820581590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1752 verbose headers 'cf-ray': '59764fa969ce1772-FRA', +1752 verbose headers age: '5655', +1752 verbose headers 'cache-control': 'public, max-age=300', +1752 verbose headers etag: '"27ef686d9a29403de9242fe625c85934"', +1752 verbose headers 'last-modified': 'Sun, 27 May 2018 13:11:15 GMT', +1752 verbose headers vary: 'Accept-Encoding', +1752 verbose headers 'cf-cache-status': 'HIT', +1752 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1752 verbose headers server: 'cloudflare', +1752 verbose headers 'cf-request-id': '02ddd01de4000017726419b200000001' } +1753 silly get cb [ 304, +1753 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1753 silly get connection: 'keep-alive', +1753 silly get 'set-cookie': +1753 silly get [ '__cfduid=d27785e001b27740005b62566f67820581590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1753 silly get 'cf-ray': '59764fa969ce1772-FRA', +1753 silly get age: '5655', +1753 silly get 'cache-control': 'public, max-age=300', +1753 silly get etag: '"27ef686d9a29403de9242fe625c85934"', +1753 silly get 'last-modified': 'Sun, 27 May 2018 13:11:15 GMT', +1753 silly get vary: 'Accept-Encoding', +1753 silly get 'cf-cache-status': 'HIT', +1753 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1753 silly get server: 'cloudflare', +1753 silly get 'cf-request-id': '02ddd01de4000017726419b200000001' } ] +1754 verbose etag https://registry.npmjs.org/punycode from cache +1755 verbose get saving punycode to /home/christine/.npm/registry.npmjs.org/punycode/.cache.json +1756 silly resolveWithNewModule punycode@2.1.1 checking installable status +1757 silly cache add args [ 'punycode@^2.1.0', null ] +1758 verbose cache add spec punycode@^2.1.0 +1759 silly cache add parsed spec Result { +1759 silly cache add raw: 'punycode@^2.1.0', +1759 silly cache add scope: null, +1759 silly cache add name: 'punycode', +1759 silly cache add rawSpec: '^2.1.0', +1759 silly cache add spec: '>=2.1.0 <3.0.0', +1759 silly cache add type: 'range' } +1760 silly addNamed punycode@>=2.1.0 <3.0.0 +1761 verbose addNamed ">=2.1.0 <3.0.0" is a valid semver range for punycode +1762 silly addNameRange { name: 'punycode', range: '>=2.1.0 <3.0.0', hasData: false } +1763 silly mapToRegistry name punycode +1764 silly mapToRegistry using default registry +1765 silly mapToRegistry registry https://registry.npmjs.org/ +1766 silly mapToRegistry uri https://registry.npmjs.org/punycode +1767 verbose addNameRange registry:https://registry.npmjs.org/punycode not in flight; fetching +1768 verbose get https://registry.npmjs.org/punycode not expired, no request +1769 silly addNameRange number 2 { name: 'punycode', range: '>=2.1.0 <3.0.0', hasData: true } +1770 silly addNameRange versions [ 'punycode', +1770 silly addNameRange [ '0.0.1', +1770 silly addNameRange '0.0.2', +1770 silly addNameRange '0.0.1337', +1770 silly addNameRange '0.1.0', +1770 silly addNameRange '0.1.1', +1770 silly addNameRange '0.1.2', +1770 silly addNameRange '0.2.0', +1770 silly addNameRange '0.2.1', +1770 silly addNameRange '0.2.2', +1770 silly addNameRange '0.3.0', +1770 silly addNameRange '1.0.0', +1770 silly addNameRange '1.1.0', +1770 silly addNameRange '1.1.1', +1770 silly addNameRange '1.2.0', +1770 silly addNameRange '1.2.1', +1770 silly addNameRange '1.2.2', +1770 silly addNameRange '1.2.3', +1770 silly addNameRange '1.2.4', +1770 silly addNameRange '1.3.0', +1770 silly addNameRange '1.3.1', +1770 silly addNameRange '1.3.2', +1770 silly addNameRange '1.4.0', +1770 silly addNameRange '1.4.1', +1770 silly addNameRange '2.0.0', +1770 silly addNameRange '2.0.1', +1770 silly addNameRange '2.1.0', +1770 silly addNameRange '2.1.1' ] ] +1771 silly addNamed punycode@2.1.1 +1772 verbose addNamed "2.1.1" is a plain semver version for punycode +1773 silly cache afterAdd punycode@2.1.1 +1774 verbose afterAdd /home/christine/.npm/punycode/2.1.1/package/package.json not in flight; writing +1775 verbose afterAdd /home/christine/.npm/punycode/2.1.1/package/package.json written +1776 silly fetchNamedPackageData assert-plus +1777 silly mapToRegistry name assert-plus +1778 silly mapToRegistry using default registry +1779 silly mapToRegistry registry https://registry.npmjs.org/ +1780 silly mapToRegistry uri https://registry.npmjs.org/assert-plus +1781 silly fetchNamedPackageData jsprim +1782 silly mapToRegistry name jsprim +1783 silly mapToRegistry using default registry +1784 silly mapToRegistry registry https://registry.npmjs.org/ +1785 silly mapToRegistry uri https://registry.npmjs.org/jsprim +1786 silly fetchNamedPackageData sshpk +1787 silly mapToRegistry name sshpk +1788 silly mapToRegistry using default registry +1789 silly mapToRegistry registry https://registry.npmjs.org/ +1790 silly mapToRegistry uri https://registry.npmjs.org/sshpk +1791 verbose request uri https://registry.npmjs.org/assert-plus +1792 verbose request no auth needed +1793 info attempt registry request try #1 at 13:48:58 +1794 verbose etag W/"5f1c38f02647d4e0324c53fe90ea160c" +1795 verbose lastModified Fri, 13 Dec 2019 16:32:10 GMT +1796 http request GET https://registry.npmjs.org/assert-plus +1797 verbose request uri https://registry.npmjs.org/jsprim +1798 verbose request no auth needed +1799 info attempt registry request try #1 at 13:48:58 +1800 verbose etag W/"ec307a0d291a7abbcabe4ca63c75468e" +1801 verbose lastModified Fri, 13 Dec 2019 16:32:36 GMT +1802 http request GET https://registry.npmjs.org/jsprim +1803 verbose request uri https://registry.npmjs.org/sshpk +1804 verbose request no auth needed +1805 info attempt registry request try #1 at 13:48:58 +1806 verbose etag W/"e8e015112a9fbc16cc4a367405b14614" +1807 verbose lastModified Fri, 13 Dec 2019 16:33:04 GMT +1808 http request GET https://registry.npmjs.org/sshpk +1809 http 200 https://registry.npmjs.org/assert-plus +1810 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1810 verbose headers 'content-type': 'application/json', +1810 verbose headers 'transfer-encoding': 'chunked', +1810 verbose headers connection: 'keep-alive', +1810 verbose headers 'set-cookie': +1810 verbose headers [ '__cfduid=d7b1200d8018131cb680b33099b4da6111590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1810 verbose headers 'cf-ray': '59764fa9af0505e9-FRA', +1810 verbose headers age: '5654', +1810 verbose headers 'cache-control': 'public, max-age=300', +1810 verbose headers etag: 'W/"a6e598834cba689561f3d676e817bde6"', +1810 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT', +1810 verbose headers vary: 'accept-encoding, accept', +1810 verbose headers 'cf-cache-status': 'HIT', +1810 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1810 verbose headers server: 'cloudflare', +1810 verbose headers 'content-encoding': 'gzip', +1810 verbose headers 'cf-request-id': '02ddd01e0b000005e903b57200000001' } +1811 silly get cb [ 200, +1811 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1811 silly get 'content-type': 'application/json', +1811 silly get 'transfer-encoding': 'chunked', +1811 silly get connection: 'keep-alive', +1811 silly get 'set-cookie': +1811 silly get [ '__cfduid=d7b1200d8018131cb680b33099b4da6111590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1811 silly get 'cf-ray': '59764fa9af0505e9-FRA', +1811 silly get age: '5654', +1811 silly get 'cache-control': 'public, max-age=300', +1811 silly get etag: 'W/"a6e598834cba689561f3d676e817bde6"', +1811 silly get 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT', +1811 silly get vary: 'accept-encoding, accept', +1811 silly get 'cf-cache-status': 'HIT', +1811 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1811 silly get server: 'cloudflare', +1811 silly get 'content-encoding': 'gzip', +1811 silly get 'cf-request-id': '02ddd01e0b000005e903b57200000001' } ] +1812 verbose get saving assert-plus to /home/christine/.npm/registry.npmjs.org/assert-plus/.cache.json +1813 silly resolveWithNewModule assert-plus@1.0.0 checking installable status +1814 silly cache add args [ 'assert-plus@^1.0.0', null ] +1815 verbose cache add spec assert-plus@^1.0.0 +1816 silly cache add parsed spec Result { +1816 silly cache add raw: 'assert-plus@^1.0.0', +1816 silly cache add scope: null, +1816 silly cache add name: 'assert-plus', +1816 silly cache add rawSpec: '^1.0.0', +1816 silly cache add spec: '>=1.0.0 <2.0.0', +1816 silly cache add type: 'range' } +1817 silly addNamed assert-plus@>=1.0.0 <2.0.0 +1818 verbose addNamed ">=1.0.0 <2.0.0" is a valid semver range for assert-plus +1819 silly addNameRange { name: 'assert-plus', range: '>=1.0.0 <2.0.0', hasData: false } +1820 silly mapToRegistry name assert-plus +1821 silly mapToRegistry using default registry +1822 silly mapToRegistry registry https://registry.npmjs.org/ +1823 silly mapToRegistry uri https://registry.npmjs.org/assert-plus +1824 verbose addNameRange registry:https://registry.npmjs.org/assert-plus not in flight; fetching +1825 verbose get https://registry.npmjs.org/assert-plus not expired, no request +1826 silly addNameRange number 2 { name: 'assert-plus', range: '>=1.0.0 <2.0.0', hasData: true } +1827 silly addNameRange versions [ 'assert-plus', +1827 silly addNameRange [ '0.1.0', +1827 silly addNameRange '0.1.1', +1827 silly addNameRange '0.1.2', +1827 silly addNameRange '0.1.3', +1827 silly addNameRange '0.1.4', +1827 silly addNameRange '0.1.5', +1827 silly addNameRange '0.2.0', +1827 silly addNameRange '1.0.0' ] ] +1828 silly addNamed assert-plus@1.0.0 +1829 verbose addNamed "1.0.0" is a plain semver version for assert-plus +1830 silly cache afterAdd assert-plus@1.0.0 +1831 verbose afterAdd /home/christine/.npm/assert-plus/1.0.0/package/package.json not in flight; writing +1832 verbose afterAdd /home/christine/.npm/assert-plus/1.0.0/package/package.json written +1833 http 200 https://registry.npmjs.org/jsprim +1834 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1834 verbose headers 'content-type': 'application/json', +1834 verbose headers 'transfer-encoding': 'chunked', +1834 verbose headers connection: 'keep-alive', +1834 verbose headers 'set-cookie': +1834 verbose headers [ '__cfduid=d570054c58525c9612ff8b11e8fa974871590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1834 verbose headers 'cf-ray': '59764fa9bc0d176a-FRA', +1834 verbose headers age: '5654', +1834 verbose headers 'cache-control': 'public, max-age=300', +1834 verbose headers etag: 'W/"64e1b4713c2eacf5f810b5a6ad366cd9"', +1834 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:51 GMT', +1834 verbose headers vary: 'accept-encoding, accept', +1834 verbose headers 'cf-cache-status': 'HIT', +1834 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1834 verbose headers server: 'cloudflare', +1834 verbose headers 'content-encoding': 'gzip', +1834 verbose headers 'cf-request-id': '02ddd01e100000176a65ba5200000001' } +1835 silly get cb [ 200, +1835 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1835 silly get 'content-type': 'application/json', +1835 silly get 'transfer-encoding': 'chunked', +1835 silly get connection: 'keep-alive', +1835 silly get 'set-cookie': +1835 silly get [ '__cfduid=d570054c58525c9612ff8b11e8fa974871590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1835 silly get 'cf-ray': '59764fa9bc0d176a-FRA', +1835 silly get age: '5654', +1835 silly get 'cache-control': 'public, max-age=300', +1835 silly get etag: 'W/"64e1b4713c2eacf5f810b5a6ad366cd9"', +1835 silly get 'last-modified': 'Wed, 06 May 2020 14:47:51 GMT', +1835 silly get vary: 'accept-encoding, accept', +1835 silly get 'cf-cache-status': 'HIT', +1835 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1835 silly get server: 'cloudflare', +1835 silly get 'content-encoding': 'gzip', +1835 silly get 'cf-request-id': '02ddd01e100000176a65ba5200000001' } ] +1836 verbose get saving jsprim to /home/christine/.npm/registry.npmjs.org/jsprim/.cache.json +1837 silly resolveWithNewModule jsprim@1.4.1 checking installable status +1838 silly cache add args [ 'jsprim@^1.2.2', null ] +1839 verbose cache add spec jsprim@^1.2.2 +1840 silly cache add parsed spec Result { +1840 silly cache add raw: 'jsprim@^1.2.2', +1840 silly cache add scope: null, +1840 silly cache add name: 'jsprim', +1840 silly cache add rawSpec: '^1.2.2', +1840 silly cache add spec: '>=1.2.2 <2.0.0', +1840 silly cache add type: 'range' } +1841 silly addNamed jsprim@>=1.2.2 <2.0.0 +1842 verbose addNamed ">=1.2.2 <2.0.0" is a valid semver range for jsprim +1843 silly addNameRange { name: 'jsprim', range: '>=1.2.2 <2.0.0', hasData: false } +1844 silly mapToRegistry name jsprim +1845 silly mapToRegistry using default registry +1846 silly mapToRegistry registry https://registry.npmjs.org/ +1847 silly mapToRegistry uri https://registry.npmjs.org/jsprim +1848 verbose addNameRange registry:https://registry.npmjs.org/jsprim not in flight; fetching +1849 verbose get https://registry.npmjs.org/jsprim not expired, no request +1850 silly addNameRange number 2 { name: 'jsprim', range: '>=1.2.2 <2.0.0', hasData: true } +1851 silly addNameRange versions [ 'jsprim', +1851 silly addNameRange [ '0.0.1', +1851 silly addNameRange '0.0.2', +1851 silly addNameRange '0.0.3', +1851 silly addNameRange '0.0.4', +1851 silly addNameRange '0.0.5', +1851 silly addNameRange '0.1.0', +1851 silly addNameRange '0.2.0', +1851 silly addNameRange '0.3.0', +1851 silly addNameRange '0.3.1', +1851 silly addNameRange '0.4.0', +1851 silly addNameRange '0.5.0', +1851 silly addNameRange '0.5.1', +1851 silly addNameRange '0.6.0', +1851 silly addNameRange '0.6.1', +1851 silly addNameRange '0.7.0', +1851 silly addNameRange '0.8.0', +1851 silly addNameRange '1.0.0', +1851 silly addNameRange '1.1.0', +1851 silly addNameRange '1.2.0', +1851 silly addNameRange '1.2.1', +1851 silly addNameRange '1.2.2', +1851 silly addNameRange '1.3.0', +1851 silly addNameRange '1.3.1', +1851 silly addNameRange '1.4.0', +1851 silly addNameRange '1.4.1', +1851 silly addNameRange '2.0.0' ] ] +1852 silly addNamed jsprim@1.4.1 +1853 verbose addNamed "1.4.1" is a plain semver version for jsprim +1854 http 200 https://registry.npmjs.org/sshpk +1855 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1855 verbose headers 'content-type': 'application/json', +1855 verbose headers 'transfer-encoding': 'chunked', +1855 verbose headers connection: 'keep-alive', +1855 verbose headers 'set-cookie': +1855 verbose headers [ '__cfduid=def5a536cfc1c142382a82585aa4561c11590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1855 verbose headers 'cf-ray': '59764fa9bc65dfbb-FRA', +1855 verbose headers age: '5654', +1855 verbose headers 'cache-control': 'public, max-age=300', +1855 verbose headers etag: 'W/"4bb612bfd8ff73b94a8861a146b38953"', +1855 verbose headers 'last-modified': 'Wed, 06 May 2020 14:48:13 GMT', +1855 verbose headers vary: 'accept-encoding, accept', +1855 verbose headers 'cf-cache-status': 'HIT', +1855 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1855 verbose headers server: 'cloudflare', +1855 verbose headers 'content-encoding': 'gzip', +1855 verbose headers 'cf-request-id': '02ddd01e100000dfbb5fae5200000001' } +1856 silly get cb [ 200, +1856 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1856 silly get 'content-type': 'application/json', +1856 silly get 'transfer-encoding': 'chunked', +1856 silly get connection: 'keep-alive', +1856 silly get 'set-cookie': +1856 silly get [ '__cfduid=def5a536cfc1c142382a82585aa4561c11590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1856 silly get 'cf-ray': '59764fa9bc65dfbb-FRA', +1856 silly get age: '5654', +1856 silly get 'cache-control': 'public, max-age=300', +1856 silly get etag: 'W/"4bb612bfd8ff73b94a8861a146b38953"', +1856 silly get 'last-modified': 'Wed, 06 May 2020 14:48:13 GMT', +1856 silly get vary: 'accept-encoding, accept', +1856 silly get 'cf-cache-status': 'HIT', +1856 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1856 silly get server: 'cloudflare', +1856 silly get 'content-encoding': 'gzip', +1856 silly get 'cf-request-id': '02ddd01e100000dfbb5fae5200000001' } ] +1857 verbose get saving sshpk to /home/christine/.npm/registry.npmjs.org/sshpk/.cache.json +1858 silly cache afterAdd jsprim@1.4.1 +1859 verbose afterAdd /home/christine/.npm/jsprim/1.4.1/package/package.json not in flight; writing +1860 silly resolveWithNewModule sshpk@1.16.1 checking installable status +1861 silly cache add args [ 'sshpk@^1.7.0', null ] +1862 verbose cache add spec sshpk@^1.7.0 +1863 silly cache add parsed spec Result { +1863 silly cache add raw: 'sshpk@^1.7.0', +1863 silly cache add scope: null, +1863 silly cache add name: 'sshpk', +1863 silly cache add rawSpec: '^1.7.0', +1863 silly cache add spec: '>=1.7.0 <2.0.0', +1863 silly cache add type: 'range' } +1864 silly addNamed sshpk@>=1.7.0 <2.0.0 +1865 verbose addNamed ">=1.7.0 <2.0.0" is a valid semver range for sshpk +1866 silly addNameRange { name: 'sshpk', range: '>=1.7.0 <2.0.0', hasData: false } +1867 silly mapToRegistry name sshpk +1868 silly mapToRegistry using default registry +1869 silly mapToRegistry registry https://registry.npmjs.org/ +1870 silly mapToRegistry uri https://registry.npmjs.org/sshpk +1871 verbose addNameRange registry:https://registry.npmjs.org/sshpk not in flight; fetching +1872 verbose afterAdd /home/christine/.npm/jsprim/1.4.1/package/package.json written +1873 verbose get https://registry.npmjs.org/sshpk not expired, no request +1874 silly addNameRange number 2 { name: 'sshpk', range: '>=1.7.0 <2.0.0', hasData: true } +1875 silly addNameRange versions [ 'sshpk', +1875 silly addNameRange [ '1.0.0', +1875 silly addNameRange '1.0.1', +1875 silly addNameRange '1.0.2', +1875 silly addNameRange '1.0.3', +1875 silly addNameRange '1.0.4', +1875 silly addNameRange '1.1.0', +1875 silly addNameRange '1.2.0', +1875 silly addNameRange '1.2.1', +1875 silly addNameRange '1.3.0', +1875 silly addNameRange '1.4.0', +1875 silly addNameRange '1.4.1', +1875 silly addNameRange '1.4.2', +1875 silly addNameRange '1.4.3', +1875 silly addNameRange '1.4.4', +1875 silly addNameRange '1.4.5', +1875 silly addNameRange '1.4.6', +1875 silly addNameRange '1.4.7', +1875 silly addNameRange '1.5.0', +1875 silly addNameRange '1.5.1', +1875 silly addNameRange '1.6.0', +1875 silly addNameRange '1.6.1', +1875 silly addNameRange '1.6.2', +1875 silly addNameRange '1.7.0', +1875 silly addNameRange '1.7.1', +1875 silly addNameRange '1.7.2', +1875 silly addNameRange '1.7.3', +1875 silly addNameRange '1.7.4', +1875 silly addNameRange '1.8.0', +1875 silly addNameRange '1.8.1', +1875 silly addNameRange '1.8.2', +1875 silly addNameRange '1.8.3', +1875 silly addNameRange '1.9.0', +1875 silly addNameRange '1.9.1', +1875 silly addNameRange '1.9.2', +1875 silly addNameRange '1.10.0', +1875 silly addNameRange '1.10.1', +1875 silly addNameRange '1.10.2', +1875 silly addNameRange '1.11.0', +1875 silly addNameRange '1.13.0', +1875 silly addNameRange '1.13.1', +1875 silly addNameRange '1.13.2', +1875 silly addNameRange '1.14.1', +1875 silly addNameRange '1.14.2', +1875 silly addNameRange '1.15.0', +1875 silly addNameRange '1.15.1', +1875 silly addNameRange '1.15.2', +1875 silly addNameRange '1.16.0', +1875 silly addNameRange '1.16.1' ] ] +1876 silly addNamed sshpk@1.16.1 +1877 verbose addNamed "1.16.1" is a plain semver version for sshpk +1878 silly cache afterAdd sshpk@1.16.1 +1879 verbose afterAdd /home/christine/.npm/sshpk/1.16.1/package/package.json not in flight; writing +1880 verbose afterAdd /home/christine/.npm/sshpk/1.16.1/package/package.json written +1881 silly fetchNamedPackageData extsprintf +1882 silly mapToRegistry name extsprintf +1883 silly mapToRegistry using default registry +1884 silly mapToRegistry registry https://registry.npmjs.org/ +1885 silly mapToRegistry uri https://registry.npmjs.org/extsprintf +1886 silly fetchNamedPackageData json-schema +1887 silly mapToRegistry name json-schema +1888 silly mapToRegistry using default registry +1889 silly mapToRegistry registry https://registry.npmjs.org/ +1890 silly mapToRegistry uri https://registry.npmjs.org/json-schema +1891 silly fetchNamedPackageData verror +1892 silly mapToRegistry name verror +1893 silly mapToRegistry using default registry +1894 silly mapToRegistry registry https://registry.npmjs.org/ +1895 silly mapToRegistry uri https://registry.npmjs.org/verror +1896 verbose request uri https://registry.npmjs.org/json-schema +1897 verbose request no auth needed +1898 info attempt registry request try #1 at 13:48:58 +1899 verbose etag W/"5274dd0ff41b090868548552fd39da3b" +1900 verbose lastModified Fri, 06 Sep 2019 03:31:48 GMT +1901 http request GET https://registry.npmjs.org/json-schema +1902 verbose request uri https://registry.npmjs.org/extsprintf +1903 verbose request no auth needed +1904 info attempt registry request try #1 at 13:48:58 +1905 verbose etag W/"181f798a7717cf280fb342d9306fa973" +1906 verbose lastModified Fri, 13 Dec 2019 16:32:18 GMT +1907 http request GET https://registry.npmjs.org/extsprintf +1908 verbose request uri https://registry.npmjs.org/verror +1909 verbose request no auth needed +1910 info attempt registry request try #1 at 13:48:58 +1911 verbose etag W/"cee3cbe58715caedf23b4d5aa0f1317b" +1912 verbose lastModified Fri, 13 Dec 2019 16:33:19 GMT +1913 http request GET https://registry.npmjs.org/verror +1914 http 200 https://registry.npmjs.org/extsprintf +1915 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1915 verbose headers 'content-type': 'application/json', +1915 verbose headers 'transfer-encoding': 'chunked', +1915 verbose headers connection: 'keep-alive', +1915 verbose headers 'set-cookie': +1915 verbose headers [ '__cfduid=d97096327dc35362784756beebc4958ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1915 verbose headers 'cf-ray': '59764faa2855c2ae-FRA', +1915 verbose headers age: '5351', +1915 verbose headers 'cache-control': 'public, max-age=300', +1915 verbose headers etag: 'W/"c1458bfec410835c4eaea2e0b344814b"', +1915 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:29 GMT', +1915 verbose headers vary: 'accept-encoding, accept', +1915 verbose headers 'cf-cache-status': 'HIT', +1915 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1915 verbose headers server: 'cloudflare', +1915 verbose headers 'content-encoding': 'gzip', +1915 verbose headers 'cf-request-id': '02ddd01e550000c2aea018c200000001' } +1916 silly get cb [ 200, +1916 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1916 silly get 'content-type': 'application/json', +1916 silly get 'transfer-encoding': 'chunked', +1916 silly get connection: 'keep-alive', +1916 silly get 'set-cookie': +1916 silly get [ '__cfduid=d97096327dc35362784756beebc4958ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1916 silly get 'cf-ray': '59764faa2855c2ae-FRA', +1916 silly get age: '5351', +1916 silly get 'cache-control': 'public, max-age=300', +1916 silly get etag: 'W/"c1458bfec410835c4eaea2e0b344814b"', +1916 silly get 'last-modified': 'Wed, 06 May 2020 14:47:29 GMT', +1916 silly get vary: 'accept-encoding, accept', +1916 silly get 'cf-cache-status': 'HIT', +1916 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1916 silly get server: 'cloudflare', +1916 silly get 'content-encoding': 'gzip', +1916 silly get 'cf-request-id': '02ddd01e550000c2aea018c200000001' } ] +1917 verbose get saving extsprintf to /home/christine/.npm/registry.npmjs.org/extsprintf/.cache.json +1918 silly resolveWithNewModule extsprintf@1.3.0 checking installable status +1919 silly cache add args [ 'extsprintf@1.3.0', null ] +1920 verbose cache add spec extsprintf@1.3.0 +1921 silly cache add parsed spec Result { +1921 silly cache add raw: 'extsprintf@1.3.0', +1921 silly cache add scope: null, +1921 silly cache add name: 'extsprintf', +1921 silly cache add rawSpec: '1.3.0', +1921 silly cache add spec: '1.3.0', +1921 silly cache add type: 'version' } +1922 silly addNamed extsprintf@1.3.0 +1923 verbose addNamed "1.3.0" is a plain semver version for extsprintf +1924 silly mapToRegistry name extsprintf +1925 silly mapToRegistry using default registry +1926 silly mapToRegistry registry https://registry.npmjs.org/ +1927 silly mapToRegistry uri https://registry.npmjs.org/extsprintf +1928 verbose addNameVersion registry:https://registry.npmjs.org/extsprintf not in flight; fetching +1929 verbose get https://registry.npmjs.org/extsprintf not expired, no request +1930 silly cache afterAdd extsprintf@1.3.0 +1931 verbose afterAdd /home/christine/.npm/extsprintf/1.3.0/package/package.json not in flight; writing +1932 verbose afterAdd /home/christine/.npm/extsprintf/1.3.0/package/package.json written +1933 http 200 https://registry.npmjs.org/verror +1934 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1934 verbose headers 'content-type': 'application/json', +1934 verbose headers 'transfer-encoding': 'chunked', +1934 verbose headers connection: 'keep-alive', +1934 verbose headers 'set-cookie': +1934 verbose headers [ '__cfduid=dddfaf86196e34967260afba6c78f92301590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1934 verbose headers 'cf-ray': '59764faa2b02d6e9-FRA', +1934 verbose headers age: '5351', +1934 verbose headers 'cache-control': 'public, max-age=300', +1934 verbose headers etag: 'W/"2464db9fac3b8d5a76540c0581baa37d"', +1934 verbose headers 'last-modified': 'Wed, 06 May 2020 14:48:30 GMT', +1934 verbose headers vary: 'accept-encoding, accept', +1934 verbose headers 'cf-cache-status': 'HIT', +1934 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1934 verbose headers server: 'cloudflare', +1934 verbose headers 'content-encoding': 'gzip', +1934 verbose headers 'cf-request-id': '02ddd01e550000d6e975b63200000001' } +1935 silly get cb [ 200, +1935 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1935 silly get 'content-type': 'application/json', +1935 silly get 'transfer-encoding': 'chunked', +1935 silly get connection: 'keep-alive', +1935 silly get 'set-cookie': +1935 silly get [ '__cfduid=dddfaf86196e34967260afba6c78f92301590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1935 silly get 'cf-ray': '59764faa2b02d6e9-FRA', +1935 silly get age: '5351', +1935 silly get 'cache-control': 'public, max-age=300', +1935 silly get etag: 'W/"2464db9fac3b8d5a76540c0581baa37d"', +1935 silly get 'last-modified': 'Wed, 06 May 2020 14:48:30 GMT', +1935 silly get vary: 'accept-encoding, accept', +1935 silly get 'cf-cache-status': 'HIT', +1935 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1935 silly get server: 'cloudflare', +1935 silly get 'content-encoding': 'gzip', +1935 silly get 'cf-request-id': '02ddd01e550000d6e975b63200000001' } ] +1936 verbose get saving verror to /home/christine/.npm/registry.npmjs.org/verror/.cache.json +1937 silly resolveWithNewModule verror@1.10.0 checking installable status +1938 silly cache add args [ 'verror@1.10.0', null ] +1939 verbose cache add spec verror@1.10.0 +1940 silly cache add parsed spec Result { +1940 silly cache add raw: 'verror@1.10.0', +1940 silly cache add scope: null, +1940 silly cache add name: 'verror', +1940 silly cache add rawSpec: '1.10.0', +1940 silly cache add spec: '1.10.0', +1940 silly cache add type: 'version' } +1941 silly addNamed verror@1.10.0 +1942 verbose addNamed "1.10.0" is a plain semver version for verror +1943 silly mapToRegistry name verror +1944 silly mapToRegistry using default registry +1945 silly mapToRegistry registry https://registry.npmjs.org/ +1946 silly mapToRegistry uri https://registry.npmjs.org/verror +1947 verbose addNameVersion registry:https://registry.npmjs.org/verror not in flight; fetching +1948 verbose get https://registry.npmjs.org/verror not expired, no request +1949 http 304 https://registry.npmjs.org/json-schema +1950 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1950 verbose headers connection: 'keep-alive', +1950 verbose headers 'set-cookie': +1950 verbose headers [ '__cfduid=dcd1e19ee0a127106f70d3cbc3e6456db1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1950 verbose headers 'cf-ray': '59764faa2c451f2d-FRA', +1950 verbose headers age: '5351', +1950 verbose headers 'cache-control': 'public, max-age=300', +1950 verbose headers etag: '"5274dd0ff41b090868548552fd39da3b"', +1950 verbose headers 'last-modified': 'Fri, 06 Sep 2019 03:31:48 GMT', +1950 verbose headers vary: 'Accept-Encoding', +1950 verbose headers 'cf-cache-status': 'HIT', +1950 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1950 verbose headers server: 'cloudflare', +1950 verbose headers 'cf-request-id': '02ddd01e5500001f2df5221200000001' } +1951 silly get cb [ 304, +1951 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1951 silly get connection: 'keep-alive', +1951 silly get 'set-cookie': +1951 silly get [ '__cfduid=dcd1e19ee0a127106f70d3cbc3e6456db1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1951 silly get 'cf-ray': '59764faa2c451f2d-FRA', +1951 silly get age: '5351', +1951 silly get 'cache-control': 'public, max-age=300', +1951 silly get etag: '"5274dd0ff41b090868548552fd39da3b"', +1951 silly get 'last-modified': 'Fri, 06 Sep 2019 03:31:48 GMT', +1951 silly get vary: 'Accept-Encoding', +1951 silly get 'cf-cache-status': 'HIT', +1951 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1951 silly get server: 'cloudflare', +1951 silly get 'cf-request-id': '02ddd01e5500001f2df5221200000001' } ] +1952 verbose etag https://registry.npmjs.org/json-schema from cache +1953 verbose get saving json-schema to /home/christine/.npm/registry.npmjs.org/json-schema/.cache.json +1954 silly cache afterAdd verror@1.10.0 +1955 verbose afterAdd /home/christine/.npm/verror/1.10.0/package/package.json not in flight; writing +1956 silly resolveWithNewModule json-schema@0.2.3 checking installable status +1957 silly cache add args [ 'json-schema@0.2.3', null ] +1958 verbose cache add spec json-schema@0.2.3 +1959 silly cache add parsed spec Result { +1959 silly cache add raw: 'json-schema@0.2.3', +1959 silly cache add scope: null, +1959 silly cache add name: 'json-schema', +1959 silly cache add rawSpec: '0.2.3', +1959 silly cache add spec: '0.2.3', +1959 silly cache add type: 'version' } +1960 silly addNamed json-schema@0.2.3 +1961 verbose addNamed "0.2.3" is a plain semver version for json-schema +1962 silly mapToRegistry name json-schema +1963 silly mapToRegistry using default registry +1964 silly mapToRegistry registry https://registry.npmjs.org/ +1965 silly mapToRegistry uri https://registry.npmjs.org/json-schema +1966 verbose addNameVersion registry:https://registry.npmjs.org/json-schema not in flight; fetching +1967 verbose afterAdd /home/christine/.npm/verror/1.10.0/package/package.json written +1968 verbose get https://registry.npmjs.org/json-schema not expired, no request +1969 silly cache afterAdd json-schema@0.2.3 +1970 verbose afterAdd /home/christine/.npm/json-schema/0.2.3/package/package.json not in flight; writing +1971 verbose afterAdd /home/christine/.npm/json-schema/0.2.3/package/package.json written +1972 silly fetchNamedPackageData core-util-is +1973 silly mapToRegistry name core-util-is +1974 silly mapToRegistry using default registry +1975 silly mapToRegistry registry https://registry.npmjs.org/ +1976 silly mapToRegistry uri https://registry.npmjs.org/core-util-is +1977 verbose request uri https://registry.npmjs.org/core-util-is +1978 verbose request no auth needed +1979 info attempt registry request try #1 at 13:48:58 +1980 verbose etag W/"8076d16a76bac5764f6fda9911b2b501" +1981 verbose lastModified Sat, 26 May 2018 21:08:01 GMT +1982 http request GET https://registry.npmjs.org/core-util-is +1983 http 304 https://registry.npmjs.org/core-util-is +1984 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +1984 verbose headers connection: 'keep-alive', +1984 verbose headers 'set-cookie': +1984 verbose headers [ '__cfduid=dd8c554223c8c1f8d1054bd78bd816a791590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1984 verbose headers 'cf-ray': '59764faa6c9405fd-FRA', +1984 verbose headers age: '5358', +1984 verbose headers 'cache-control': 'public, max-age=300', +1984 verbose headers etag: '"8076d16a76bac5764f6fda9911b2b501"', +1984 verbose headers 'last-modified': 'Sat, 26 May 2018 21:08:01 GMT', +1984 verbose headers vary: 'Accept-Encoding', +1984 verbose headers 'cf-cache-status': 'HIT', +1984 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1984 verbose headers server: 'cloudflare', +1984 verbose headers 'cf-request-id': '02ddd01e80000005fd8daad200000001' } +1985 silly get cb [ 304, +1985 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +1985 silly get connection: 'keep-alive', +1985 silly get 'set-cookie': +1985 silly get [ '__cfduid=dd8c554223c8c1f8d1054bd78bd816a791590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +1985 silly get 'cf-ray': '59764faa6c9405fd-FRA', +1985 silly get age: '5358', +1985 silly get 'cache-control': 'public, max-age=300', +1985 silly get etag: '"8076d16a76bac5764f6fda9911b2b501"', +1985 silly get 'last-modified': 'Sat, 26 May 2018 21:08:01 GMT', +1985 silly get vary: 'Accept-Encoding', +1985 silly get 'cf-cache-status': 'HIT', +1985 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +1985 silly get server: 'cloudflare', +1985 silly get 'cf-request-id': '02ddd01e80000005fd8daad200000001' } ] +1986 verbose etag https://registry.npmjs.org/core-util-is from cache +1987 verbose get saving core-util-is to /home/christine/.npm/registry.npmjs.org/core-util-is/.cache.json +1988 silly resolveWithNewModule core-util-is@1.0.2 checking installable status +1989 silly cache add args [ 'core-util-is@1.0.2', null ] +1990 verbose cache add spec core-util-is@1.0.2 +1991 silly cache add parsed spec Result { +1991 silly cache add raw: 'core-util-is@1.0.2', +1991 silly cache add scope: null, +1991 silly cache add name: 'core-util-is', +1991 silly cache add rawSpec: '1.0.2', +1991 silly cache add spec: '1.0.2', +1991 silly cache add type: 'version' } +1992 silly addNamed core-util-is@1.0.2 +1993 verbose addNamed "1.0.2" is a plain semver version for core-util-is +1994 silly mapToRegistry name core-util-is +1995 silly mapToRegistry using default registry +1996 silly mapToRegistry registry https://registry.npmjs.org/ +1997 silly mapToRegistry uri https://registry.npmjs.org/core-util-is +1998 verbose addNameVersion registry:https://registry.npmjs.org/core-util-is not in flight; fetching +1999 verbose get https://registry.npmjs.org/core-util-is not expired, no request +2000 silly cache afterAdd core-util-is@1.0.2 +2001 verbose afterAdd /home/christine/.npm/core-util-is/1.0.2/package/package.json not in flight; writing +2002 verbose afterAdd /home/christine/.npm/core-util-is/1.0.2/package/package.json written +2003 silly fetchNamedPackageData asn1 +2004 silly mapToRegistry name asn1 +2005 silly mapToRegistry using default registry +2006 silly mapToRegistry registry https://registry.npmjs.org/ +2007 silly mapToRegistry uri https://registry.npmjs.org/asn1 +2008 silly fetchNamedPackageData dashdash +2009 silly mapToRegistry name dashdash +2010 silly mapToRegistry using default registry +2011 silly mapToRegistry registry https://registry.npmjs.org/ +2012 silly mapToRegistry uri https://registry.npmjs.org/dashdash +2013 silly fetchNamedPackageData getpass +2014 silly mapToRegistry name getpass +2015 silly mapToRegistry using default registry +2016 silly mapToRegistry registry https://registry.npmjs.org/ +2017 silly mapToRegistry uri https://registry.npmjs.org/getpass +2018 silly fetchNamedPackageData safer-buffer +2019 silly mapToRegistry name safer-buffer +2020 silly mapToRegistry using default registry +2021 silly mapToRegistry registry https://registry.npmjs.org/ +2022 silly mapToRegistry uri https://registry.npmjs.org/safer-buffer +2023 silly fetchNamedPackageData jsbn +2024 silly mapToRegistry name jsbn +2025 silly mapToRegistry using default registry +2026 silly mapToRegistry registry https://registry.npmjs.org/ +2027 silly mapToRegistry uri https://registry.npmjs.org/jsbn +2028 silly fetchNamedPackageData tweetnacl +2029 silly mapToRegistry name tweetnacl +2030 silly mapToRegistry using default registry +2031 silly mapToRegistry registry https://registry.npmjs.org/ +2032 silly mapToRegistry uri https://registry.npmjs.org/tweetnacl +2033 silly fetchNamedPackageData ecc-jsbn +2034 silly mapToRegistry name ecc-jsbn +2035 silly mapToRegistry using default registry +2036 silly mapToRegistry registry https://registry.npmjs.org/ +2037 silly mapToRegistry uri https://registry.npmjs.org/ecc-jsbn +2038 silly fetchNamedPackageData bcrypt-pbkdf +2039 silly mapToRegistry name bcrypt-pbkdf +2040 silly mapToRegistry using default registry +2041 silly mapToRegistry registry https://registry.npmjs.org/ +2042 silly mapToRegistry uri https://registry.npmjs.org/bcrypt-pbkdf +2043 verbose request uri https://registry.npmjs.org/asn1 +2044 verbose request no auth needed +2045 info attempt registry request try #1 at 13:48:58 +2046 verbose etag W/"de813efa4f95d8b4547fcf05d55dc504" +2047 verbose lastModified Fri, 13 Dec 2019 16:32:09 GMT +2048 http request GET https://registry.npmjs.org/asn1 +2049 verbose request uri https://registry.npmjs.org/jsbn +2050 verbose request no auth needed +2051 info attempt registry request try #1 at 13:48:58 +2052 verbose etag W/"0611ae2a6c0b557511e766ff564197a0" +2053 verbose lastModified Sun, 27 May 2018 05:34:52 GMT +2054 http request GET https://registry.npmjs.org/jsbn +2055 verbose request uri https://registry.npmjs.org/getpass +2056 verbose request no auth needed +2057 info attempt registry request try #1 at 13:48:58 +2058 verbose etag W/"cbefe53bd31f73e662e9120b48930d2f" +2059 verbose lastModified Fri, 13 Dec 2019 16:32:27 GMT +2060 http request GET https://registry.npmjs.org/getpass +2061 verbose request uri https://registry.npmjs.org/safer-buffer +2062 verbose request no auth needed +2063 info attempt registry request try #1 at 13:48:58 +2064 verbose etag W/"af6bd5bd8c6f8fc6f2baa03c0e1637e9" +2065 verbose lastModified Sun, 27 May 2018 16:29:44 GMT +2066 http request GET https://registry.npmjs.org/safer-buffer +2067 verbose request uri https://registry.npmjs.org/ecc-jsbn +2068 verbose request no auth needed +2069 info attempt registry request try #1 at 13:48:58 +2070 verbose etag W/"972b128f4c15e931ec8836237cce37e0" +2071 verbose lastModified Sun, 29 Jul 2018 17:44:41 GMT +2072 http request GET https://registry.npmjs.org/ecc-jsbn +2073 verbose request uri https://registry.npmjs.org/dashdash +2074 verbose request no auth needed +2075 info attempt registry request try #1 at 13:48:58 +2076 verbose etag W/"4ed0f11669a0fcb66513077f2f321ea9" +2077 verbose lastModified Sat, 26 May 2018 21:43:37 GMT +2078 http request GET https://registry.npmjs.org/dashdash +2079 verbose request uri https://registry.npmjs.org/tweetnacl +2080 verbose request no auth needed +2081 info attempt registry request try #1 at 13:48:58 +2082 verbose etag W/"fbf94e62e5226cbf0f67805b6d51d6fe" +2083 verbose lastModified Thu, 16 Jan 2020 19:29:00 GMT +2084 http request GET https://registry.npmjs.org/tweetnacl +2085 verbose request uri https://registry.npmjs.org/bcrypt-pbkdf +2086 verbose request no auth needed +2087 info attempt registry request try #1 at 13:48:58 +2088 verbose etag W/"46ae03958b9d75cded3b6f53d3277a12" +2089 verbose lastModified Fri, 13 Dec 2019 16:32:11 GMT +2090 http request GET https://registry.npmjs.org/bcrypt-pbkdf +2091 http 304 https://registry.npmjs.org/jsbn +2092 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +2092 verbose headers connection: 'keep-alive', +2092 verbose headers 'set-cookie': +2092 verbose headers [ '__cfduid=d7325b855bbed19ce898226d1ffb9a3291590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2092 verbose headers 'cf-ray': '59764faad8fd325c-FRA', +2092 verbose headers age: '5657', +2092 verbose headers 'cache-control': 'public, max-age=300', +2092 verbose headers etag: '"0611ae2a6c0b557511e766ff564197a0"', +2092 verbose headers 'last-modified': 'Sun, 27 May 2018 05:34:52 GMT', +2092 verbose headers vary: 'Accept-Encoding', +2092 verbose headers 'cf-cache-status': 'HIT', +2092 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2092 verbose headers server: 'cloudflare', +2092 verbose headers 'cf-request-id': '02ddd01ec40000325c4c86d200000001' } +2093 silly get cb [ 304, +2093 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +2093 silly get connection: 'keep-alive', +2093 silly get 'set-cookie': +2093 silly get [ '__cfduid=d7325b855bbed19ce898226d1ffb9a3291590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2093 silly get 'cf-ray': '59764faad8fd325c-FRA', +2093 silly get age: '5657', +2093 silly get 'cache-control': 'public, max-age=300', +2093 silly get etag: '"0611ae2a6c0b557511e766ff564197a0"', +2093 silly get 'last-modified': 'Sun, 27 May 2018 05:34:52 GMT', +2093 silly get vary: 'Accept-Encoding', +2093 silly get 'cf-cache-status': 'HIT', +2093 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2093 silly get server: 'cloudflare', +2093 silly get 'cf-request-id': '02ddd01ec40000325c4c86d200000001' } ] +2094 verbose etag https://registry.npmjs.org/jsbn from cache +2095 verbose get saving jsbn to /home/christine/.npm/registry.npmjs.org/jsbn/.cache.json +2096 silly resolveWithNewModule jsbn@0.1.1 checking installable status +2097 silly cache add args [ 'jsbn@~0.1.0', null ] +2098 verbose cache add spec jsbn@~0.1.0 +2099 silly cache add parsed spec Result { +2099 silly cache add raw: 'jsbn@~0.1.0', +2099 silly cache add scope: null, +2099 silly cache add name: 'jsbn', +2099 silly cache add rawSpec: '~0.1.0', +2099 silly cache add spec: '>=0.1.0 <0.2.0', +2099 silly cache add type: 'range' } +2100 silly addNamed jsbn@>=0.1.0 <0.2.0 +2101 verbose addNamed ">=0.1.0 <0.2.0" is a valid semver range for jsbn +2102 silly addNameRange { name: 'jsbn', range: '>=0.1.0 <0.2.0', hasData: false } +2103 silly mapToRegistry name jsbn +2104 silly mapToRegistry using default registry +2105 silly mapToRegistry registry https://registry.npmjs.org/ +2106 silly mapToRegistry uri https://registry.npmjs.org/jsbn +2107 verbose addNameRange registry:https://registry.npmjs.org/jsbn not in flight; fetching +2108 http 304 https://registry.npmjs.org/safer-buffer +2109 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +2109 verbose headers connection: 'keep-alive', +2109 verbose headers 'set-cookie': +2109 verbose headers [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2109 verbose headers 'cf-ray': '59764faadb96648b-FRA', +2109 verbose headers age: '5660', +2109 verbose headers 'cache-control': 'public, max-age=300', +2109 verbose headers etag: '"af6bd5bd8c6f8fc6f2baa03c0e1637e9"', +2109 verbose headers 'last-modified': 'Sun, 27 May 2018 16:29:44 GMT', +2109 verbose headers vary: 'Accept-Encoding', +2109 verbose headers 'cf-cache-status': 'HIT', +2109 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2109 verbose headers server: 'cloudflare', +2109 verbose headers 'cf-request-id': '02ddd01ec80000648bda035200000001' } +2110 silly get cb [ 304, +2110 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +2110 silly get connection: 'keep-alive', +2110 silly get 'set-cookie': +2110 silly get [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2110 silly get 'cf-ray': '59764faadb96648b-FRA', +2110 silly get age: '5660', +2110 silly get 'cache-control': 'public, max-age=300', +2110 silly get etag: '"af6bd5bd8c6f8fc6f2baa03c0e1637e9"', +2110 silly get 'last-modified': 'Sun, 27 May 2018 16:29:44 GMT', +2110 silly get vary: 'Accept-Encoding', +2110 silly get 'cf-cache-status': 'HIT', +2110 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2110 silly get server: 'cloudflare', +2110 silly get 'cf-request-id': '02ddd01ec80000648bda035200000001' } ] +2111 verbose etag https://registry.npmjs.org/safer-buffer from cache +2112 verbose get saving safer-buffer to /home/christine/.npm/registry.npmjs.org/safer-buffer/.cache.json +2113 http 200 https://registry.npmjs.org/getpass +2114 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +2114 verbose headers 'content-type': 'application/json', +2114 verbose headers 'transfer-encoding': 'chunked', +2114 verbose headers connection: 'keep-alive', +2114 verbose headers 'set-cookie': +2114 verbose headers [ '__cfduid=dd010058b9e3e0b8be866b1c539f3a13d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2114 verbose headers 'cf-ray': '59764faadf226347-FRA', +2114 verbose headers age: '5656', +2114 verbose headers 'cache-control': 'public, max-age=300', +2114 verbose headers etag: 'W/"869ca13d164a27967315d623e8ce7ed7"', +2114 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:37 GMT', +2114 verbose headers vary: 'accept-encoding, accept', +2114 verbose headers 'cf-cache-status': 'HIT', +2114 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2114 verbose headers server: 'cloudflare', +2114 verbose headers 'content-encoding': 'gzip', +2114 verbose headers 'cf-request-id': '02ddd01ec800006347e88e6200000001' } +2115 silly get cb [ 200, +2115 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +2115 silly get 'content-type': 'application/json', +2115 silly get 'transfer-encoding': 'chunked', +2115 silly get connection: 'keep-alive', +2115 silly get 'set-cookie': +2115 silly get [ '__cfduid=dd010058b9e3e0b8be866b1c539f3a13d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2115 silly get 'cf-ray': '59764faadf226347-FRA', +2115 silly get age: '5656', +2115 silly get 'cache-control': 'public, max-age=300', +2115 silly get etag: 'W/"869ca13d164a27967315d623e8ce7ed7"', +2115 silly get 'last-modified': 'Wed, 06 May 2020 14:47:37 GMT', +2115 silly get vary: 'accept-encoding, accept', +2115 silly get 'cf-cache-status': 'HIT', +2115 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2115 silly get server: 'cloudflare', +2115 silly get 'content-encoding': 'gzip', +2115 silly get 'cf-request-id': '02ddd01ec800006347e88e6200000001' } ] +2116 verbose get saving getpass to /home/christine/.npm/registry.npmjs.org/getpass/.cache.json +2117 http 200 https://registry.npmjs.org/bcrypt-pbkdf +2118 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +2118 verbose headers 'content-type': 'application/json', +2118 verbose headers 'transfer-encoding': 'chunked', +2118 verbose headers connection: 'keep-alive', +2118 verbose headers 'set-cookie': +2118 verbose headers [ '__cfduid=d0e932d8ab348df1bf36d2b5c827b275c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2118 verbose headers 'cf-ray': '59764faaef896413-FRA', +2118 verbose headers age: '5653', +2118 verbose headers 'cache-control': 'public, max-age=300', +2118 verbose headers etag: 'W/"f08505ab6749543a27b96d63fd64d6c1"', +2118 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT', +2118 verbose headers vary: 'accept-encoding, accept', +2118 verbose headers 'cf-cache-status': 'HIT', +2118 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2118 verbose headers server: 'cloudflare', +2118 verbose headers 'content-encoding': 'gzip', +2118 verbose headers 'cf-request-id': '02ddd01ece000064135f93f200000001' } +2119 silly get cb [ 200, +2119 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +2119 silly get 'content-type': 'application/json', +2119 silly get 'transfer-encoding': 'chunked', +2119 silly get connection: 'keep-alive', +2119 silly get 'set-cookie': +2119 silly get [ '__cfduid=d0e932d8ab348df1bf36d2b5c827b275c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2119 silly get 'cf-ray': '59764faaef896413-FRA', +2119 silly get age: '5653', +2119 silly get 'cache-control': 'public, max-age=300', +2119 silly get etag: 'W/"f08505ab6749543a27b96d63fd64d6c1"', +2119 silly get 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT', +2119 silly get vary: 'accept-encoding, accept', +2119 silly get 'cf-cache-status': 'HIT', +2119 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2119 silly get server: 'cloudflare', +2119 silly get 'content-encoding': 'gzip', +2119 silly get 'cf-request-id': '02ddd01ece000064135f93f200000001' } ] +2120 verbose get saving bcrypt-pbkdf to /home/christine/.npm/registry.npmjs.org/bcrypt-pbkdf/.cache.json +2121 http 200 https://registry.npmjs.org/asn1 +2122 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +2122 verbose headers 'content-type': 'application/json', +2122 verbose headers 'transfer-encoding': 'chunked', +2122 verbose headers connection: 'keep-alive', +2122 verbose headers 'set-cookie': +2122 verbose headers [ '__cfduid=d2a12158e0b1816dc3511d38bce84223a1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2122 verbose headers 'cf-ray': '59764faadddcc272-FRA', +2122 verbose headers age: '5652', +2122 verbose headers 'cache-control': 'public, max-age=300', +2122 verbose headers etag: 'W/"53988a6250256bd0f9e9b253aaf39e0b"', +2122 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:19 GMT', +2122 verbose headers vary: 'accept-encoding, accept', +2122 verbose headers 'cf-cache-status': 'HIT', +2122 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2122 verbose headers server: 'cloudflare', +2122 verbose headers 'content-encoding': 'gzip', +2122 verbose headers 'cf-request-id': '02ddd01ec40000c272388f9200000001' } +2123 silly get cb [ 200, +2123 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +2123 silly get 'content-type': 'application/json', +2123 silly get 'transfer-encoding': 'chunked', +2123 silly get connection: 'keep-alive', +2123 silly get 'set-cookie': +2123 silly get [ '__cfduid=d2a12158e0b1816dc3511d38bce84223a1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2123 silly get 'cf-ray': '59764faadddcc272-FRA', +2123 silly get age: '5652', +2123 silly get 'cache-control': 'public, max-age=300', +2123 silly get etag: 'W/"53988a6250256bd0f9e9b253aaf39e0b"', +2123 silly get 'last-modified': 'Wed, 06 May 2020 14:47:19 GMT', +2123 silly get vary: 'accept-encoding, accept', +2123 silly get 'cf-cache-status': 'HIT', +2123 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2123 silly get server: 'cloudflare', +2123 silly get 'content-encoding': 'gzip', +2123 silly get 'cf-request-id': '02ddd01ec40000c272388f9200000001' } ] +2124 verbose get saving asn1 to /home/christine/.npm/registry.npmjs.org/asn1/.cache.json +2125 verbose get https://registry.npmjs.org/jsbn not expired, no request +2126 silly addNameRange number 2 { name: 'jsbn', range: '>=0.1.0 <0.2.0', hasData: true } +2127 silly addNameRange versions [ 'jsbn', [ '0.0.0', '0.1.0', '0.1.1', '1.1.0' ] ] +2128 silly addNamed jsbn@0.1.1 +2129 verbose addNamed "0.1.1" is a plain semver version for jsbn +2130 http 304 https://registry.npmjs.org/dashdash +2131 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +2131 verbose headers connection: 'keep-alive', +2131 verbose headers 'set-cookie': +2131 verbose headers [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2131 verbose headers 'cf-ray': '59764faaeb21175a-FRA', +2131 verbose headers age: '5350', +2131 verbose headers 'cache-control': 'public, max-age=300', +2131 verbose headers etag: '"4ed0f11669a0fcb66513077f2f321ea9"', +2131 verbose headers 'last-modified': 'Sat, 26 May 2018 21:43:37 GMT', +2131 verbose headers vary: 'Accept-Encoding', +2131 verbose headers 'cf-cache-status': 'HIT', +2131 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2131 verbose headers server: 'cloudflare', +2131 verbose headers 'cf-request-id': '02ddd01ece0000175a1e236200000001' } +2132 silly get cb [ 304, +2132 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +2132 silly get connection: 'keep-alive', +2132 silly get 'set-cookie': +2132 silly get [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2132 silly get 'cf-ray': '59764faaeb21175a-FRA', +2132 silly get age: '5350', +2132 silly get 'cache-control': 'public, max-age=300', +2132 silly get etag: '"4ed0f11669a0fcb66513077f2f321ea9"', +2132 silly get 'last-modified': 'Sat, 26 May 2018 21:43:37 GMT', +2132 silly get vary: 'Accept-Encoding', +2132 silly get 'cf-cache-status': 'HIT', +2132 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2132 silly get server: 'cloudflare', +2132 silly get 'cf-request-id': '02ddd01ece0000175a1e236200000001' } ] +2133 verbose etag https://registry.npmjs.org/dashdash from cache +2134 verbose get saving dashdash to /home/christine/.npm/registry.npmjs.org/dashdash/.cache.json +2135 silly resolveWithNewModule safer-buffer@2.1.2 checking installable status +2136 silly cache add args [ 'safer-buffer@^2.0.2', null ] +2137 verbose cache add spec safer-buffer@^2.0.2 +2138 silly cache add parsed spec Result { +2138 silly cache add raw: 'safer-buffer@^2.0.2', +2138 silly cache add scope: null, +2138 silly cache add name: 'safer-buffer', +2138 silly cache add rawSpec: '^2.0.2', +2138 silly cache add spec: '>=2.0.2 <3.0.0', +2138 silly cache add type: 'range' } +2139 silly addNamed safer-buffer@>=2.0.2 <3.0.0 +2140 verbose addNamed ">=2.0.2 <3.0.0" is a valid semver range for safer-buffer +2141 silly addNameRange { name: 'safer-buffer', range: '>=2.0.2 <3.0.0', hasData: false } +2142 silly mapToRegistry name safer-buffer +2143 silly mapToRegistry using default registry +2144 silly mapToRegistry registry https://registry.npmjs.org/ +2145 silly mapToRegistry uri https://registry.npmjs.org/safer-buffer +2146 verbose addNameRange registry:https://registry.npmjs.org/safer-buffer not in flight; fetching +2147 silly resolveWithNewModule getpass@0.1.7 checking installable status +2148 silly cache add args [ 'getpass@^0.1.1', null ] +2149 verbose cache add spec getpass@^0.1.1 +2150 silly cache add parsed spec Result { +2150 silly cache add raw: 'getpass@^0.1.1', +2150 silly cache add scope: null, +2150 silly cache add name: 'getpass', +2150 silly cache add rawSpec: '^0.1.1', +2150 silly cache add spec: '>=0.1.1 <0.2.0', +2150 silly cache add type: 'range' } +2151 silly addNamed getpass@>=0.1.1 <0.2.0 +2152 verbose addNamed ">=0.1.1 <0.2.0" is a valid semver range for getpass +2153 silly addNameRange { name: 'getpass', range: '>=0.1.1 <0.2.0', hasData: false } +2154 silly mapToRegistry name getpass +2155 silly mapToRegistry using default registry +2156 silly mapToRegistry registry https://registry.npmjs.org/ +2157 silly mapToRegistry uri https://registry.npmjs.org/getpass +2158 verbose addNameRange registry:https://registry.npmjs.org/getpass not in flight; fetching +2159 silly resolveWithNewModule bcrypt-pbkdf@1.0.2 checking installable status +2160 silly cache add args [ 'bcrypt-pbkdf@^1.0.0', null ] +2161 verbose cache add spec bcrypt-pbkdf@^1.0.0 +2162 silly cache add parsed spec Result { +2162 silly cache add raw: 'bcrypt-pbkdf@^1.0.0', +2162 silly cache add scope: null, +2162 silly cache add name: 'bcrypt-pbkdf', +2162 silly cache add rawSpec: '^1.0.0', +2162 silly cache add spec: '>=1.0.0 <2.0.0', +2162 silly cache add type: 'range' } +2163 silly addNamed bcrypt-pbkdf@>=1.0.0 <2.0.0 +2164 verbose addNamed ">=1.0.0 <2.0.0" is a valid semver range for bcrypt-pbkdf +2165 silly addNameRange { name: 'bcrypt-pbkdf', range: '>=1.0.0 <2.0.0', hasData: false } +2166 silly mapToRegistry name bcrypt-pbkdf +2167 silly mapToRegistry using default registry +2168 silly mapToRegistry registry https://registry.npmjs.org/ +2169 silly mapToRegistry uri https://registry.npmjs.org/bcrypt-pbkdf +2170 verbose addNameRange registry:https://registry.npmjs.org/bcrypt-pbkdf not in flight; fetching +2171 silly cache afterAdd jsbn@0.1.1 +2172 verbose afterAdd /home/christine/.npm/jsbn/0.1.1/package/package.json not in flight; writing +2173 silly resolveWithNewModule asn1@0.2.4 checking installable status +2174 silly cache add args [ 'asn1@~0.2.3', null ] +2175 verbose cache add spec asn1@~0.2.3 +2176 silly cache add parsed spec Result { +2176 silly cache add raw: 'asn1@~0.2.3', +2176 silly cache add scope: null, +2176 silly cache add name: 'asn1', +2176 silly cache add rawSpec: '~0.2.3', +2176 silly cache add spec: '>=0.2.3 <0.3.0', +2176 silly cache add type: 'range' } +2177 silly addNamed asn1@>=0.2.3 <0.3.0 +2178 verbose addNamed ">=0.2.3 <0.3.0" is a valid semver range for asn1 +2179 silly addNameRange { name: 'asn1', range: '>=0.2.3 <0.3.0', hasData: false } +2180 silly mapToRegistry name asn1 +2181 silly mapToRegistry using default registry +2182 silly mapToRegistry registry https://registry.npmjs.org/ +2183 silly mapToRegistry uri https://registry.npmjs.org/asn1 +2184 verbose addNameRange registry:https://registry.npmjs.org/asn1 not in flight; fetching +2185 silly resolveWithNewModule dashdash@1.14.1 checking installable status +2186 silly cache add args [ 'dashdash@^1.12.0', null ] +2187 verbose cache add spec dashdash@^1.12.0 +2188 silly cache add parsed spec Result { +2188 silly cache add raw: 'dashdash@^1.12.0', +2188 silly cache add scope: null, +2188 silly cache add name: 'dashdash', +2188 silly cache add rawSpec: '^1.12.0', +2188 silly cache add spec: '>=1.12.0 <2.0.0', +2188 silly cache add type: 'range' } +2189 silly addNamed dashdash@>=1.12.0 <2.0.0 +2190 verbose addNamed ">=1.12.0 <2.0.0" is a valid semver range for dashdash +2191 silly addNameRange { name: 'dashdash', range: '>=1.12.0 <2.0.0', hasData: false } +2192 silly mapToRegistry name dashdash +2193 silly mapToRegistry using default registry +2194 silly mapToRegistry registry https://registry.npmjs.org/ +2195 silly mapToRegistry uri https://registry.npmjs.org/dashdash +2196 verbose addNameRange registry:https://registry.npmjs.org/dashdash not in flight; fetching +2197 http 200 https://registry.npmjs.org/tweetnacl +2198 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +2198 verbose headers 'content-type': 'application/json', +2198 verbose headers 'transfer-encoding': 'chunked', +2198 verbose headers connection: 'keep-alive', +2198 verbose headers 'set-cookie': +2198 verbose headers [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2198 verbose headers 'cf-ray': '59764faae943d715-FRA', +2198 verbose headers age: '5653', +2198 verbose headers 'cache-control': 'public, max-age=300', +2198 verbose headers etag: 'W/"1b4cf5c8f09886b489d11782a23a9cbf"', +2198 verbose headers 'last-modified': 'Sat, 09 May 2020 13:43:32 GMT', +2198 verbose headers vary: 'accept-encoding, accept', +2198 verbose headers 'cf-cache-status': 'HIT', +2198 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2198 verbose headers server: 'cloudflare', +2198 verbose headers 'content-encoding': 'gzip', +2198 verbose headers 'cf-request-id': '02ddd01ecf0000d715c122c200000001' } +2199 silly get cb [ 200, +2199 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +2199 silly get 'content-type': 'application/json', +2199 silly get 'transfer-encoding': 'chunked', +2199 silly get connection: 'keep-alive', +2199 silly get 'set-cookie': +2199 silly get [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2199 silly get 'cf-ray': '59764faae943d715-FRA', +2199 silly get age: '5653', +2199 silly get 'cache-control': 'public, max-age=300', +2199 silly get etag: 'W/"1b4cf5c8f09886b489d11782a23a9cbf"', +2199 silly get 'last-modified': 'Sat, 09 May 2020 13:43:32 GMT', +2199 silly get vary: 'accept-encoding, accept', +2199 silly get 'cf-cache-status': 'HIT', +2199 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2199 silly get server: 'cloudflare', +2199 silly get 'content-encoding': 'gzip', +2199 silly get 'cf-request-id': '02ddd01ecf0000d715c122c200000001' } ] +2200 verbose get saving tweetnacl to /home/christine/.npm/registry.npmjs.org/tweetnacl/.cache.json +2201 verbose get https://registry.npmjs.org/safer-buffer not expired, no request +2202 silly addNameRange number 2 { name: 'safer-buffer', range: '>=2.0.2 <3.0.0', hasData: true } +2203 silly addNameRange versions [ 'safer-buffer', +2203 silly addNameRange [ '2.0.0', '2.0.1', '2.0.2', '2.1.0', '2.1.1', '2.1.2' ] ] +2204 silly addNamed safer-buffer@2.1.2 +2205 verbose addNamed "2.1.2" is a plain semver version for safer-buffer +2206 verbose get https://registry.npmjs.org/getpass not expired, no request +2207 silly addNameRange number 2 { name: 'getpass', range: '>=0.1.1 <0.2.0', hasData: true } +2208 silly addNameRange versions [ 'getpass', +2208 silly addNameRange [ '0.1.0', +2208 silly addNameRange '0.1.1', +2208 silly addNameRange '0.1.2', +2208 silly addNameRange '0.1.3', +2208 silly addNameRange '0.1.4', +2208 silly addNameRange '0.1.5', +2208 silly addNameRange '0.1.6', +2208 silly addNameRange '0.1.7' ] ] +2209 silly addNamed getpass@0.1.7 +2210 verbose addNamed "0.1.7" is a plain semver version for getpass +2211 verbose get https://registry.npmjs.org/bcrypt-pbkdf not expired, no request +2212 silly addNameRange number 2 { name: 'bcrypt-pbkdf', range: '>=1.0.0 <2.0.0', hasData: true } +2213 silly addNameRange versions [ 'bcrypt-pbkdf', [ '1.0.0', '1.0.1', '1.0.2' ] ] +2214 silly addNamed bcrypt-pbkdf@1.0.2 +2215 verbose addNamed "1.0.2" is a plain semver version for bcrypt-pbkdf +2216 verbose get https://registry.npmjs.org/asn1 not expired, no request +2217 silly addNameRange number 2 { name: 'asn1', range: '>=0.2.3 <0.3.0', hasData: true } +2218 silly addNameRange versions [ 'asn1', +2218 silly addNameRange [ '0.1.0', +2218 silly addNameRange '0.1.1', +2218 silly addNameRange '0.1.2', +2218 silly addNameRange '0.1.3', +2218 silly addNameRange '0.1.4', +2218 silly addNameRange '0.1.5', +2218 silly addNameRange '0.1.6', +2218 silly addNameRange '0.1.7', +2218 silly addNameRange '0.1.8', +2218 silly addNameRange '0.1.9', +2218 silly addNameRange '0.1.10', +2218 silly addNameRange '0.1.11', +2218 silly addNameRange '0.2.0', +2218 silly addNameRange '0.2.1', +2218 silly addNameRange '0.2.2', +2218 silly addNameRange '0.2.3', +2218 silly addNameRange '0.2.4' ] ] +2219 silly addNamed asn1@0.2.4 +2220 verbose addNamed "0.2.4" is a plain semver version for asn1 +2221 verbose afterAdd /home/christine/.npm/jsbn/0.1.1/package/package.json written +2222 http 304 https://registry.npmjs.org/ecc-jsbn +2223 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +2223 verbose headers connection: 'keep-alive', +2223 verbose headers 'set-cookie': +2223 verbose headers [ '__cfduid=d3be9a0b80d7155f3e9da29972b7410c41590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2223 verbose headers 'cf-ray': '59764faaec18dfc7-FRA', +2223 verbose headers age: '5653', +2223 verbose headers 'cache-control': 'public, max-age=300', +2223 verbose headers etag: '"972b128f4c15e931ec8836237cce37e0"', +2223 verbose headers 'last-modified': 'Sun, 29 Jul 2018 17:44:41 GMT', +2223 verbose headers vary: 'Accept-Encoding', +2223 verbose headers 'cf-cache-status': 'HIT', +2223 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2223 verbose headers server: 'cloudflare', +2223 verbose headers 'cf-request-id': '02ddd01ece0000dfc72a8d3200000001' } +2224 silly get cb [ 304, +2224 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +2224 silly get connection: 'keep-alive', +2224 silly get 'set-cookie': +2224 silly get [ '__cfduid=d3be9a0b80d7155f3e9da29972b7410c41590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2224 silly get 'cf-ray': '59764faaec18dfc7-FRA', +2224 silly get age: '5653', +2224 silly get 'cache-control': 'public, max-age=300', +2224 silly get etag: '"972b128f4c15e931ec8836237cce37e0"', +2224 silly get 'last-modified': 'Sun, 29 Jul 2018 17:44:41 GMT', +2224 silly get vary: 'Accept-Encoding', +2224 silly get 'cf-cache-status': 'HIT', +2224 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2224 silly get server: 'cloudflare', +2224 silly get 'cf-request-id': '02ddd01ece0000dfc72a8d3200000001' } ] +2225 verbose etag https://registry.npmjs.org/ecc-jsbn from cache +2226 verbose get saving ecc-jsbn to /home/christine/.npm/registry.npmjs.org/ecc-jsbn/.cache.json +2227 verbose get https://registry.npmjs.org/dashdash not expired, no request +2228 silly addNameRange number 2 { name: 'dashdash', range: '>=1.12.0 <2.0.0', hasData: true } +2229 silly addNameRange versions [ 'dashdash', +2229 silly addNameRange [ '1.0.0', +2229 silly addNameRange '1.0.1', +2229 silly addNameRange '1.0.2', +2229 silly addNameRange '1.1.0', +2229 silly addNameRange '1.2.0', +2229 silly addNameRange '1.2.1', +2229 silly addNameRange '1.3.0', +2229 silly addNameRange '1.3.1', +2229 silly addNameRange '1.3.2', +2229 silly addNameRange '1.4.0', +2229 silly addNameRange '1.5.0', +2229 silly addNameRange '1.6.0', +2229 silly addNameRange '1.7.0', +2229 silly addNameRange '1.7.1', +2229 silly addNameRange '1.7.2', +2229 silly addNameRange '1.7.3', +2229 silly addNameRange '1.8.0', +2229 silly addNameRange '1.9.0', +2229 silly addNameRange '1.10.0', +2229 silly addNameRange '1.10.1', +2229 silly addNameRange '1.11.0', +2229 silly addNameRange '1.12.0', +2229 silly addNameRange '1.12.1', +2229 silly addNameRange '1.12.2', +2229 silly addNameRange '1.13.0', +2229 silly addNameRange '1.13.1', +2229 silly addNameRange '1.14.0', +2229 silly addNameRange '1.14.1' ] ] +2230 silly addNamed dashdash@1.14.1 +2231 verbose addNamed "1.14.1" is a plain semver version for dashdash +2232 silly cache afterAdd safer-buffer@2.1.2 +2233 verbose afterAdd /home/christine/.npm/safer-buffer/2.1.2/package/package.json not in flight; writing +2234 silly resolveWithNewModule tweetnacl@0.14.5 checking installable status +2235 silly cache add args [ 'tweetnacl@~0.14.0', null ] +2236 verbose cache add spec tweetnacl@~0.14.0 +2237 silly cache add parsed spec Result { +2237 silly cache add raw: 'tweetnacl@~0.14.0', +2237 silly cache add scope: null, +2237 silly cache add name: 'tweetnacl', +2237 silly cache add rawSpec: '~0.14.0', +2237 silly cache add spec: '>=0.14.0 <0.15.0', +2237 silly cache add type: 'range' } +2238 silly addNamed tweetnacl@>=0.14.0 <0.15.0 +2239 verbose addNamed ">=0.14.0 <0.15.0" is a valid semver range for tweetnacl +2240 silly addNameRange { name: 'tweetnacl', range: '>=0.14.0 <0.15.0', hasData: false } +2241 silly mapToRegistry name tweetnacl +2242 silly mapToRegistry using default registry +2243 silly mapToRegistry registry https://registry.npmjs.org/ +2244 silly mapToRegistry uri https://registry.npmjs.org/tweetnacl +2245 verbose addNameRange registry:https://registry.npmjs.org/tweetnacl not in flight; fetching +2246 silly cache afterAdd getpass@0.1.7 +2247 verbose afterAdd /home/christine/.npm/getpass/0.1.7/package/package.json not in flight; writing +2248 silly cache afterAdd asn1@0.2.4 +2249 verbose afterAdd /home/christine/.npm/asn1/0.2.4/package/package.json not in flight; writing +2250 silly cache afterAdd bcrypt-pbkdf@1.0.2 +2251 verbose afterAdd /home/christine/.npm/bcrypt-pbkdf/1.0.2/package/package.json not in flight; writing +2252 silly resolveWithNewModule ecc-jsbn@0.1.2 checking installable status +2253 silly cache add args [ 'ecc-jsbn@~0.1.1', null ] +2254 verbose cache add spec ecc-jsbn@~0.1.1 +2255 silly cache add parsed spec Result { +2255 silly cache add raw: 'ecc-jsbn@~0.1.1', +2255 silly cache add scope: null, +2255 silly cache add name: 'ecc-jsbn', +2255 silly cache add rawSpec: '~0.1.1', +2255 silly cache add spec: '>=0.1.1 <0.2.0', +2255 silly cache add type: 'range' } +2256 silly addNamed ecc-jsbn@>=0.1.1 <0.2.0 +2257 verbose addNamed ">=0.1.1 <0.2.0" is a valid semver range for ecc-jsbn +2258 silly addNameRange { name: 'ecc-jsbn', range: '>=0.1.1 <0.2.0', hasData: false } +2259 silly mapToRegistry name ecc-jsbn +2260 silly mapToRegistry using default registry +2261 silly mapToRegistry registry https://registry.npmjs.org/ +2262 silly mapToRegistry uri https://registry.npmjs.org/ecc-jsbn +2263 verbose addNameRange registry:https://registry.npmjs.org/ecc-jsbn not in flight; fetching +2264 silly cache afterAdd dashdash@1.14.1 +2265 verbose afterAdd /home/christine/.npm/dashdash/1.14.1/package/package.json not in flight; writing +2266 verbose afterAdd /home/christine/.npm/safer-buffer/2.1.2/package/package.json written +2267 verbose get https://registry.npmjs.org/tweetnacl not expired, no request +2268 silly addNameRange number 2 { name: 'tweetnacl', range: '>=0.14.0 <0.15.0', hasData: true } +2269 silly addNameRange versions [ 'tweetnacl', +2269 silly addNameRange [ '0.9.1', +2269 silly addNameRange '0.9.2', +2269 silly addNameRange '0.10.0', +2269 silly addNameRange '0.10.1', +2269 silly addNameRange '0.11.0', +2269 silly addNameRange '0.11.1', +2269 silly addNameRange '0.11.2', +2269 silly addNameRange '0.12.0', +2269 silly addNameRange '0.12.1', +2269 silly addNameRange '0.12.2', +2269 silly addNameRange '0.13.0', +2269 silly addNameRange '0.13.1', +2269 silly addNameRange '0.13.2', +2269 silly addNameRange '0.13.3', +2269 silly addNameRange '0.14.0', +2269 silly addNameRange '0.14.1', +2269 silly addNameRange '0.14.2', +2269 silly addNameRange '0.14.3', +2269 silly addNameRange '0.14.4', +2269 silly addNameRange '0.14.5', +2269 silly addNameRange '1.0.0-rc.1', +2269 silly addNameRange '1.0.0', +2269 silly addNameRange '1.0.1', +2269 silly addNameRange '1.0.2', +2269 silly addNameRange '1.0.3' ] ] +2270 silly addNamed tweetnacl@0.14.5 +2271 verbose addNamed "0.14.5" is a plain semver version for tweetnacl +2272 verbose afterAdd /home/christine/.npm/getpass/0.1.7/package/package.json written +2273 verbose afterAdd /home/christine/.npm/asn1/0.2.4/package/package.json written +2274 verbose afterAdd /home/christine/.npm/bcrypt-pbkdf/1.0.2/package/package.json written +2275 verbose get https://registry.npmjs.org/ecc-jsbn not expired, no request +2276 silly addNameRange number 2 { name: 'ecc-jsbn', range: '>=0.1.1 <0.2.0', hasData: true } +2277 silly addNameRange versions [ 'ecc-jsbn', [ '0.0.1', '0.1.1', '0.1.2', '0.2.0' ] ] +2278 silly addNamed ecc-jsbn@0.1.2 +2279 verbose addNamed "0.1.2" is a plain semver version for ecc-jsbn +2280 verbose afterAdd /home/christine/.npm/dashdash/1.14.1/package/package.json written +2281 silly cache afterAdd tweetnacl@0.14.5 +2282 verbose afterAdd /home/christine/.npm/tweetnacl/0.14.5/package/package.json not in flight; writing +2283 silly cache afterAdd ecc-jsbn@0.1.2 +2284 verbose afterAdd /home/christine/.npm/ecc-jsbn/0.1.2/package/package.json not in flight; writing +2285 verbose afterAdd /home/christine/.npm/tweetnacl/0.14.5/package/package.json written +2286 verbose afterAdd /home/christine/.npm/ecc-jsbn/0.1.2/package/package.json written +2287 silly fetchNamedPackageData psl +2288 silly mapToRegistry name psl +2289 silly mapToRegistry using default registry +2290 silly mapToRegistry registry https://registry.npmjs.org/ +2291 silly mapToRegistry uri https://registry.npmjs.org/psl +2292 verbose request uri https://registry.npmjs.org/psl +2293 verbose request no auth needed +2294 info attempt registry request try #1 at 13:48:58 +2295 verbose etag W/"101ba2d632d4780d2de3d351ee1405be" +2296 verbose lastModified Sat, 28 Dec 2019 13:07:08 GMT +2297 http request GET https://registry.npmjs.org/psl +2298 http 200 https://registry.npmjs.org/psl +2299 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', +2299 verbose headers 'content-type': 'application/json', +2299 verbose headers 'transfer-encoding': 'chunked', +2299 verbose headers connection: 'keep-alive', +2299 verbose headers 'set-cookie': +2299 verbose headers [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2299 verbose headers 'cf-ray': '59764fab685905bb-FRA', +2299 verbose headers age: '5659', +2299 verbose headers 'cache-control': 'public, max-age=300', +2299 verbose headers etag: 'W/"da7a245ac77d8bce14f4297f73f7e4b3"', +2299 verbose headers 'last-modified': 'Wed, 25 Mar 2020 13:29:16 GMT', +2299 verbose headers vary: 'accept-encoding, accept', +2299 verbose headers 'cf-cache-status': 'HIT', +2299 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2299 verbose headers server: 'cloudflare', +2299 verbose headers 'content-encoding': 'gzip', +2299 verbose headers 'cf-request-id': '02ddd01f1d000005bb0cac0200000001' } +2300 silly get cb [ 200, +2300 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', +2300 silly get 'content-type': 'application/json', +2300 silly get 'transfer-encoding': 'chunked', +2300 silly get connection: 'keep-alive', +2300 silly get 'set-cookie': +2300 silly get [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], +2300 silly get 'cf-ray': '59764fab685905bb-FRA', +2300 silly get age: '5659', +2300 silly get 'cache-control': 'public, max-age=300', +2300 silly get etag: 'W/"da7a245ac77d8bce14f4297f73f7e4b3"', +2300 silly get 'last-modified': 'Wed, 25 Mar 2020 13:29:16 GMT', +2300 silly get vary: 'accept-encoding, accept', +2300 silly get 'cf-cache-status': 'HIT', +2300 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', +2300 silly get server: 'cloudflare', +2300 silly get 'content-encoding': 'gzip', +2300 silly get 'cf-request-id': '02ddd01f1d000005bb0cac0200000001' } ] +2301 verbose get saving psl to /home/christine/.npm/registry.npmjs.org/psl/.cache.json +2302 silly resolveWithNewModule psl@1.8.0 checking installable status +2303 silly cache add args [ 'psl@^1.1.28', null ] +2304 verbose cache add spec psl@^1.1.28 +2305 silly cache add parsed spec Result { +2305 silly cache add raw: 'psl@^1.1.28', +2305 silly cache add scope: null, +2305 silly cache add name: 'psl', +2305 silly cache add rawSpec: '^1.1.28', +2305 silly cache add spec: '>=1.1.28 <2.0.0', +2305 silly cache add type: 'range' } +2306 silly addNamed psl@>=1.1.28 <2.0.0 +2307 verbose addNamed ">=1.1.28 <2.0.0" is a valid semver range for psl +2308 silly addNameRange { name: 'psl', range: '>=1.1.28 <2.0.0', hasData: false } +2309 silly mapToRegistry name psl +2310 silly mapToRegistry using default registry +2311 silly mapToRegistry registry https://registry.npmjs.org/ +2312 silly mapToRegistry uri https://registry.npmjs.org/psl +2313 verbose addNameRange registry:https://registry.npmjs.org/psl not in flight; fetching +2314 verbose get https://registry.npmjs.org/psl not expired, no request +2315 silly addNameRange number 2 { name: 'psl', range: '>=1.1.28 <2.0.0', hasData: true } +2316 silly addNameRange versions [ 'psl', +2316 silly addNameRange [ '1.0.0', +2316 silly addNameRange '1.0.1', +2316 silly addNameRange '1.0.2', +2316 silly addNameRange '1.1.0', +2316 silly addNameRange '1.1.1', +2316 silly addNameRange '1.1.2', +2316 silly addNameRange '1.1.3', +2316 silly addNameRange '1.1.4', +2316 silly addNameRange '1.1.5', +2316 silly addNameRange '1.1.6', +2316 silly addNameRange '1.1.7', +2316 silly addNameRange '1.1.8', +2316 silly addNameRange '1.1.9', +2316 silly addNameRange '1.1.10', +2316 silly addNameRange '1.1.11', +2316 silly addNameRange '1.1.12', +2316 silly addNameRange '1.1.13', +2316 silly addNameRange '1.1.14', +2316 silly addNameRange '1.1.15', +2316 silly addNameRange '1.1.16', +2316 silly addNameRange '1.1.17', +2316 silly addNameRange '1.1.18', +2316 silly addNameRange '1.1.19', +2316 silly addNameRange '1.1.20', +2316 silly addNameRange '1.1.21', +2316 silly addNameRange '1.1.22', +2316 silly addNameRange '1.1.23', +2316 silly addNameRange '1.1.24', +2316 silly addNameRange '1.1.25', +2316 silly addNameRange '1.1.26', +2316 silly addNameRange '1.1.27', +2316 silly addNameRange '1.1.28', +2316 silly addNameRange '1.1.29', +2316 silly addNameRange '1.1.30', +2316 silly addNameRange '1.1.31', +2316 silly addNameRange '1.1.32', +2316 silly addNameRange '1.1.33', +2316 silly addNameRange '1.2.0', +2316 silly addNameRange '1.3.0', +2316 silly addNameRange '1.3.1', +2316 silly addNameRange '1.4.0', +2316 silly addNameRange '1.5.0', +2316 silly addNameRange '1.6.0', +2316 silly addNameRange '1.7.0', +2316 silly addNameRange '1.8.0' ] ] +2317 silly addNamed psl@1.8.0 +2318 verbose addNamed "1.8.0" is a plain semver version for psl +2319 silly mapToRegistry name psl +2320 silly mapToRegistry using default registry +2321 silly mapToRegistry registry https://registry.npmjs.org/ +2322 silly mapToRegistry uri https://registry.npmjs.org/psl +2323 verbose addRemoteTarball https://registry.npmjs.org/psl/-/psl-1.8.0.tgz not in flight; adding +2324 verbose addRemoteTarball [ 'https://registry.npmjs.org/psl/-/psl-1.8.0.tgz', +2324 verbose addRemoteTarball '9326f8bcfb013adcc005fdff056acce020e51c24' ] +2325 info retry fetch attempt 1 at 13:48:58 +2326 info attempt registry request try #1 at 13:48:58 +2327 http fetch GET https://registry.npmjs.org/psl/-/psl-1.8.0.tgz +2328 http fetch 200 https://registry.npmjs.org/psl/-/psl-1.8.0.tgz +2329 silly fetchAndShaCheck shasum 9326f8bcfb013adcc005fdff056acce020e51c24 +2330 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/psl/-/psl-1.8.0.tgz not in flight; adding +2331 verbose addTmpTarball already have metadata; skipping unpack for psl@1.8.0 +2332 silly cache afterAdd psl@1.8.0 +2333 verbose afterAdd /home/christine/.npm/psl/1.8.0/package/package.json not in flight; writing +2334 verbose afterAdd /home/christine/.npm/psl/1.8.0/package/package.json written +2335 silly loadAllDepsIntoIdealTree Finishing +2336 silly idealTree:prePrune lib +2336 silly idealTree:prePrune └─┬ less@3.11.1 +2336 silly idealTree:prePrune ├── ajv@6.12.2 +2336 silly idealTree:prePrune ├── asap@2.0.6 +2336 silly idealTree:prePrune ├── asn1@0.2.4 +2336 silly idealTree:prePrune ├── assert-plus@1.0.0 +2336 silly idealTree:prePrune ├── asynckit@0.4.0 +2336 silly idealTree:prePrune ├── aws-sign2@0.7.0 +2336 silly idealTree:prePrune ├── aws4@1.9.1 +2336 silly idealTree:prePrune ├── bcrypt-pbkdf@1.0.2 +2336 silly idealTree:prePrune ├── caseless@0.12.0 +2336 silly idealTree:prePrune ├── clone@2.1.2 +2336 silly idealTree:prePrune ├── combined-stream@1.0.8 +2336 silly idealTree:prePrune ├── core-util-is@1.0.2 +2336 silly idealTree:prePrune ├── dashdash@1.14.1 +2336 silly idealTree:prePrune ├── delayed-stream@1.0.0 +2336 silly idealTree:prePrune ├── ecc-jsbn@0.1.2 +2336 silly idealTree:prePrune ├── errno@0.1.7 +2336 silly idealTree:prePrune ├── extend@3.0.2 +2336 silly idealTree:prePrune ├── extsprintf@1.3.0 +2336 silly idealTree:prePrune ├── fast-deep-equal@3.1.1 +2336 silly idealTree:prePrune ├── fast-json-stable-stringify@2.1.0 +2336 silly idealTree:prePrune ├── forever-agent@0.6.1 +2336 silly idealTree:prePrune ├── form-data@2.3.3 +2336 silly idealTree:prePrune ├── getpass@0.1.7 +2336 silly idealTree:prePrune ├── graceful-fs@4.2.4 +2336 silly idealTree:prePrune ├── har-schema@2.0.0 +2336 silly idealTree:prePrune ├── har-validator@5.1.3 +2336 silly idealTree:prePrune ├── http-signature@1.2.0 +2336 silly idealTree:prePrune ├── image-size@0.5.5 +2336 silly idealTree:prePrune ├── is-typedarray@1.0.0 +2336 silly idealTree:prePrune ├── isstream@0.1.2 +2336 silly idealTree:prePrune ├── jsbn@0.1.1 +2336 silly idealTree:prePrune ├── json-schema-traverse@0.4.1 +2336 silly idealTree:prePrune ├── json-schema@0.2.3 +2336 silly idealTree:prePrune ├── json-stringify-safe@5.0.1 +2336 silly idealTree:prePrune ├── jsprim@1.4.1 +2336 silly idealTree:prePrune ├── mime-db@1.44.0 +2336 silly idealTree:prePrune ├── mime-types@2.1.27 +2336 silly idealTree:prePrune ├── mime@1.6.0 +2336 silly idealTree:prePrune ├── minimist@1.2.5 +2336 silly idealTree:prePrune ├── mkdirp@0.5.5 +2336 silly idealTree:prePrune ├── oauth-sign@0.9.0 +2336 silly idealTree:prePrune ├── performance-now@2.1.0 +2336 silly idealTree:prePrune ├── promise@7.3.1 +2336 silly idealTree:prePrune ├── prr@1.0.1 +2336 silly idealTree:prePrune ├── psl@1.8.0 +2336 silly idealTree:prePrune ├── punycode@2.1.1 +2336 silly idealTree:prePrune ├── qs@6.5.2 +2336 silly idealTree:prePrune ├── request@2.88.2 +2336 silly idealTree:prePrune ├── safe-buffer@5.2.1 +2336 silly idealTree:prePrune ├── safer-buffer@2.1.2 +2336 silly idealTree:prePrune ├── source-map@0.6.1 +2336 silly idealTree:prePrune ├── sshpk@1.16.1 +2336 silly idealTree:prePrune ├── tough-cookie@2.5.0 +2336 silly idealTree:prePrune ├── tslib@1.13.0 +2336 silly idealTree:prePrune ├── tunnel-agent@0.6.0 +2336 silly idealTree:prePrune ├── tweetnacl@0.14.5 +2336 silly idealTree:prePrune ├── uri-js@4.2.2 +2336 silly idealTree:prePrune ├── uuid@3.4.0 +2336 silly idealTree:prePrune └── verror@1.10.0 +2337 silly loadIdealTree Finishing +2338 silly currentTree lib +2339 silly idealTree lib +2339 silly idealTree └─┬ less@3.11.1 +2339 silly idealTree ├── ajv@6.12.2 +2339 silly idealTree ├── asap@2.0.6 +2339 silly idealTree ├── asn1@0.2.4 +2339 silly idealTree ├── assert-plus@1.0.0 +2339 silly idealTree ├── asynckit@0.4.0 +2339 silly idealTree ├── aws-sign2@0.7.0 +2339 silly idealTree ├── aws4@1.9.1 +2339 silly idealTree ├── bcrypt-pbkdf@1.0.2 +2339 silly idealTree ├── caseless@0.12.0 +2339 silly idealTree ├── clone@2.1.2 +2339 silly idealTree ├── combined-stream@1.0.8 +2339 silly idealTree ├── core-util-is@1.0.2 +2339 silly idealTree ├── dashdash@1.14.1 +2339 silly idealTree ├── delayed-stream@1.0.0 +2339 silly idealTree ├── ecc-jsbn@0.1.2 +2339 silly idealTree ├── errno@0.1.7 +2339 silly idealTree ├── extend@3.0.2 +2339 silly idealTree ├── extsprintf@1.3.0 +2339 silly idealTree ├── fast-deep-equal@3.1.1 +2339 silly idealTree ├── fast-json-stable-stringify@2.1.0 +2339 silly idealTree ├── forever-agent@0.6.1 +2339 silly idealTree ├── form-data@2.3.3 +2339 silly idealTree ├── getpass@0.1.7 +2339 silly idealTree ├── graceful-fs@4.2.4 +2339 silly idealTree ├── har-schema@2.0.0 +2339 silly idealTree ├── har-validator@5.1.3 +2339 silly idealTree ├── http-signature@1.2.0 +2339 silly idealTree ├── image-size@0.5.5 +2339 silly idealTree ├── is-typedarray@1.0.0 +2339 silly idealTree ├── isstream@0.1.2 +2339 silly idealTree ├── jsbn@0.1.1 +2339 silly idealTree ├── json-schema-traverse@0.4.1 +2339 silly idealTree ├── json-schema@0.2.3 +2339 silly idealTree ├── json-stringify-safe@5.0.1 +2339 silly idealTree ├── jsprim@1.4.1 +2339 silly idealTree ├── mime-db@1.44.0 +2339 silly idealTree ├── mime-types@2.1.27 +2339 silly idealTree ├── mime@1.6.0 +2339 silly idealTree ├── minimist@1.2.5 +2339 silly idealTree ├── mkdirp@0.5.5 +2339 silly idealTree ├── oauth-sign@0.9.0 +2339 silly idealTree ├── performance-now@2.1.0 +2339 silly idealTree ├── promise@7.3.1 +2339 silly idealTree ├── prr@1.0.1 +2339 silly idealTree ├── psl@1.8.0 +2339 silly idealTree ├── punycode@2.1.1 +2339 silly idealTree ├── qs@6.5.2 +2339 silly idealTree ├── request@2.88.2 +2339 silly idealTree ├── safe-buffer@5.2.1 +2339 silly idealTree ├── safer-buffer@2.1.2 +2339 silly idealTree ├── source-map@0.6.1 +2339 silly idealTree ├── sshpk@1.16.1 +2339 silly idealTree ├── tough-cookie@2.5.0 +2339 silly idealTree ├── tslib@1.13.0 +2339 silly idealTree ├── tunnel-agent@0.6.0 +2339 silly idealTree ├── tweetnacl@0.14.5 +2339 silly idealTree ├── uri-js@4.2.2 +2339 silly idealTree ├── uuid@3.4.0 +2339 silly idealTree └── verror@1.10.0 +2340 silly generateActionsToTake Starting +2341 silly install generateActionsToTake +2342 warn checkPermissions Missing write access to /usr/local/lib/node_modules +2343 silly rollbackFailedOptional Starting +2344 silly rollbackFailedOptional Finishing +2345 silly runTopLevelLifecycles Starting +2346 silly runTopLevelLifecycles Finishing +2347 silly install printInstalled +2348 verbose stack Error: EACCES: permission denied, access '/usr/local/lib/node_modules' +2349 verbose cwd /home/christine/0_WORK/gradcomm +2350 error Linux 4.15.0-99-generic +2351 error argv "/usr/bin/node" "/usr/bin/npm" "install" "-g" "less" +2352 error node v8.10.0 +2353 error npm v3.5.2 +2354 error path /usr/local/lib/node_modules +2355 error code EACCES +2356 error errno -13 +2357 error syscall access +2358 error Error: EACCES: permission denied, access '/usr/local/lib/node_modules' +2358 error { Error: EACCES: permission denied, access '/usr/local/lib/node_modules' +2358 error errno: -13, +2358 error code: 'EACCES', +2358 error syscall: 'access', +2358 error path: '/usr/local/lib/node_modules' } +2359 error Please try running this command again as root/Administrator. +2360 verbose exit [ -13, true ] diff --git a/community_server/parse_proto.php b/community_server/parse_proto.php new file mode 100755 index 000000000..576b99691 --- /dev/null +++ b/community_server/parse_proto.php @@ -0,0 +1,20 @@ +#!/bin/bash +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# need grpc only for hedera hashgraph +#PHP_PLUGIN="$(which grpc_php_plugin)" +#protoc --proto_path=./src/protobuf/gradido --php_out=./src/ --grpc_out=./src/ --plugin=protoc-gen-grpc=$PHP_PLUGIN ./src/protobuf/gradido/*.proto + +protoc --proto_path=./src/protobuf/gradido --php_out=./src/ ./src/protobuf/gradido/*.proto + diff --git a/community_server/phpunit.xml.dist b/community_server/phpunit.xml.dist new file mode 100644 index 000000000..ba971b637 --- /dev/null +++ b/community_server/phpunit.xml.dist @@ -0,0 +1,41 @@ + + + + + + + + + + + tests/TestCase/ + + + + + + + + + + + + + + + + + src/ + plugins/*/src/ + + src/Console/Installer.php + + + + diff --git a/community_server/plugins/empty b/community_server/plugins/empty new file mode 100644 index 000000000..e69de29bb diff --git a/community_server/skeema/gradido_community/admin_errors.sql b/community_server/skeema/gradido_community/admin_errors.sql new file mode 100644 index 000000000..020b4078b --- /dev/null +++ b/community_server/skeema/gradido_community/admin_errors.sql @@ -0,0 +1,11 @@ +CREATE TABLE `admin_errors` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `state_user_id` int(11) NOT NULL, + `controller` varchar(255) NOT NULL, + `action` varchar(255) NOT NULL, + `state` varchar(255) NOT NULL, + `msg` varchar(255) NOT NULL, + `details` varchar(255) DEFAULT NULL, + `created` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/community_server/skeema/gradido_community/community_profiles.sql b/community_server/skeema/gradido_community/community_profiles.sql new file mode 100644 index 000000000..ea857bebf --- /dev/null +++ b/community_server/skeema/gradido_community/community_profiles.sql @@ -0,0 +1,8 @@ +CREATE TABLE `community_profiles` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `state_user_id` int(10) unsigned NOT NULL, + `profile_img` longblob, + `profile_desc` varchar(2000) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `state_user_id` (`state_user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/insert/insert_transaction_types.sql b/community_server/skeema/gradido_community/insert/insert_transaction_types.sql new file mode 100644 index 000000000..9dbf5b93f --- /dev/null +++ b/community_server/skeema/gradido_community/insert/insert_transaction_types.sql @@ -0,0 +1,5 @@ + +INSERT INTO `transaction_types` (`id`, `name`, `text`) VALUES +(1, 'creation', 'Aktives oder Bedingungsloses Grundeinkommen.'), +(2, 'transfer', 'Einfache Überweisung'); + diff --git a/community_server/skeema/gradido_community/operator_types.sql b/community_server/skeema/gradido_community/operator_types.sql new file mode 100644 index 000000000..35df5264e --- /dev/null +++ b/community_server/skeema/gradido_community/operator_types.sql @@ -0,0 +1,6 @@ +CREATE TABLE `operator_types` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL, + `text` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/operators.sql b/community_server/skeema/gradido_community/operators.sql new file mode 100644 index 000000000..74808be9b --- /dev/null +++ b/community_server/skeema/gradido_community/operators.sql @@ -0,0 +1,8 @@ +CREATE TABLE `operators` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `username` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `user_pubkey` binary(32) NOT NULL, + `data_base64` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `modified` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/pending_transactions.sql b/community_server/skeema/gradido_community/pending_transactions.sql new file mode 100644 index 000000000..e3d6a4a08 --- /dev/null +++ b/community_server/skeema/gradido_community/pending_transactions.sql @@ -0,0 +1,10 @@ +CREATE TABLE `pending_transactions` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `transactionID` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL, + `service` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, + `method` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, + `h_server_id` int(11) NOT NULL, + `timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `transactionID` (`transactionID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/roles.sql b/community_server/skeema/gradido_community/roles.sql new file mode 100644 index 000000000..9fe9de710 --- /dev/null +++ b/community_server/skeema/gradido_community/roles.sql @@ -0,0 +1,5 @@ +CREATE TABLE `roles` ( + `id` int UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/server_users.sql b/community_server/skeema/gradido_community/server_users.sql new file mode 100644 index 000000000..982a4bdc3 --- /dev/null +++ b/community_server/skeema/gradido_community/server_users.sql @@ -0,0 +1,12 @@ +CREATE TABLE `server_users` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `username` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `role` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'admin', + `activated` tinyint(4) NOT NULL DEFAULT '0', + `last_login` datetime DEFAULT NULL, + `created` datetime NOT NULL, + `modified` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/state_balances.sql b/community_server/skeema/gradido_community/state_balances.sql new file mode 100644 index 000000000..c8b013d44 --- /dev/null +++ b/community_server/skeema/gradido_community/state_balances.sql @@ -0,0 +1,7 @@ +CREATE TABLE `state_balances` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `state_user_id` int(10) unsigned NOT NULL, + `modified` datetime NOT NULL, + `amount` bigint(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/state_created.sql b/community_server/skeema/gradido_community/state_created.sql new file mode 100644 index 000000000..5bc139594 --- /dev/null +++ b/community_server/skeema/gradido_community/state_created.sql @@ -0,0 +1,11 @@ +CREATE TABLE `state_created` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `transaction_id` int(10) unsigned NOT NULL, + `month` tinyint(3) unsigned NOT NULL, + `year` smallint(5) unsigned NOT NULL, + `state_user_id` int(10) unsigned NOT NULL, + `created` datetime NOT NULL, + `short_ident_hash` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `short_ident_hash` (`short_ident_hash`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/state_errors.sql b/community_server/skeema/gradido_community/state_errors.sql new file mode 100644 index 000000000..8088f6ed2 --- /dev/null +++ b/community_server/skeema/gradido_community/state_errors.sql @@ -0,0 +1,8 @@ +CREATE TABLE `state_errors` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `state_user_id` int(10) unsigned NOT NULL, + `transaction_type_id` int(10) unsigned NOT NULL, + `created` datetime NOT NULL, + `message_json` text COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/state_group_addresses.sql b/community_server/skeema/gradido_community/state_group_addresses.sql new file mode 100644 index 000000000..1d256f3e0 --- /dev/null +++ b/community_server/skeema/gradido_community/state_group_addresses.sql @@ -0,0 +1,7 @@ +CREATE TABLE `state_group_addresses` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `group_id` int(10) unsigned NOT NULL, + `public_key` binary(32) NOT NULL, + `address_type_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/state_group_relationships.sql b/community_server/skeema/gradido_community/state_group_relationships.sql new file mode 100644 index 000000000..d2eecbfc0 --- /dev/null +++ b/community_server/skeema/gradido_community/state_group_relationships.sql @@ -0,0 +1,7 @@ +CREATE TABLE `state_group_relationships` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `group1_id` int(10) unsigned NOT NULL, + `group2_id` int(10) unsigned NOT NULL, + `state_relationship_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/state_groups.sql b/community_server/skeema/gradido_community/state_groups.sql new file mode 100644 index 000000000..30a810a19 --- /dev/null +++ b/community_server/skeema/gradido_community/state_groups.sql @@ -0,0 +1,8 @@ +CREATE TABLE `state_groups` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `index_id` varbinary(64) NOT NULL, + `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `root_public_key` binary(32) NOT NULL, + `user_count` smallint(5) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/state_relationship_types.sql b/community_server/skeema/gradido_community/state_relationship_types.sql new file mode 100644 index 000000000..fd901b8ac --- /dev/null +++ b/community_server/skeema/gradido_community/state_relationship_types.sql @@ -0,0 +1,6 @@ +CREATE TABLE `state_relationship_types` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL, + `text` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/state_user_roles.sql b/community_server/skeema/gradido_community/state_user_roles.sql new file mode 100644 index 000000000..207c2de63 --- /dev/null +++ b/community_server/skeema/gradido_community/state_user_roles.sql @@ -0,0 +1,6 @@ +CREATE TABLE `state_user_roles` ( + `id` int UNSIGNED NOT NULL AUTO_INCREMENT, + `state_user_id` int(11) NOT NULL, + `role_id` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/state_users.sql b/community_server/skeema/gradido_community/state_users.sql new file mode 100644 index 000000000..706fa699e --- /dev/null +++ b/community_server/skeema/gradido_community/state_users.sql @@ -0,0 +1,13 @@ +CREATE TABLE `state_users` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `index_id` smallint(6) NOT NULL DEFAULT '0', + `group_id` int(10) unsigned NOT NULL DEFAULT '0', + `public_key` binary(32) NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `first_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `last_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `disabled` tinyint(4) DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `public_key` (`public_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/transaction_creations.sql b/community_server/skeema/gradido_community/transaction_creations.sql new file mode 100644 index 000000000..a2ff37539 --- /dev/null +++ b/community_server/skeema/gradido_community/transaction_creations.sql @@ -0,0 +1,9 @@ +CREATE TABLE `transaction_creations` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `transaction_id` int(10) unsigned NOT NULL, + `state_user_id` int(10) unsigned NOT NULL, + `amount` bigint(20) NOT NULL, + `ident_hash` binary(32) NOT NULL, + `target_date` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/transaction_group_addaddress.sql b/community_server/skeema/gradido_community/transaction_group_addaddress.sql new file mode 100644 index 000000000..dceac273c --- /dev/null +++ b/community_server/skeema/gradido_community/transaction_group_addaddress.sql @@ -0,0 +1,7 @@ +CREATE TABLE `transaction_group_addaddress` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `transaction_id` int(10) unsigned NOT NULL, + `address_type_id` int(10) unsigned NOT NULL, + `public_key` binary(32) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/transaction_group_allowtrades.sql b/community_server/skeema/gradido_community/transaction_group_allowtrades.sql new file mode 100644 index 000000000..923e0d5d0 --- /dev/null +++ b/community_server/skeema/gradido_community/transaction_group_allowtrades.sql @@ -0,0 +1,7 @@ +CREATE TABLE `transaction_group_allowtrades` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `transaction_id` int(10) unsigned NOT NULL, + `remote_group_id` varbinary(64) NOT NULL, + `allow` tinyint(4) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/transaction_group_creates.sql b/community_server/skeema/gradido_community/transaction_group_creates.sql new file mode 100644 index 000000000..b5d7629b4 --- /dev/null +++ b/community_server/skeema/gradido_community/transaction_group_creates.sql @@ -0,0 +1,8 @@ +CREATE TABLE `transaction_group_creates` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `transaction_id` int(10) unsigned NOT NULL, + `group_public_key` binary(32) NOT NULL, + `group_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/transaction_send_coins.sql b/community_server/skeema/gradido_community/transaction_send_coins.sql new file mode 100644 index 000000000..f57a2175e --- /dev/null +++ b/community_server/skeema/gradido_community/transaction_send_coins.sql @@ -0,0 +1,10 @@ +CREATE TABLE `transaction_send_coins` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `transaction_id` int(10) unsigned NOT NULL, + `state_user_id` int(10) unsigned NOT NULL, + `receiver_public_key` binary(32) NOT NULL, + `receiver_user_id` int(10) unsigned NOT NULL, + `amount` bigint(20) NOT NULL, + `sender_final_balance` bigint(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/transaction_signatures.sql b/community_server/skeema/gradido_community/transaction_signatures.sql new file mode 100644 index 000000000..0c13b77da --- /dev/null +++ b/community_server/skeema/gradido_community/transaction_signatures.sql @@ -0,0 +1,7 @@ +CREATE TABLE `transaction_signatures` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `transaction_id` int(10) unsigned NOT NULL, + `signature` binary(64) NOT NULL, + `pubkey` binary(32) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/transaction_types.sql b/community_server/skeema/gradido_community/transaction_types.sql new file mode 100644 index 000000000..87492e1fe --- /dev/null +++ b/community_server/skeema/gradido_community/transaction_types.sql @@ -0,0 +1,6 @@ +CREATE TABLE `transaction_types` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(24) COLLATE utf8mb4_unicode_ci NOT NULL, + `text` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/skeema/gradido_community/transactions.sql b/community_server/skeema/gradido_community/transactions.sql new file mode 100644 index 000000000..0e8c00ce6 --- /dev/null +++ b/community_server/skeema/gradido_community/transactions.sql @@ -0,0 +1,9 @@ +CREATE TABLE `transactions` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `state_group_id` int(10) unsigned DEFAULT NULL, + `transaction_type_id` int(10) unsigned NOT NULL, + `tx_hash` binary(32) DEFAULT NULL, + `memo` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `received` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/community_server/src/Application.php b/community_server/src/Application.php new file mode 100644 index 000000000..dbc4640c0 --- /dev/null +++ b/community_server/src/Application.php @@ -0,0 +1,119 @@ +bootstrapCli(); + } + + /* + * Only try to load DebugKit in development mode + * Debug Kit should not be installed on a production system + */ + if (Configure::read('debug')) { + $this->addPlugin(\DebugKit\Plugin::class); + } + + // Load more plugins here + } + + + + /** + * Setup the middleware queue your application will use. + * + * @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue to setup. + * @return \Cake\Http\MiddlewareQueue The updated middleware queue. + */ + public function middleware($middlewareQueue) + { + //$csrf = new CsrfProtectionMiddleware(); + + // Token check will be skipped when callback returns `true`. + /*$csrf->whitelistCallback(function ($request) { + // Skip token check for API URLs. + //if ($request->getParam('prefix') === 'api') { + if($request->getAttribute('base') === 'TransactionJsonRequestHandler') { + return true; + } + }); +*/ + // Ensure routing middleware is added to the queue before CSRF protection middleware. + //$middlewareQueue->; + + $middlewareQueue + // ->add($csrf) + // Catch any exceptions in the lower layers, + // and make an error page/response + ->add(new ErrorHandlerMiddleware(null, Configure::read('Error'))) + + // Handle plugin/theme assets like CakePHP normally does. + ->add(new AssetMiddleware([ + 'cacheTime' => Configure::read('Asset.cacheTime') + ])) + + // Add routing middleware. + // If you have a large number of routes connected, turning on routes + // caching in production could improve performance. For that when + // creating the middleware instance specify the cache config name by + // using it's second constructor argument: + // `new RoutingMiddleware($this, '_cake_routes_')` + ->add(new RoutingMiddleware($this)); + + return $middlewareQueue; + } + + /** + * @return void + */ + protected function bootstrapCli() + { + try { + $this->addPlugin('Bake'); + } catch (MissingPluginException $e) { + // Do not halt if the plugin is missing + } + + $this->addPlugin('Migrations'); + + // Load more plugins here + } +} diff --git a/community_server/src/Console/Installer.php b/community_server/src/Console/Installer.php new file mode 100644 index 000000000..3bcef473b --- /dev/null +++ b/community_server/src/Console/Installer.php @@ -0,0 +1,246 @@ +getIO(); + + $rootDir = dirname(dirname(__DIR__)); + + static::createAppConfig($rootDir, $io); + static::createWritableDirectories($rootDir, $io); + + // ask if the permissions should be changed + if ($io->isInteractive()) { + $validator = function ($arg) { + if (in_array($arg, ['Y', 'y', 'N', 'n'])) { + return $arg; + } + throw new Exception('This is not a valid answer. Please choose Y or n.'); + }; + $setFolderPermissions = $io->askAndValidate( + 'Set Folder Permissions ? (Default to Y) [Y,n]? ', + $validator, + 10, + 'Y' + ); + + if (in_array($setFolderPermissions, ['Y', 'y'])) { + static::setFolderPermissions($rootDir, $io); + } + } else { + static::setFolderPermissions($rootDir, $io); + } + + static::setSecuritySalt($rootDir, $io); + + $class = 'Cake\Codeception\Console\Installer'; + if (class_exists($class)) { + $class::customizeCodeceptionBinary($event); + } + } + + /** + * Create the config/app.php file if it does not exist. + * + * @param string $dir The application's root directory. + * @param \Composer\IO\IOInterface $io IO interface to write to console. + * @return void + */ + public static function createAppConfig($dir, $io) + { + $appConfig = $dir . '/config/app.php'; + $defaultConfig = $dir . '/config/app.default.php'; + if (!file_exists($appConfig)) { + copy($defaultConfig, $appConfig); + $io->write('Created `config/app.php` file'); + } + } + + /** + * Create the `logs` and `tmp` directories. + * + * @param string $dir The application's root directory. + * @param \Composer\IO\IOInterface $io IO interface to write to console. + * @return void + */ + public static function createWritableDirectories($dir, $io) + { + foreach (static::WRITABLE_DIRS as $path) { + $path = $dir . '/' . $path; + if (!file_exists($path)) { + mkdir($path); + $io->write('Created `' . $path . '` directory'); + } + } + } + + /** + * Set globally writable permissions on the "tmp" and "logs" directory. + * + * This is not the most secure default, but it gets people up and running quickly. + * + * @param string $dir The application's root directory. + * @param \Composer\IO\IOInterface $io IO interface to write to console. + * @return void + */ + public static function setFolderPermissions($dir, $io) + { + // Change the permissions on a path and output the results. + $changePerms = function ($path) use ($io) { + $currentPerms = fileperms($path) & 0777; + $worldWritable = $currentPerms | 0007; + if ($worldWritable == $currentPerms) { + return; + } + + $res = chmod($path, $worldWritable); + if ($res) { + $io->write('Permissions set on ' . $path); + } else { + $io->write('Failed to set permissions on ' . $path); + } + }; + + $walker = function ($dir) use (&$walker, $changePerms) { + $files = array_diff(scandir($dir), ['.', '..']); + foreach ($files as $file) { + $path = $dir . '/' . $file; + + if (!is_dir($path)) { + continue; + } + + $changePerms($path); + $walker($path); + } + }; + + $walker($dir . '/tmp'); + $changePerms($dir . '/tmp'); + $changePerms($dir . '/logs'); + } + + /** + * Set the security.salt value in the application's config file. + * + * @param string $dir The application's root directory. + * @param \Composer\IO\IOInterface $io IO interface to write to console. + * @return void + */ + public static function setSecuritySalt($dir, $io) + { + $newKey = hash('sha256', Security::randomBytes(64)); + static::setSecuritySaltInFile($dir, $io, $newKey, 'app.php'); + } + + /** + * Set the security.salt value in a given file + * + * @param string $dir The application's root directory. + * @param \Composer\IO\IOInterface $io IO interface to write to console. + * @param string $newKey key to set in the file + * @param string $file A path to a file relative to the application's root + * @return void + */ + public static function setSecuritySaltInFile($dir, $io, $newKey, $file) + { + $config = $dir . '/config/' . $file; + $content = file_get_contents($config); + + $content = str_replace('__SALT__', $newKey, $content, $count); + + if ($count == 0) { + $io->write('No Security.salt placeholder to replace.'); + + return; + } + + $result = file_put_contents($config, $content); + if ($result) { + $io->write('Updated Security.salt value in config/' . $file); + + return; + } + $io->write('Unable to update Security.salt value.'); + } + + /** + * Set the APP_NAME value in a given file + * + * @param string $dir The application's root directory. + * @param \Composer\IO\IOInterface $io IO interface to write to console. + * @param string $appName app name to set in the file + * @param string $file A path to a file relative to the application's root + * @return void + */ + public static function setAppNameInFile($dir, $io, $appName, $file) + { + $config = $dir . '/config/' . $file; + $content = file_get_contents($config); + $content = str_replace('__APP_NAME__', $appName, $content, $count); + + if ($count == 0) { + $io->write('No __APP_NAME__ placeholder to replace.'); + + return; + } + + $result = file_put_contents($config, $content); + if ($result) { + $io->write('Updated __APP_NAME__ value in config/' . $file); + + return; + } + $io->write('Unable to update __APP_NAME__ value.'); + } +} diff --git a/community_server/src/Controller/AddressTypesController.php b/community_server/src/Controller/AddressTypesController.php new file mode 100644 index 000000000..348a8e9e6 --- /dev/null +++ b/community_server/src/Controller/AddressTypesController.php @@ -0,0 +1,107 @@ +paginate($this->AddressTypes); + + $this->set(compact('addressTypes')); + } + + /** + * View method + * + * @param string|null $id Address Type id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $addressType = $this->AddressTypes->get($id, [ + 'contain' => ['StateGroupAddresses', 'TransactionGroupAddaddress'] + ]); + + $this->set('addressType', $addressType); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $addressType = $this->AddressTypes->newEntity(); + if ($this->request->is('post')) { + $addressType = $this->AddressTypes->patchEntity($addressType, $this->request->getData()); + if ($this->AddressTypes->save($addressType)) { + $this->Flash->success(__('The address type has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The address type could not be saved. Please, try again.')); + } + $this->set(compact('addressType')); + } + + /** + * Edit method + * + * @param string|null $id Address Type id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $addressType = $this->AddressTypes->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $addressType = $this->AddressTypes->patchEntity($addressType, $this->request->getData()); + if ($this->AddressTypes->save($addressType)) { + $this->Flash->success(__('The address type has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The address type could not be saved. Please, try again.')); + } + $this->set(compact('addressType')); + } + + /** + * Delete method + * + * @param string|null $id Address Type id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $addressType = $this->AddressTypes->get($id); + if ($this->AddressTypes->delete($addressType)) { + $this->Flash->success(__('The address type has been deleted.')); + } else { + $this->Flash->error(__('The address type could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/AdminErrorsController.php b/community_server/src/Controller/AdminErrorsController.php new file mode 100644 index 000000000..a9688008e --- /dev/null +++ b/community_server/src/Controller/AdminErrorsController.php @@ -0,0 +1,111 @@ +paginate = [ + 'contain' => ['StateUsers'] + ]; + $adminErrors = $this->paginate($this->AdminErrors); + + $this->set(compact('adminErrors')); + } + + /** + * View method + * + * @param string|null $id Admin Error id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $adminError = $this->AdminErrors->get($id, [ + 'contain' => ['StateUsers'] + ]); + + $this->set('adminError', $adminError); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $adminError = $this->AdminErrors->newEntity(); + if ($this->request->is('post')) { + $adminError = $this->AdminErrors->patchEntity($adminError, $this->request->getData()); + if ($this->AdminErrors->save($adminError)) { + $this->Flash->success(__('The admin error has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The admin error could not be saved. Please, try again.')); + } + $stateUsers = $this->AdminErrors->StateUsers->find('list', ['limit' => 200]); + $this->set(compact('adminError', 'stateUsers')); + } + + /** + * Edit method + * + * @param string|null $id Admin Error id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $adminError = $this->AdminErrors->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $adminError = $this->AdminErrors->patchEntity($adminError, $this->request->getData()); + if ($this->AdminErrors->save($adminError)) { + $this->Flash->success(__('The admin error has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The admin error could not be saved. Please, try again.')); + } + $stateUsers = $this->AdminErrors->StateUsers->find('list', ['limit' => 200]); + $this->set(compact('adminError', 'stateUsers')); + } + + /** + * Delete method + * + * @param string|null $id Admin Error id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $adminError = $this->AdminErrors->get($id); + if ($this->AdminErrors->delete($adminError)) { + $this->Flash->success(__('The admin error has been deleted.')); + } else { + $this->Flash->error(__('The admin error could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/AppController.php b/community_server/src/Controller/AppController.php new file mode 100644 index 000000000..2c59a17e0 --- /dev/null +++ b/community_server/src/Controller/AppController.php @@ -0,0 +1,341 @@ +loadComponent('Security');` + * + * @return void + */ + public function initialize() + { + parent::initialize(); + + $this->loadComponent('RequestHandler', [ + 'enableBeforeRedirect' => false, + ]); + $this->loadComponent('Flash'); + + $this->loadComponent('Auth', [ + 'loginAction' => [ + 'controller' => 'ServerUsers', + 'action' => 'login' + ], + 'loginRedirect' => [ + 'controller' => 'Transactions', + 'action' => 'index' + ], + 'logoutRedirect' => [ + 'controller' => 'Pages', + 'action' => 'display', + 'gradido' + ], + 'authenticate' => [ + 'all' => ['userModel' => 'ServerUsers'], + 'Form' => [ + 'userModel' => 'ServerUsers', + ] + ] + ]); + + $this->Auth->deny(['index']); + + /* + * Enable the following component for recommended CakePHP security settings. + * see https://book.cakephp.org/3.0/en/controllers/components/security.html + */ + //$this->loadComponent('Security'); + + + // load current balance + $session = $this->getRequest()->getSession(); + $state_user_id = $session->read('StateUser.id'); + if ($state_user_id) { + $stateBalancesTable = TableRegistry::getTableLocator()->get('stateBalances'); + $stateBalanceQuery = $stateBalancesTable + ->find('all') + ->select('amount') + ->contain(false) + ->where(['state_user_id' => $state_user_id]); + if ($stateBalanceQuery->count() == 1) { + //var_dump($stateBalanceEntry->first()); + $session->write('StateUser.balance', $stateBalanceQuery->first()->amount); + //echo "stateUser.balance: " . $session->read('StateUser.balance'); + } + } + + // load error count + if ($state_user_id) { + $stateErrorsTable = TableRegistry::getTableLocator()->get('stateErrors'); + $stateErrorQuery = $stateErrorsTable + ->find('all') + ->select('id') + ->contain(false) + ->where(['state_user_id' => $state_user_id]); + $session->write('StateUser.errorCount', $stateErrorQuery->count()); + } + //echo "initialize"; + + + // put current page into global for navi + $GLOBALS["passed"] = null; + $side = $this->request->getParam('controller'); + $GLOBALS["side"] = $side; + $subside = $this->request->getParam('action'); + $passedArguments = $this->request->getParam('pass'); + if ($passedArguments) { + $GLOBALS["passed"] = $passedArguments[0]; + } + $GLOBALS["subside"] = $subside; + + // server login + if ($this->Auth->user('id')) { + $GLOBALS['ServerUser'] = $this->Auth->user(); + } + + // login server url + $loginServer = Configure::read('LoginServer'); + if ($loginServer && isset($loginServer['url'])) { + $this->loginServerUrl = $loginServer['url'] . '/'; + } else { + $this->loginServerUrl = Router::url('/', true); + } + } + + protected function requestLogin($session_id = 0) + { + $session = $this->getRequest()->getSession(); + // check login + // disable encryption for cookies + //$this->Cookie->configKey('User', 'encryption', false); + if(!$session_id) { + $session_id = intval($this->request->getCookie('GRADIDO_LOGIN', '')); + } + $ip = $this->request->clientIp(); + if (!$session->check('client_ip')) { + $session->write('client_ip', $ip); + } + // login server cannot detect host ip + // TODO: update login server, recognize nginx real ip header + $loginServer = Configure::read('LoginServer'); + + if ($session_id != 0) { + $userStored = $session->read('StateUser'); + + + $transactionPendings = $session->read('Transaction.pending'); + $transactionExecutings = $session->read('Transaction.executing'); + if ($session->read('session_id') != $session_id || + ( $userStored && (!isset($userStored['id']) || !$userStored['email_checked'])) || + intval($transactionPendings) > 0 || + intval($transactionExecutings) > 0) { + $http = new Client(); + + try { + $url = $loginServer['host'] . ':' . $loginServer['port']; + + $response = $http->get($url . '/login', ['session_id' => $session_id]); + $json = $response->getJson(); + + if (isset($json) && count($json) > 0) { + if ($json['state'] === 'success') { + //echo "email checked: " . $json['user']['email_checked'] . ";
    "; + if ($session->read('session_id') != $session_id || + ( $userStored && !isset($userStored['id']))) { + $session->destroy(); + } + foreach ($json['user'] as $key => $value) { + $session->write('StateUser.' . $key, $value); + } + //var_dump($json); + $transactionPendings = $json['Transaction.pending']; + $transactionExecuting = $json['Transaction.executing']; + //echo "read transaction pending: $transactionPendings
    "; + $session->write('Transaction.pending', $transactionPendings); + $session->write('Transaction.executing', $transactionExecuting); + $session->write('session_id', $session_id); + $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); + + if (isset($json['user']['public_hex']) && $json['user']['public_hex'] != '') { + $public_key_bin = hex2bin($json['user']['public_hex']); + $stateUserQuery = $stateUserTable + ->find('all') + ->where(['public_key' => $public_key_bin]) + ->contain(['StateBalances']); + if ($stateUserQuery->count() == 1) { + $stateUser = $stateUserQuery->first(); + if ($stateUser->first_name != $json['user']['first_name'] || + $stateUser->last_name != $json['user']['last_name'] || + $stateUser->disabled != intval($json['user']['disabled']) || + //$stateUser->username != $json['user']['username'] || + // -> throws error + $stateUser->email != $json['user']['email'] + ) { + $stateUser->first_name = $json['user']['first_name']; + $stateUser->last_name = $json['user']['last_name']; + $stateUser->disabled = intval($json['user']['disabled']); + //$stateUser->username = $json['user']['username']; + $stateUser->email = $json['user']['email']; + if (!$stateUserTable->save($stateUser)) { + $this->Flash->error(__('error updating state user ' . json_encode($stateUser->errors()))); + } + } + //var_dump($stateUser); + if (count($stateUser->state_balances) > 0) { + $session->write('StateUser.balance', $stateUser->state_balances[0]->amount); + } + $session->write('StateUser.id', $stateUser->id); + //echo $stateUser['id']; + } else { + $newStateUser = $stateUserTable->newEntity(); + $newStateUser->public_key = $public_key_bin; + $newStateUser->first_name = $json['user']['first_name']; + $newStateUser->last_name = $json['user']['last_name']; + $newStateUser->disabled = intval($json['user']['disabled']); + //$newStateUser->username = $json['user']['username']; + $newStateUser->email = $json['user']['email']; + if (!$stateUserTable->save($newStateUser)) { + $this->Flash->error(__('error saving state user ' . json_encode($newStateUser->errors()))); + } + $session->write('StateUser.id', $newStateUser->id); + //echo $newStateUser->id; + } + } else { + // we haven't get a pubkey? something seems to gone wrong on the login-server + $this->Flash->error(__('no pubkey')); + //var_dump($json); + return $this->redirect($this->loginServerUrl . 'account/error500/noPubkey', 303); + } + } else { + if ($json['state'] === 'not found') { + $this->Flash->error(__('invalid session')); + } else { + $this->Flash->error(__('Konto ist nicht aktiviert!')); + } + //die(json_encode($json)); + return $this->redirect($this->loginServerUrl . 'account/', 303); + } + } + } catch (\Exception $e) { + $msg = $e->getMessage(); + $this->Flash->error(__('error http request: ') . $msg); + return $this->redirect(['controller' => 'Dashboard', 'action' => 'errorHttpRequest']); + //continue; + } + } + } else { + // no login + //die("no login"); + if (isset($loginServer['path'])) { + return $this->redirect($loginServer['path'], 303); + } else { + return $this->redirect($this->loginServerUrl . 'account/', 303); + } + } + return true; + } + + /* + public function beforeFilter(Event $event) + { + //$this->Auth->allow(['display']); + } + */ + + public function addAdminError($controller, $action, array $returnTable, $state_user_id) + { + if (!is_array($returnTable)) { + $this->addAdminError('AppController', 'addAdminError', ['state' => 'error', 'msg' => 'returnTable isn\'t array', 'details' => gettype($returnTable)], $state_user_id); + return false; + } + $adminErrorTable = TableRegistry::getTableLocator()->get('AdminErrors'); + $adminErrorEntity = $adminErrorTable->newEntity(); + $adminErrorEntity->state_user_id = $state_user_id; + $adminErrorEntity->controller = $controller; + $adminErrorEntity->action = $action; + $adminErrorEntity->state = $returnTable['state']; + if (isset($returnTable['msg'])) { + $adminErrorEntity->msg = $returnTable['msg']; + } else { + $adminErrorEntity->msg = __('(Leere Message)'); + } + if (isset($returnTable['details'])) { + $adminErrorEntity->details = $returnTable['details']; + } else { + $adminErrorEntity->details = __('(Leere Details)'); + } + if (!$adminErrorTable->save($adminErrorEntity)) { + $this->Flash->error( + __('Serious error, couldn\'t save to db, please write the admin: ' . $this->getAdminEmailLink()), + ['escape' => false] + ); + } + return true; + } + + public function getAdminEmailLink($text = '') + { + $serverAdminEmail = Configure::read('ServerAdminEmail'); + return ''. $serverAdminEmail . ''; + } + + public function returnJsonEncoded($json) + { + $this->autoRender = false; + $response = $this->response->withType('application/json'); + return $response->withStringBody($json); + } + + public function returnJson($array) + { + $this->autoRender = false; + $response = $this->response->withType('application/json'); + return $response->withStringBody(json_encode($array)); + } + + public function getStartEndForMonth($month, $year) + { + $timeString = $year . '-' . $month . '-01 00:00'; + $firstDay = new Time($timeString); + $lastDay = new Time($timeString); + $lastDay = $lastDay->addMonth(1); + return [$firstDay, $lastDay]; + } +} diff --git a/community_server/src/Controller/CommunityProfilesController.php b/community_server/src/Controller/CommunityProfilesController.php new file mode 100644 index 000000000..c807da72c --- /dev/null +++ b/community_server/src/Controller/CommunityProfilesController.php @@ -0,0 +1,106 @@ +paginate($this->CommunityProfiles); + + $this->set(compact('communityProfiles')); + } + + /** + * View method + * + * @param string|null $id Community Profile id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $communityProfile = $this->CommunityProfiles->get($id, [ + 'contain' => [], + ]); + + $this->set('communityProfile', $communityProfile); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $communityProfile = $this->CommunityProfiles->newEntity(); + if ($this->request->is('post')) { + $communityProfile = $this->CommunityProfiles->patchEntity($communityProfile, $this->request->getData()); + if ($this->CommunityProfiles->save($communityProfile)) { + $this->Flash->success(__('The community profile has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The community profile could not be saved. Please, try again.')); + } + $this->set(compact('communityProfile')); + } + + /** + * Edit method + * + * @param string|null $id Community Profile id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $communityProfile = $this->CommunityProfiles->get($id, [ + 'contain' => [], + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $communityProfile = $this->CommunityProfiles->patchEntity($communityProfile, $this->request->getData()); + if ($this->CommunityProfiles->save($communityProfile)) { + $this->Flash->success(__('The community profile has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The community profile could not be saved. Please, try again.')); + } + $this->set(compact('communityProfile')); + } + + /** + * Delete method + * + * @param string|null $id Community Profile id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $communityProfile = $this->CommunityProfiles->get($id); + if ($this->CommunityProfiles->delete($communityProfile)) { + $this->Flash->success(__('The community profile has been deleted.')); + } else { + $this->Flash->error(__('The community profile could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/Component/GradidoNumberComponent.php b/community_server/src/Controller/Component/GradidoNumberComponent.php new file mode 100644 index 000000000..5db208c3a --- /dev/null +++ b/community_server/src/Controller/Component/GradidoNumberComponent.php @@ -0,0 +1,33 @@ + 'error', 'type' => 'parameter error', 'msg' => 'session_id isn\'t numeric']; + } + if(!is_numeric($user_balance) || intval($user_balance) < 0) { + return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'user_balance invalid']; + } + if(is_array($base64Message)) { + foreach($base64Message as $singleMessage) { + if(!$this->is_base64($singleMessage)) { + return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'at least one base64Message contain invalid base64 characters']; + } + } + } else if(!$this->is_base64($base64Message)) { + return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'base64Message contain invalid base64 characters']; + } + + return $this->sendRequest(json_encode([ + 'session_id' => $session_id, + 'transaction_base64' => $base64Message, + 'balance' => $user_balance + ]), '/checkTransaction'); + + } + + public function getRunningUserTasks($email) + { + if($email == "") { + return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'email is empty']; + } + if(!GenericValidation::email($email, [])) { + return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'email is invalid']; + } + + return $this->sendRequest(json_encode([ + 'email' => $email + ]), '/getRunningUserTasks'); + } + + public function getUsers($session_id, $searchString) + { + if($searchString == "") { + return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'search string is empty']; + } + if(!is_numeric($session_id)) { + return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'session_id isn\'t numeric']; + } + + return $this->sendRequest(json_encode([ + 'session_id' => $session_id, + 'search' => $searchString + ]), '/getUsers'); + } + + public function sendRequest($transactionBody, $url_last_part) { + $http = new Client(); + + $response = $http->post($this->getLoginServerUrl() . $url_last_part, $transactionBody, ['type' => 'json']); + $responseStatus = $response->getStatusCode(); + if($responseStatus != 200) { + return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response status code isn\'t 200', 'details' => $responseStatus]; + } + //$responseType = $response->getType(); + //if($responseType != 'application/json') { +// return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t json', 'details' => $responseType]; +// } + $json = $response->getJson(); + if($json == null) { + //$responseType = $response->getType(); + return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t valid json']; + } + return ['state' => 'success', 'data' => $json]; + } + + public function sendRequestGDT($transactionBody, $url) { + + $http = new Client(); + $gdtServerHost = $this->getGDTServerUrl(); + if(!$gdtServerHost) { + return ['state' => 'warning', 'msg' => 'gdt server not configured']; + } + $fullUrl = $gdtServerHost . DS . $url; + $response = $http->post($this->getGDTServerUrl() . DS . $url, $transactionBody, ['type' => 'json']); + $responseStatus = $response->getStatusCode(); + if($responseStatus != 200) { + return [ + 'state' => 'error', + 'type' => 'request error', + 'msg' => 'server response status code isn\'t 200', + 'details' => $responseStatus, + 'fullUrl' => $fullUrl + ]; + } + //$responseType = $response->getType(); + //if($responseType != 'application/json') { +// return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t json', 'details' => $responseType]; +// } + $json = $response->getJson(); + if($json == null) { + //$responseType = $response->getType(); + return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t valid json']; + } + return ['state' => 'success', 'data' => $json]; + } + + static public function getLoginServerUrl() + { + $loginServer = Configure::read('LoginServer'); + return $loginServer['host'] . ':' . $loginServer['port']; + } + + static public function getGDTServerUrl() + { + $gdtServer = Configure::read('GDTServer'); + if(isset($gdtServer['host'])) { + return $gdtServer['host']; + } + return false; + } + + static public function is_base64($s) + { + return (bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s); + } + +} diff --git a/community_server/src/Controller/Component/JsonRpcRequestClientComponent.php b/community_server/src/Controller/Component/JsonRpcRequestClientComponent.php new file mode 100644 index 000000000..d5ca72808 --- /dev/null +++ b/community_server/src/Controller/Component/JsonRpcRequestClientComponent.php @@ -0,0 +1,71 @@ +rpcClient = new JsonRpcClient(); + } + + // @param id: if id = 0 call rand for it + public function request($method, $params = [], $id = 0) + { + + if(0 == $id) { + $id = random_int(1, 12000); + } + $this->rpcClient->query($id, $method, $params); + + $message = $this->rpcClient->encode(); + return $this->sendRequest($message); + // message: {"jsonrpc":"2.0","method":"add","params":[1,2],"id":1} + } + + public function sendRequest($message) { + $http = new Client(); + + $response = $http->post($this->getGradidoNodeUrl(), $message, ['type' => 'json']); + $responseStatus = $response->getStatusCode(); + if($responseStatus != 200) { + return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response status code isn\'t 200', 'details' => $responseStatus]; + } + //$responseType = $response->getType(); + //if($responseType != 'application/json') { +// return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t json', 'details' => $responseType]; +// } + $json = $response->getJson(); + if($json == null) { + //$responseType = $response->getType(); + return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t valid json']; + } + return $json; + //return ['state' => 'success', 'data' => $json]; + } + + static public function getGradidoNodeUrl() + { + $gradidoNode = Configure::read('GradidoNode'); + return $gradidoNode['host'] . ':' . $gradidoNode['port']; + } + + +} + + diff --git a/community_server/src/Controller/DashboardController.php b/community_server/src/Controller/DashboardController.php new file mode 100644 index 000000000..e25374821 --- /dev/null +++ b/community_server/src/Controller/DashboardController.php @@ -0,0 +1,78 @@ +Auth->allow(['add', 'edit']); + $this->Auth->allow(['index', 'errorHttpRequest']); + $this->set( + 'naviHierarchy', + (new NaviHierarchy())-> + add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', true)) + ); + } + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if($result !== true) { + return $result; + } + $user = $session->read('StateUser'); + $serverUser = $this->Auth->user('id'); + if($serverUser) { + $adminErrorsTable = TableRegistry::getTableLocator()->get('AdminErrors'); + $adminErrorCount = $adminErrorsTable->find('all')->count(); + $this->set('adminErrorCount', $adminErrorCount); + } + + $this->set('user', $user); + $this->set('serverUser', $serverUser); + $this->set('timeUsed', microtime(true) - $startTime); + + } + + public function serverIndex() + { + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $adminErrorsTable = TableRegistry::getTableLocator()->get('AdminErrors'); + $adminErrorCount = $adminErrorsTable->find('all')->count(); + + $this->set('adminErrorCount', $adminErrorCount); + $this->set('timeUsed', microtime(true) - $startTime); + } + + public function errorHttpRequest() + { + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $this->set('timeUsed', microtime(true) - $startTime); + } + +} diff --git a/community_server/src/Controller/ElopageBuysController.php b/community_server/src/Controller/ElopageBuysController.php new file mode 100644 index 000000000..e097eddbb --- /dev/null +++ b/community_server/src/Controller/ElopageBuysController.php @@ -0,0 +1,165 @@ +paginate = [ + 'contain' => false, + ]; + $elopageBuys = $this->paginate($this->ElopageBuys); + + $this->set(compact('elopageBuys')); + } + + public function statistics() + { + $this->viewBuilder()->setLayout('frontend'); + $connection = ConnectionManager::get('loginServer'); + $dates = $connection->execute('SELECT success_date FROM elopage_buys group by CAST(success_date as DATE)')->fetchAll('assoc'); + + $datesTree = []; + foreach($dates as $i => $date) { + + $date = new Time($date['success_date']); + if(!isset($datesTree[$date->year])) { + $datesTree[$date->year] = []; + } + if(!isset($datesTree[$date->year][$date->month])) { + $datesTree[$date->year][$date->month] = true; + } + } + //var_dump($datesTree); + + $now = Time::now(); + $lastDay = Time::now(); + $lastDay->day = 1; + $now->day = 1; + $lastDay->setTime(0,0,0,0); + $now->setTime(0,0,0,0); + // only for test + $now->month = 11; + $lastDay->month = 11; + $now->year = 2019; + $lastDay->year = 2019; +// var_dump($now); + + $lastDay = $lastDay->addMonth(1); + $sortDate = $this->getStartEndForMonth(11, 2019); + $elopageBuys = $this->ElopageBuys + ->find('all') + ->where(['success_date >=' => $sortDate[0], 'success_date <' => $sortDate[1]]); + $users = []; + foreach($elopageBuys as $elopageEntry) { + array_push($users, $elopageEntry->payer_email); + } + $unique_users = array_unique($users); + + $userTable = TableRegistry::getTableLocator()->get('Users'); + $users = $userTable->find('all') + ->where(['created >=' => $sortDate[0], 'created <' => $sortDate[1]]); + + $this->set(compact('elopageBuys', 'users')); + } + + /** + * View method + * + * @param string|null $id Elopage Buy id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $elopageBuy = $this->ElopageBuys->get($id, [ + 'contain' => false, + ]); + + $this->set('elopageBuy', $elopageBuy); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $elopageBuy = $this->ElopageBuys->newEntity(); + if ($this->request->is('post')) { + $elopageBuy = $this->ElopageBuys->patchEntity($elopageBuy, $this->request->getData()); + if ($this->ElopageBuys->save($elopageBuy)) { + $this->Flash->success(__('The elopage buy has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The elopage buy could not be saved. Please, try again.')); + } + + $this->set(compact('elopageBuy')); + } + + /** + * Edit method + * + * @param string|null $id Elopage Buy id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $elopageBuy = $this->ElopageBuys->get($id, [ + 'contain' => false, + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $elopageBuy = $this->ElopageBuys->patchEntity($elopageBuy, $this->request->getData()); + if ($this->ElopageBuys->save($elopageBuy)) { + $this->Flash->success(__('The elopage buy has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The elopage buy could not be saved. Please, try again.')); + } + $this->set(compact('elopageBuy')); + } + + /** + * Delete method + * + * @param string|null $id Elopage Buy id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $elopageBuy = $this->ElopageBuys->get($id); + if ($this->ElopageBuys->delete($elopageBuy)) { + $this->Flash->success(__('The elopage buy has been deleted.')); + } else { + $this->Flash->error(__('The elopage buy could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/ElopageWebhookController.php b/community_server/src/Controller/ElopageWebhookController.php new file mode 100644 index 000000000..4e806fa69 --- /dev/null +++ b/community_server/src/Controller/ElopageWebhookController.php @@ -0,0 +1,51 @@ +Auth->allow(['put']); + + } + + public function put() + { + $this->autoRender = false; + $data = $this->request->getData(); + $response = $this->response->withType('text/plain'); + + $dataString = http_build_query($data); + //$this->recursiveArrayToString($data, $dataString); + // %5B => [ + // %5D => ] + $dataString = preg_replace(['/\%5B/', '/\%5D/'], ['[', ']'], $dataString); + //var_dump($dataString); + + //2020-02-27T13:52:32+01:00 + $dateString = date('c'); + $fh = fopen('/etc/grd_login/php_elopage_requests.txt', 'a'); + if($fh === FALSE) { + return $response->withStringBody('400 ERROR'); + } + fwrite($fh, $dateString); + fwrite($fh, "\n"); + fwrite($fh, $dataString); + fwrite($fh, "\n"); + fclose($fh); + + + return $response->withStringBody('200 OK'); + + } +} diff --git a/community_server/src/Controller/ErrorController.php b/community_server/src/Controller/ErrorController.php new file mode 100644 index 000000000..43bd2fb52 --- /dev/null +++ b/community_server/src/Controller/ErrorController.php @@ -0,0 +1,70 @@ +loadComponent('RequestHandler', [ + 'enableBeforeRedirect' => false, + ]); + } + + /** + * beforeFilter callback. + * + * @param \Cake\Event\Event $event Event. + * @return \Cake\Http\Response|null|void + */ + public function beforeFilter(Event $event) + { + } + + /** + * beforeRender callback. + * + * @param \Cake\Event\Event $event Event. + * @return \Cake\Http\Response|null|void + */ + public function beforeRender(Event $event) + { + parent::beforeRender($event); + + $this->viewBuilder()->setTemplatePath('Error'); + } + + /** + * afterFilter callback. + * + * @param \Cake\Event\Event $event Event. + * @return \Cake\Http\Response|null|void + */ + public function afterFilter(Event $event) + { + } +} diff --git a/community_server/src/Controller/JsonRequestHandlerController.php b/community_server/src/Controller/JsonRequestHandlerController.php new file mode 100644 index 000000000..e5823397e --- /dev/null +++ b/community_server/src/Controller/JsonRequestHandlerController.php @@ -0,0 +1,261 @@ +loadComponent('JsonRequestClient'); + //$this->Auth->allow(['add', 'edit']); + $this->Auth->allow('index'); + } + + + public function index() + { + if($this->request->is('get')) { + $method = $this->request->getQuery('method'); + switch($method) { + case 'getRunningUserTasks': return $this->getRunningUserTasks(); + } + return $this->returnJson(['state' => 'error', 'msg' => 'unknown method for get', 'details' => $method]); + } + else if($this->request->is('post')) { + $jsonData = $this->request->input('json_decode'); + //var_dump($jsonData); + if($jsonData == NULL || !isset($jsonData->method)) { + return $this->returnJson(['state' => 'error', 'msg' => 'parameter error']); + } + $method = $jsonData->method; + + switch($method) { + case 'putTransaction': + if(!isset($jsonData->transaction)) { + return $this->returnJson(['state' => 'error', 'msg' => 'parameter error']); + } else { + return $this->putTransaction($jsonData->transaction); + } + case 'userDelete': return $this->userDelete($jsonData->user); + case 'moveTransaction': return $this->moveTransaction($jsonData->pubkeys, $jsonData->memo, $jsonData->session_id); + case 'checkUser': return $this->checkUser($jsonData->email, $jsonData->last_name); + case 'getUsers' : return $this->getUsers($jsonData->page, $jsonData->limit); + case 'getUserBalance': return $this->getUserBalance($jsonData->email, $jsonData->last_name); + case 'errorInTransaction': return $this->errorInTransaction($jsonData->created, $jsonData->transactionGenericHash, $jsonData->error, $jsonData->errorMessage); + } + return $this->returnJson(['state' => 'error', 'msg' => 'unknown method for post', 'details' => $method]); + } + return $this->returnJson(['state' => 'error', 'msg' => 'no post or get']); + } + + //! \param $transactionCreated creation of transaction in timestamp in seconds + //! -1 if transaction couldn't decode + //! \param $transactionBodyBase64Sha256 generic hash from transaction body serialized and converted to base64 + //! using sodium_crypto_generichash to calculate + // hash also in base64 format + //! \param $error short error name in user language + //! \param $errorDetails more detailed error message in user language + private function errorInTransaction($transactionCreated, $transactionBodyBase64GenericHash, $error, $errorDetails) { + /* + * payload.set("created", created); + * payload.set("id", task_model->getID()); + * payload.set("public_key", user_model->getPublicKeyHex()); + * payload.set("error", error); + * payload.set("errorMessage", errorDetails); + */ + } + + private function putTransaction($transactionBase64) { + $transaction = new Transaction($transactionBase64); + //echo "after new transaction
    "; + if($transaction->hasErrors()) { + return $this->returnJson(['state' => 'error', 'msg' => 'error parsing transaction', 'details' => $transaction->getErrors()]); + } + //echo "after check on errors
    "; + if(!$transaction->validate()) { + return $this->returnJsonSaveError($transaction, ['state' => 'error', 'msg' => 'error validate transaction', 'details' => $transaction->getErrors()]); + } + //echo "after validate
    "; + + if ($transaction->save()) { + + + // success + return $this->returnJson(['state' => 'success']); + } else { + return $this->returnJsonSaveError($transaction, [ + 'state' => 'error', + 'msg' => 'error saving transaction in db', + 'details' => json_encode($transaction->getErrors()) + ]); + } + + return $this->returnJson(['state' => 'success']); + } + + private function moveTransaction($pubkeys, $memo, $session_id) { + //$pubkeys->sender + //$pubkeys->receiver + $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); + $user = $stateUserTable->find('all')->where(['public_key' => hex2bin($pubkeys->sender)])->contain(['StateBalances']); + if(!$user->count()) { + return $this->returnJson(['state' => 'not found', 'msg' => 'user not found or empty balance']); + } + $amountCent = $user->first()->state_balances[0]->amount; + //var_dump($user->first()); + $builderResult = TransactionTransfer::build( + $amountCent, + $memo, + $pubkeys->receiver, + $pubkeys->sender + ); + if($builderResult['state'] === 'success') { + + $http = new Client(); + try { + $loginServer = Configure::read('LoginServer'); + $url = $loginServer['host'] . ':' . $loginServer['port']; + + $response = $http->post($url . '/checkTransaction', json_encode([ + 'session_id' => $session_id, + 'transaction_base64' => base64_encode($builderResult['transactionBody']->serializeToString()), + 'balance' => $amountCent + ]), ['type' => 'json']); + $json = $response->getJson(); + if($json['state'] != 'success') { + if($json['msg'] == 'session not found') { + return $this->returnJson(['state' => 'error', 'msg' => 'session not found']); + } else { + //$this->Flash->error(__('login server return error: ' . json_encode($json))); + return $this->returnJson(['state' => 'error', 'msg' => 'login server return error', 'details' => $json]); + } + } else { + return $this->returnJson(['state' => 'success']); + } + + } catch(\Exception $e) { + $msg = $e->getMessage(); + //$this->Flash->error(__('error http request: ') . $msg); + return $this->returnJson(['state' => 'error', 'msg' => 'error http request', 'details' => $msg]); + } + + } else { + return $this->returnJson(['state' => 'error', 'msg' => 'error building transaction']); + } + } + + private function userDelete($userPubkeyHex) { + $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); + $user = $stateUserTable->find('all')->where(['public_key' => hex2bin($userPubkeyHex)]); + if(!$user || $user->count == 0) { + return $this->returnJson(['state' => 'error', 'msg' => 'user not found']); + } + + } + + private function checkUser($email, $last_name) { + $userTable = TableRegistry::getTableLocator()->get('Users'); + $user = $userTable->find('all') + ->where(['email' => $email]) + ->contain([]) + ->select(['first_name', 'last_name', 'email']); + if(!$user->count()) { + return $this->returnJson(['state' => 'not found', 'msg' => 'user not found']); + } + if($user->count() == 1 && $user->first()->last_name == $last_name) { + return $this->returnJson(['state' => 'success']); + } + return $this->returnJson(['state' => 'not identical', 'user' => $user->toArray()]); + } + + private function getUserBalance($email, $last_name) { + + $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); + $stateUsers = $stateUserTable->find('all')->where(['OR' => ['email' => $email, 'last_name' => $last_name]])->contain(['StateBalances']); + $gdds = []; + foreach($stateUsers as $stateUser) { + foreach($stateUser->state_balances as $stateBalance) { + if(!isset($gdds[$stateUser->email])) { + $gdds[$stateUser->email] = []; + } + if(!isset($gdds[$stateUser->email][$stateUser->last_name])) { + $gdds[$stateUser->email][$stateUser->last_name] = 0; + } + $gdds[$stateUser->email][$stateUser->last_name] += $stateBalance->amount; + } + } + return $this->returnJson(['state' => 'success', 'gdds' => $gdds]); + } + + private function getUsers($page, $count) { + + $userTable = TableRegistry::getTableLocator()->get('Users'); + $this->paginate = [ + 'limit' => $count, + 'page' => $page + ]; + $usersQuery = $userTable->find('all') + ->select(['first_name', 'last_name', 'email']) + ->order(['id']); + try { + return $this->returnJson(['state' => 'success', 'users' => $this->paginate($usersQuery)]); + } catch (Exception $ex) { + return $this->returnJson(['state' => 'exception', 'msg' => 'error paginate users', 'details' => $ex->getMessage()]); + } + + + //return $this->returnJson(['state' => 'success', 'users' => $users->toArray()]); + + } + + private function getRunningUserTasks() { + $session = $this->getRequest()->getSession(); + $state_user_email = $session->read('StateUser.email'); + $requestResult = $this->JsonRequestClient->getRunningUserTasks($state_user_email);; + return $this->returnJson($requestResult); + } + + + private function returnJsonSaveError($transaction, $errorArray) { + $json = json_encode($errorArray); + $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); + $pub = $transaction->getFirstPublic(); + $stateUserQuery = $stateUserTable + ->find('all') + ->where(['public_key' => $pub]) + ->contain(false); + if($stateUserQuery->count() == 1) { + $stateErrorsTable = TableRegistry::getTableLocator()->get('StateErrors'); + $stateErrorEntity = $stateErrorsTable->newEntity(); + $stateErrorEntity->state_user_id = $stateUserQuery->first()->id; + $stateErrorEntity->transaction_type_id = $transaction->getTransactionBody()->getTransactionTypeId(); + $stateErrorEntity->message_json = $json; + $stateErrorsTable->save($stateErrorEntity); + } else { + $errorArray['user_error'] = "user with $pub not found"; + $json = json_encode($errorArray); + } + + return $this->returnJsonEncoded($json); + } + + + +} diff --git a/community_server/src/Controller/OperatorTypesController.php b/community_server/src/Controller/OperatorTypesController.php new file mode 100644 index 000000000..41db53f53 --- /dev/null +++ b/community_server/src/Controller/OperatorTypesController.php @@ -0,0 +1,106 @@ +paginate($this->OperatorTypes); + + $this->set(compact('operatorTypes')); + } + + /** + * View method + * + * @param string|null $id Operator Type id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $operatorType = $this->OperatorTypes->get($id, [ + 'contain' => ['Operators'] + ]); + + $this->set('operatorType', $operatorType); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $operatorType = $this->OperatorTypes->newEntity(); + if ($this->request->is('post')) { + $operatorType = $this->OperatorTypes->patchEntity($operatorType, $this->request->getData()); + if ($this->OperatorTypes->save($operatorType)) { + $this->Flash->success(__('The operator type has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The operator type could not be saved. Please, try again.')); + } + $this->set(compact('operatorType')); + } + + /** + * Edit method + * + * @param string|null $id Operator Type id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $operatorType = $this->OperatorTypes->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $operatorType = $this->OperatorTypes->patchEntity($operatorType, $this->request->getData()); + if ($this->OperatorTypes->save($operatorType)) { + $this->Flash->success(__('The operator type has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The operator type could not be saved. Please, try again.')); + } + $this->set(compact('operatorType')); + } + + /** + * Delete method + * + * @param string|null $id Operator Type id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $operatorType = $this->OperatorTypes->get($id); + if ($this->OperatorTypes->delete($operatorType)) { + $this->Flash->success(__('The operator type has been deleted.')); + } else { + $this->Flash->error(__('The operator type could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/OperatorsController.php b/community_server/src/Controller/OperatorsController.php new file mode 100644 index 000000000..974151a7b --- /dev/null +++ b/community_server/src/Controller/OperatorsController.php @@ -0,0 +1,236 @@ +Auth->allow(['ajaxSave', 'ajaxLoad', 'ajaxDelete']); + } + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $this->paginate = [ + 'contain' => ['OperatorTypes'] + ]; + $operators = $this->paginate($this->Operators); + + $this->set(compact('operators')); + } + + public function ajaxSave() + { + if ($this->request->is('post')) { + + $operatorTypeName = $this->request->getData('operator_type_name'); + $username = $this->request->getData('username'); + $pubkey_bin = base64_decode($this->request->getData('user_pubkey')); + $data = base64_decode($this->request->getData('data_base64')); + $sign = base64_decode($this->request->getData('sign')); + + //$publicKey_hex = bin2hex($pubkey_bin); + //$signature_hex = bin2hex($sign); + + if(!sodium_crypto_sign_verify_detached($sign, $data, $pubkey_bin)) { + return $this->returnJson([ + 'state' => 'wrong signature', + /* 'details' => [ + 'pubkey' => $publicKey_hex, + 'sign' => $signature_hex, + 'data' => bin2hex($data) + ] +*/ + ]); + } + + $operatorTypeId = $this->Operators->OperatorTypes-> + find() + ->where(['name' => $operatorTypeName]) + ->select(['id']) + ->first(); + + // load operator from db if already exist + $operator = $this->Operators + ->find() + ->where([ + 'operator_type_id' => $operatorTypeId->id, + 'username' => $username, + 'user_pubkey' => $pubkey_bin]) + ->first(); + if(!$operator) { + // create new entity + $operator = $this->Operators->newEntity(); + } else { + // check if request has valid signature + + } + + $operator = $this->Operators->patchEntity($operator, $this->request->getData()); + $operator->user_pubkey = $pubkey_bin; + $operator->operator_type_id = $operatorTypeId->id; + if ($this->Operators->save($operator)) { + return $this->returnJson(['state' => 'success']); + } + return $this->returnJson(['state' => 'error', 'details' => $operator->getErrors()]); + } + return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); + } + + public function ajaxLoad() + { + if ($this->request->is('get')) { + $username = $this->request->getQuery('username'); + $operators = $this->Operators + ->find() + ->where(['username' => $username]) + ->contain(['OperatorTypes']) + ->select(['data_base64', 'OperatorTypes.name']) + ->toArray(); + ; + if($operators) { + return $this->returnJson(['state' => 'success', 'operators' => $operators]); + } else { + return $this->returnJson(['state' => 'not found']); + } + + } + return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); + } + + function ajaxDelete() { + if ($this->request->is('delete')) { + $operatorTypeName = $this->request->getData('operator_type_name'); + $username = $this->request->getData('username'); + $pubkey_bin = base64_decode($this->request->getData('user_pubkey')); + $sign = base64_decode($this->request->getData('sign')); + + $operatorTypeId = $this->Operators->OperatorTypes-> + find() + ->where(['name' => $operatorTypeName]) + ->select(['id']) + ->first(); + + // load operator from db if already exist + $operator = $this->Operators + ->find() + ->where([ + 'operator_type_id' => $operatorTypeId->id, + 'username' => $username, + 'user_pubkey' => $pubkey_bin]) + ->first(); + if(!$operator) { + return $this->returnJson(['state' => 'error', 'msg' => 'not found']); + } else { + $data = base64_decode($operator->data_base64); + // check if request has valid signature + if(!sodium_crypto_sign_verify_detached($sign, $data, $pubkey_bin)) { + return $this->returnJson(['state' => 'error', 'msg' => 'wrong signature']); + } + } + if ($this->Operators->delete($operator)) { + return $this->returnJson(['state' => 'success']); + } + return $this->returnJson(['state' => 'error', 'details' => $operator->getErrors()]); + } + return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); + } + + /** + * View method + * + * @param string|null $id Operator id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $operator = $this->Operators->get($id, [ + 'contain' => ['OperatorTypes'] + ]); + + $this->set('operator', $operator); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $operator = $this->Operators->newEntity(); + if ($this->request->is('post')) { + $operator = $this->Operators->patchEntity($operator, $this->request->getData()); + if ($this->Operators->save($operator)) { + $this->Flash->success(__('The operator has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The operator could not be saved. Please, try again.')); + } + $operatorTypes = $this->Operators->OperatorTypes->find('list', ['limit' => 200]); + $this->set(compact('operator', 'operatorTypes')); + } + + /** + * Edit method + * + * @param string|null $id Operator id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $operator = $this->Operators->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $operator = $this->Operators->patchEntity($operator, $this->request->getData()); + if ($this->Operators->save($operator)) { + $this->Flash->success(__('The operator has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The operator could not be saved. Please, try again.')); + } + $operatorTypes = $this->Operators->OperatorTypes->find('list', ['limit' => 200]); + $this->set(compact('operator', 'operatorTypes')); + } + + /** + * Delete method + * + * @param string|null $id Operator id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $operator = $this->Operators->get($id); + if ($this->Operators->delete($operator)) { + $this->Flash->success(__('The operator has been deleted.')); + } else { + $this->Flash->error(__('The operator could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/PagesController.php b/community_server/src/Controller/PagesController.php new file mode 100644 index 000000000..94508ad8b --- /dev/null +++ b/community_server/src/Controller/PagesController.php @@ -0,0 +1,75 @@ +Auth->allow(['display']); + } + + /** + * Displays a view + * + * @param array ...$path Path segments. + * @return \Cake\Http\Response|null + * @throws \Cake\Http\Exception\ForbiddenException When a directory traversal attempt. + * @throws \Cake\Http\Exception\NotFoundException When the view file could not + * be found or \Cake\View\Exception\MissingTemplateException in debug mode. + */ + public function display(...$path) + { + $count = count($path); + if (!$count) { + return $this->redirect('/'); + } + if (in_array('..', $path, true) || in_array('.', $path, true)) { + throw new ForbiddenException(); + } + $page = $subpage = null; + + if (!empty($path[0])) { + $page = $path[0]; + } + if (!empty($path[1])) { + $subpage = $path[1]; + } + $this->set(compact('page', 'subpage')); + + try { + $this->render(implode('/', $path)); + } catch (MissingTemplateException $exception) { + if (Configure::read('debug')) { + throw $exception; + } + throw new NotFoundException(); + } + } +} diff --git a/community_server/src/Controller/ProfileController.php b/community_server/src/Controller/ProfileController.php new file mode 100644 index 000000000..2a378e076 --- /dev/null +++ b/community_server/src/Controller/ProfileController.php @@ -0,0 +1,206 @@ +loadComponent('JsonRequestClient'); + $this->Auth->allow(['index', 'edit']); + $this->set( + 'naviHierarchy', + (new NaviHierarchy())-> + add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))-> + add(new NaviHierarchyEntry(__('Mein Profil'), 'Profile', 'index', true)) + ); + } + /** + * Get binary file data from request data + * + * @return binary data + */ + protected function getFileData($requestData) + { + $binaryFileData = null; + // Get a list of UploadedFile objects + $file = $requestData['profile_img']; + // Read the file data. + $type = $file['type']; + $error = $file['error']; + if ($error === 0 && strpos($type, 'image/') === 0) { + $path = new File($file['tmp_name']); + $binaryFileData = $path->read(true, 'r'); + $this->log("binaryFileData: ".$binaryFileData, 'debug'); + } + return $binaryFileData; + } + /** + * Update Profile Data + * + * ...which is spread over two tables, plus needs to be promoted to the Login Server. + * + * @throws Exception + */ + protected function updateProfileData($requestData, $userId, $communityProfile) + { + // Update Profile with Form Data! + $usersTable = TableRegistry::getTableLocator()->get('StateUsers'); + $stateUserQuery = $usersTable + ->find('all') + ->select(['id', 'first_name', 'last_name']) + ->where(['id' => $userId]); + + if ($stateUserQuery->count() == 1) { + $stateUser = $stateUserQuery->first(); + $stateUser = $usersTable->patchEntity($stateUser, $requestData); + + $profilesTable = TableRegistry::getTableLocator()->get('CommunityProfiles'); + // Save old binary data, because the file input is always empty, in HTML! + $oldBinaryData = $communityProfile['profile_img']; + + $communityProfile = $profilesTable->patchEntity($communityProfile, $requestData); + $communityProfile['state_user_id'] = $userId; + + $binaryFileData = $this->getFileData($requestData); + if ($binaryFileData !== null) { + $this->log("CommunityProfile: Writing binary img data.", 'debug'); + $communityProfile['profile_img'] = $binaryFileData; + } else { + $this->log("CommunityProfile: Nothing uploaded!", 'debug'); + $communityProfile['profile_img'] = $oldBinaryData; + } + if ($profilesTable->save($communityProfile) && + $usersTable->save($stateUser) + ) { + $session = $this->getRequest()->getSession(); + $session_id = $session->read('session_id'); + $email = $session->read('StateUser.email'); + $this->returnJson( + $this->JsonRequestClient->sendRequest( + json_encode( + [ + 'session_id' => $session_id, + 'email' => $email, + 'update' => [ + 'User.first_name' => $requestData['first_name'], + 'User.last_name' => $requestData['last_name'] + ] + ] + ), + '/updateUserInfos' + ) + ); + $this->Flash->success(__('Dein Profil wurde aktualisiert!')); + } + } else { + $this->Flash->error(__("Non-recoverable database problem - state_user doesn't exist or not unique!")); + } + return [$stateUser, $communityProfile]; + } + /** + * Get or create CommunityProfile + * + * @return \Cake\ORM\CommunityProfile + */ + protected function getCommunityProfile($userId) + { + $profilesTable = TableRegistry::getTableLocator()->get('CommunityProfiles'); + $communityProfileQuery = $profilesTable + ->find('all') + ->select(['id', 'profile_img', 'profile_desc']) + ->where(['state_user_id' => $userId]); + if ($communityProfileQuery->count() != 1) { + $communityProfile = $profilesTable->newEntity(); + if ($profilesTable->save($communityProfile)) { + $this->log("CommunityProfile created.", 'debug'); + } + } else { + $communityProfile = $communityProfileQuery->first(); + } + return $communityProfile; + } + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if ($result !== true) { + return $result; + } + $user = $session->read('StateUser'); + $communityProfile = $session->read('CommunityProfile'); + if (!$communityProfile) { + $this->log("CommunityProfile not found in session! Loading or creating new one.", 'debug'); + $session->write('CommunityProfile', $this->getCommunityProfile($user['id'])); + } + $this->set('user', $user); + $this->set('communityProfile', $communityProfile); + $this->set('timeUsed', microtime(true) - $startTime); + } + /** + * Edit method + * + * @return \Cake\Http\Response|null + */ + public function edit() + { + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $session = $this->getRequest()->getSession(); + + $user = $session->read('StateUser'); + $communityProfile = $session->read('CommunityProfile'); + if (!$user) { + $result = $this->requestLogin(); + if ($result !== true) { + return $result; + } + $user = $session->read('StateUser'); + } + if (!$communityProfile) { + $this->log("CommunityProfile not found in session! Loading or creating new one.", 'debug'); + $session->write('CommunityProfile', $this->getCommunityProfile($user['id'])); + } + + $profileForm = new ProfileForm(); + if ($this->request->is('post')) { + $requestData = $this->request->getData(); + if ($profileForm->validate($requestData)) { + [$stateUser, $communityProfile] = $this->updateProfileData($requestData, $user['id'], $communityProfile); + $user['first_name'] = $stateUser['first_name']; + $user['last_name'] = $stateUser['last_name']; + $session->write('StateUser.first_name', $stateUser['first_name']); + $session->write('StateUser.last_name', $stateUser['last_name']); + $session->write('CommunityProfile', $communityProfile); + return $this->redirect(['action' => 'index']); + } else { + $this->Flash->error(__('Something was invalid, please try again!')); + } + } + $this->set('user', $user); + $this->set('communityProfile', $communityProfile); + $this->set('profileForm', $profileForm); + $this->set('timeUsed', microtime(true) - $startTime); + } +} diff --git a/community_server/src/Controller/ServerUsersController.php b/community_server/src/Controller/ServerUsersController.php new file mode 100644 index 000000000..236e35b7f --- /dev/null +++ b/community_server/src/Controller/ServerUsersController.php @@ -0,0 +1,131 @@ +Auth->allow(['add', 'edit']); + $this->Auth->deny('index'); + } + + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $serverUsers = $this->paginate($this->ServerUsers); + $this->set(compact('serverUsers')); + } + + public function login() + { + $startTime = microtime(true); + if ($this->request->is('post')) { + $user = $this->Auth->identify(); + if ($user) { + $this->Auth->setUser($user); + return $this->redirect($this->Auth->redirectUrl()); + } + $this->Flash->error(__('Invalid username or password, try again')); + } + $this->set('timeUsed', microtime(true) - $startTime); + } + + public function logout() + { + return $this->redirect($this->Auth->logout()); + } + + /** + * View method + * + * @param string|null $id Server User id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $serverUser = $this->ServerUsers->get($id, [ + 'contain' => [] + ]); + + $this->set('serverUser', $serverUser); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $serverUser = $this->ServerUsers->newEntity(); + if ($this->request->is('post')) { + $serverUser = $this->ServerUsers->patchEntity($serverUser, $this->request->getData()); + if ($this->ServerUsers->save($serverUser)) { + $this->Flash->success(__('The server user has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The server user could not be saved. Please, try again.')); + } + $this->set(compact('serverUser')); + } + + /** + * Edit method + * + * @param string|null $id Server User id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $serverUser = $this->ServerUsers->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $serverUser = $this->ServerUsers->patchEntity($serverUser, $this->request->getData()); + if ($this->ServerUsers->save($serverUser)) { + $this->Flash->success(__('The server user has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The server user could not be saved. Please, try again.')); + } + $this->set(compact('serverUser')); + } + + /** + * Delete method + * + * @param string|null $id Server User id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $serverUser = $this->ServerUsers->get($id); + if ($this->ServerUsers->delete($serverUser)) { + $this->Flash->success(__('The server user has been deleted.')); + } else { + $this->Flash->error(__('The server user could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/StateBalancesController.php b/community_server/src/Controller/StateBalancesController.php new file mode 100644 index 000000000..5164dce4b --- /dev/null +++ b/community_server/src/Controller/StateBalancesController.php @@ -0,0 +1,477 @@ +Auth->allow(['add', 'edit']); + $this->Auth->allow(['overview', 'overviewGdt', 'ajaxGetBalance']); + $this->loadComponent('JsonRequestClient'); + } + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $this->paginate = [ + 'contain' => ['StateUsers'] + ]; + $stateBalances = $this->paginate($this->StateBalances); + + $this->set(compact('stateBalances')); + } + + + + public function overview() + { + $this->set( + 'naviHierarchy', + (new NaviHierarchy())-> + add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))-> + add(new NaviHierarchyEntry(__('Kontoübersicht'), 'StateBalances', 'overview', true)) + ); + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if ($result !== true) { + return $result; + } + $user = $session->read('StateUser'); + // sendRequestGDT + // listPerEmailApi + + $gdtSum = 0; + //if('admin' === $user['role']) { + $gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi'); + //var_dump($gdtEntries); + if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) { + $gdtSum = intval($gdtEntries['data']['sum']); + } else { + if($user) { + $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id']); + } else { + $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, 0); + } + } + //} + // + // + + $creationsTable = TableRegistry::getTableLocator()->get('TransactionCreations'); + $creationTransactions = $creationsTable + ->find('all') + ->where(['state_user_id' => $user['id']]) + ->contain(['Transactions']); + + $transferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins'); + $transferTransactions = $transferTable + ->find('all') + ->where(['OR' => ['state_user_id' => $user['id'], 'receiver_user_id' => $user['id']]]) + ->contain(['Transactions']); + + $involvedUserIds = []; + + foreach ($transferTransactions as $sendCoins) { + //var_dump($sendCoins); + if ($sendCoins->state_user_id != $user['id']) { + array_push($involvedUserIds, intval($sendCoins->state_user_id)); + } elseif ($sendCoins->receiver_user_id != $user['id']) { + array_push($involvedUserIds, intval($sendCoins->receiver_user_id)); + } + } + + /*echo "state user from sendCoins: $sendCoins->state_user_id
    "; + echo "receiver user from sendCoins: $sendCoins->receiver_user_id
    "; + echo "user id from logged in user: ".$user['id']. '
    '; + */ + //var_dump($involvedUserIds); + // exchange key with values and drop duplicates + $involvedUser_temp = array_flip($involvedUserIds); + // exchange back + $involvedUserIds = array_flip($involvedUser_temp); + $userTable = TableRegistry::getTableLocator()->get('StateUsers'); + $involvedUser = $userTable->find('all', [ + 'contain' => false, + 'where' => ['id IN' => $involvedUserIds], + 'fields' => ['id', 'first_name', 'last_name', 'email'] + ]); + //var_dump($involvedUser->toArray()); + $involvedUserIndices = []; + foreach ($involvedUser as $involvedUser) { + $involvedUserIndices[$involvedUser->id] = $involvedUser; + } + + // sender or receiver when user has sended money + // group name if creation + // type: gesendet / empfangen / geschöpft + // transaktion nr / id + // date + // balance + + $transactions = []; + foreach ($creationTransactions as $creation) { + //var_dump($creation); + array_push($transactions, [ + 'name' => 'Gradido Akademie', + 'type' => 'creation', + 'transaction_id' => $creation->transaction_id, + 'date' => $creation->transaction->received, + 'balance' => $creation->amount, + 'memo' => $creation->transaction->memo + ]); + } + + foreach ($transferTransactions as $sendCoins) { + $type = ''; + $otherUser = null; + if ($sendCoins->state_user_id == $user['id']) { + $type = 'send'; + + if(isset($involvedUserIndices[$sendCoins->receiver_user_id])) { + $otherUser = $involvedUserIndices[$sendCoins->receiver_user_id]; + } + } else if ($sendCoins->receiver_user_id == $user['id']) { + $type = 'receive'; + if(isset($involvedUserIndices[$sendCoins->state_user_id])) { + $otherUser = $involvedUserIndices[$sendCoins->state_user_id]; + } + } + if(null == $otherUser) { + $otherUser = $this->StateBalances->StateUsers->newEntity(); + } + array_push($transactions, [ + 'name' => $otherUser->first_name . ' ' . $otherUser->last_name, + 'email' => $otherUser->email, + 'type' => $type, + 'transaction_id' => $sendCoins->transaction_id, + 'date' => $sendCoins->transaction->received, + 'balance' => $sendCoins->amount, + 'memo' => $sendCoins->transaction->memo + ]); + } + uasort($transactions, array($this, 'sortTransactions')); + $this->set('transactions', $transactions); + $this->set('transactionExecutingCount', $session->read('Transaction.executing')); + $this->set('balance', $session->read('StateUser.balance')); + $this->set('timeUsed', microtime(true) - $startTime); + $this->set('gdtSum', $gdtSum); + } + + public function ajaxGetBalance($session_id) + { + if(!isset($session_id) || !$session_id) { + return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); + } + $startTime = microtime(true); + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin($session_id); + if ($result !== true) { + return $this->returnJson(['state' => 'error', 'msg' => 'session not found']); + } + $user = $session->read('StateUser'); + //var_dump($user); + return $this->returnJson(['state' => 'success', 'balance' => $user['balance']]); + + } + + public function ajaxListTransactions($session_id, $page, $count) + { + if(!isset($session_id) || !$session_id) { + return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); + } + $startTime = microtime(true); + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin($session_id); + if ($result !== true) { + return $this->returnJson(['state' => 'error', 'msg' => 'session not found']); + } + $user = $session->read('StateUser'); + + $gdtSum = 0; + + $gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi'); + + if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) { + $gdtSum = intval($gdtEntries['data']['sum']); + } else { + if($user) { + + $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id']); + } else { + $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, 0); + } + } + + + $creationsTable = TableRegistry::getTableLocator()->get('TransactionCreations'); + $creationTransactions = $creationsTable + ->find('all') + ->where(['state_user_id' => $user['id']]) + ->contain(['Transactions']); + + $transferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins'); + $transferTransactions = $transferTable + ->find('all') + ->where(['OR' => ['state_user_id' => $user['id'], 'receiver_user_id' => $user['id']]]) + ->contain(['Transactions']); + + $involvedUserIds = []; + + foreach ($transferTransactions as $sendCoins) { + //var_dump($sendCoins); + if ($sendCoins->state_user_id != $user['id']) { + array_push($involvedUserIds, intval($sendCoins->state_user_id)); + } elseif ($sendCoins->receiver_user_id != $user['id']) { + array_push($involvedUserIds, intval($sendCoins->receiver_user_id)); + } + } + + /*echo "state user from sendCoins: $sendCoins->state_user_id
    "; + echo "receiver user from sendCoins: $sendCoins->receiver_user_id
    "; + echo "user id from logged in user: ".$user['id']. '
    '; + */ + //var_dump($involvedUserIds); + // exchange key with values and drop duplicates + $involvedUser_temp = array_flip($involvedUserIds); + // exchange back + $involvedUserIds = array_flip($involvedUser_temp); + $userTable = TableRegistry::getTableLocator()->get('StateUsers'); + $involvedUser = $userTable->find('all', [ + 'contain' => false, + 'where' => ['id IN' => $involvedUserIds], + 'fields' => ['id', 'first_name', 'last_name', 'email'] + ]); + //var_dump($involvedUser->toArray()); + $involvedUserIndices = []; + foreach ($involvedUser as $involvedUser) { + $involvedUserIndices[$involvedUser->id] = $involvedUser; + } + + // sender or receiver when user has sended money + // group name if creation + // type: gesendet / empfangen / geschöpft + // transaktion nr / id + // date + // balance + + $transactions = []; + foreach ($creationTransactions as $creation) { + //var_dump($creation); + array_push($transactions, [ + 'name' => 'Gradido Akademie', + 'type' => 'creation', + 'transaction_id' => $creation->transaction_id, + 'date' => $creation->transaction->received, + 'balance' => $creation->amount, + 'memo' => $creation->transaction->memo + ]); + } + + foreach ($transferTransactions as $sendCoins) { + $type = ''; + $otherUser = null; + if ($sendCoins->state_user_id == $user['id']) { + $type = 'send'; + + if(isset($involvedUserIndices[$sendCoins->receiver_user_id])) { + $otherUser = $involvedUserIndices[$sendCoins->receiver_user_id]; + } + } else if ($sendCoins->receiver_user_id == $user['id']) { + $type = 'receive'; + if(isset($involvedUserIndices[$sendCoins->state_user_id])) { + $otherUser = $involvedUserIndices[$sendCoins->state_user_id]; + } + } + if(null == $otherUser) { + $otherUser = $this->StateBalances->StateUsers->newEntity(); + } + array_push($transactions, [ + 'name' => $otherUser->first_name . ' ' . $otherUser->last_name, + 'email' => $otherUser->email, + 'type' => $type, + 'transaction_id' => $sendCoins->transaction_id, + 'date' => $sendCoins->transaction->received, + 'balance' => $sendCoins->amount, + 'memo' => $sendCoins->transaction->memo + ]); + } + uasort($transactions, array($this, 'sortTransactions')); + return $this->returnJson([ + 'state' => 'success', + 'transactions' => $transactions, + 'transactionExecutingCount' => $session->read('Transaction.executing'), + 'count' => count($transactions), + 'gdtSum' => $gdtSum, + 'timeUsed' => microtime(true) - $startTime + ]); + } + + public function overviewGdt() + { + $this->set( + 'naviHierarchy', + (new NaviHierarchy())-> + add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))-> + add(new NaviHierarchyEntry(__('GDT Kontoübersicht'), 'StateBalances', 'overviewGdt', true)) + ); + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if ($result !== true) { + return $result; + } + $user = $session->read('StateUser'); + $requestResult = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'listPerEmailApi'); + + //var_dump($requestResult); + if('success' === $requestResult['state'] && 'success' === $requestResult['data']['state']) { + + //var_dump(array_keys($requestResult['data'])); + $ownEntries = $requestResult['data']['ownEntries']; + //$gdtEntries = $requestResult['data']['entries']; + + $gdtSum = 0; + foreach ($ownEntries as $i => $gdtEntry) { + $gdtSum += $gdtEntry['gdt']; + //echo "index: $i
    "; + //var_dump($gdtEntry); + } + if (isset($requestResult['data']['connectEntrys'])) { + $connectEntries = $requestResult['data']['connectEntrys']; + + foreach ($connectEntries as $entry) { + //if(!$count) var_dump($entry); + //$count++; + $gdtSum += $entry['connect']['gdt_entry']['gdt']; + } + $this->set('connectEntries', $connectEntries); + } + + //echo "gdtSum: $gdtSum
    "; + $this->set('gdtSum', $gdtSum); + $this->set('ownEntries', $ownEntries); + $this->set('gdtSumPerEmail', $requestResult['data']['gdtSumPerEmail']); + $this->set('moreEntrysAsShown', $requestResult['data']['moreEntrysAsShown']); + $this->set('user', $user); + + if (isset($requestResult['data']['publishers'])) { + $publishers = $requestResult['data']['publishers']; + $this->set('publishers', $publishers); + } + } else { + $this->addAdminError('StateBalancesController', 'overviewGdt', $requestResult, $user['id']); + $this->Flash->error(__('Fehler beim GDT Server, bitte abwarten oder den Admin benachrichtigen!')); + } + } + + public function sortTransactions($a, $b) + { + if ($a['date'] == $b['date']) { + return 0; + } + return ($a['date'] > $b['date']) ? -1 : 1; + } + + /** + * View method + * + * @param string|null $id State Balance id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $stateBalance = $this->StateBalances->get($id, [ + 'contain' => ['StateUsers'] + ]); + + $this->set('stateBalance', $stateBalance); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $stateBalance = $this->StateBalances->newEntity(); + if ($this->request->is('post')) { + $stateBalance = $this->StateBalances->patchEntity($stateBalance, $this->request->getData()); + if ($this->StateBalances->save($stateBalance)) { + $this->Flash->success(__('The state balance has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state balance could not be saved. Please, try again.')); + } + $stateUsers = $this->StateBalances->StateUsers->find('list', ['limit' => 200]); + $this->set(compact('stateBalance', 'stateUsers')); + } + + /** + * Edit method + * + * @param string|null $id State Balance id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $stateBalance = $this->StateBalances->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $stateBalance = $this->StateBalances->patchEntity($stateBalance, $this->request->getData()); + if ($this->StateBalances->save($stateBalance)) { + $this->Flash->success(__('The state balance has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state balance could not be saved. Please, try again.')); + } + $stateUsers = $this->StateBalances->StateUsers->find('list', ['limit' => 200]); + $this->set(compact('stateBalance', 'stateUsers')); + } + + /** + * Delete method + * + * @param string|null $id State Balance id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $stateBalance = $this->StateBalances->get($id); + if ($this->StateBalances->delete($stateBalance)) { + $this->Flash->success(__('The state balance has been deleted.')); + } else { + $this->Flash->error(__('The state balance could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/StateCreatedController.php b/community_server/src/Controller/StateCreatedController.php new file mode 100644 index 000000000..b66f1b7c1 --- /dev/null +++ b/community_server/src/Controller/StateCreatedController.php @@ -0,0 +1,113 @@ +paginate = [ + 'contain' => ['Transactions', 'StateUsers'] + ]; + $stateCreated = $this->paginate($this->StateCreated); + + $this->set(compact('stateCreated')); + } + + /** + * View method + * + * @param string|null $id State Created id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $stateCreated = $this->StateCreated->get($id, [ + 'contain' => ['Transactions', 'StateUsers'] + ]); + + $this->set('stateCreated', $stateCreated); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $stateCreated = $this->StateCreated->newEntity(); + if ($this->request->is('post')) { + $stateCreated = $this->StateCreated->patchEntity($stateCreated, $this->request->getData()); + if ($this->StateCreated->save($stateCreated)) { + $this->Flash->success(__('The state created has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state created could not be saved. Please, try again.')); + } + $transactions = $this->StateCreated->Transactions->find('list', ['limit' => 200]); + $stateUsers = $this->StateCreated->StateUsers->find('list', ['limit' => 200]); + $this->set(compact('stateCreated', 'transactions', 'stateUsers')); + } + + /** + * Edit method + * + * @param string|null $id State Created id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $stateCreated = $this->StateCreated->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $stateCreated = $this->StateCreated->patchEntity($stateCreated, $this->request->getData()); + if ($this->StateCreated->save($stateCreated)) { + $this->Flash->success(__('The state created has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state created could not be saved. Please, try again.')); + } + $transactions = $this->StateCreated->Transactions->find('list', ['limit' => 200]); + $stateUsers = $this->StateCreated->StateUsers->find('list', ['limit' => 200]); + $this->set(compact('stateCreated', 'transactions', 'stateUsers')); + } + + /** + * Delete method + * + * @param string|null $id State Created id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $stateCreated = $this->StateCreated->get($id); + if ($this->StateCreated->delete($stateCreated)) { + $this->Flash->success(__('The state created has been deleted.')); + } else { + $this->Flash->error(__('The state created could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/StateErrorsController.php b/community_server/src/Controller/StateErrorsController.php new file mode 100644 index 000000000..0c91d93e3 --- /dev/null +++ b/community_server/src/Controller/StateErrorsController.php @@ -0,0 +1,173 @@ +Auth->allow(['showForUser', 'deleteForUser']); + $this->set( + 'naviHierarchy', + (new NaviHierarchy())-> + add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))-> + add(new NaviHierarchyEntry(__('Fehler'), 'StateErrors', 'ShowForUser', true)) + ); + } + + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $this->paginate = [ + 'contain' => ['StateUsers', 'TransactionTypes'] + ]; + $stateErrors = $this->paginate($this->StateErrors); + + $this->set(compact('stateErrors')); + } + + public function showForUser() + { + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $session = $this->getRequest()->getSession(); + $user = $session->read('StateUser'); + if(!$user) { + $result = $this->requestLogin(); + if($result !== true) { + return $result; + } + $user = $session->read('StateUser'); + } + + $errors = $this->StateErrors->find('all')->where(['state_user_id' => $user['id']])->contain(false); + $transactionTypes = $this->StateErrors->TransactionTypes->find('all')->select(['id', 'name', 'text'])->order(['id']); + + $this->set('errors', $errors); + $this->set('transactionTypes', $transactionTypes->toList()); + $this->set('timeUsed', microtime(true) - $startTime); + } + + public function deleteForUser($id = null) + { + $this->request->allowMethod(['post', 'delete', 'get']); + $stateError = $this->StateErrors->get($id); + $session = $this->getRequest()->getSession(); + $user = $session->read('StateUser'); + if($user['id'] != $stateError->state_user_id) { + $this->Flash->error(__('Error belongs to another User, cannot delete')); + } + else if ($this->StateErrors->delete($stateError)) { + $this->Flash->success(__('The state error has been deleted.')); + } else { + $this->Flash->error(__('The state error could not be deleted. Please, try again.')); + } + $errors = $this->StateErrors->find('all')->where(['state_user_id' => $user['id']])->contain(false); + if($errors->count() == 0) { + return $this->redirect(['controller' => 'Dashboard']); + } + return $this->redirect(['action' => 'showForUser']); + } + + + /** + * View method + * + * @param string|null $id State Error id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $stateError = $this->StateErrors->get($id, [ + 'contain' => ['StateUsers', 'TransactionTypes'] + ]); + + $this->set('stateError', $stateError); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $stateError = $this->StateErrors->newEntity(); + if ($this->request->is('post')) { + $stateError = $this->StateErrors->patchEntity($stateError, $this->request->getData()); + if ($this->StateErrors->save($stateError)) { + $this->Flash->success(__('The state error has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state error could not be saved. Please, try again.')); + } + $stateUsers = $this->StateErrors->StateUsers->find('list', ['limit' => 200]); + $transactionTypes = $this->StateErrors->TransactionTypes->find('list', ['limit' => 200]); + $this->set(compact('stateError', 'stateUsers', 'transactionTypes')); + } + + /** + * Edit method + * + * @param string|null $id State Error id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $stateError = $this->StateErrors->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $stateError = $this->StateErrors->patchEntity($stateError, $this->request->getData()); + if ($this->StateErrors->save($stateError)) { + $this->Flash->success(__('The state error has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state error could not be saved. Please, try again.')); + } + $stateUsers = $this->StateErrors->StateUsers->find('list', ['limit' => 200]); + $transactionTypes = $this->StateErrors->TransactionTypes->find('list', ['limit' => 200]); + $this->set(compact('stateError', 'stateUsers', 'transactionTypes')); + } + + /** + * Delete method + * + * @param string|null $id State Error id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $stateError = $this->StateErrors->get($id); + if ($this->StateErrors->delete($stateError)) { + $this->Flash->success(__('The state error has been deleted.')); + } else { + $this->Flash->error(__('The state error could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/StateGroupAddressesController.php b/community_server/src/Controller/StateGroupAddressesController.php new file mode 100644 index 000000000..13f2b1f78 --- /dev/null +++ b/community_server/src/Controller/StateGroupAddressesController.php @@ -0,0 +1,113 @@ +paginate = [ + 'contain' => ['StateGroups', 'AddressTypes'] + ]; + $stateGroupAddresses = $this->paginate($this->StateGroupAddresses); + + $this->set(compact('stateGroupAddresses')); + } + + /** + * View method + * + * @param string|null $id State Group Address id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $stateGroupAddress = $this->StateGroupAddresses->get($id, [ + 'contain' => ['StateGroups', 'AddressTypes'] + ]); + + $this->set('stateGroupAddress', $stateGroupAddress); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $stateGroupAddress = $this->StateGroupAddresses->newEntity(); + if ($this->request->is('post')) { + $stateGroupAddress = $this->StateGroupAddresses->patchEntity($stateGroupAddress, $this->request->getData()); + if ($this->StateGroupAddresses->save($stateGroupAddress)) { + $this->Flash->success(__('The state group address has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state group address could not be saved. Please, try again.')); + } + $stateGroups = $this->StateGroupAddresses->StateGroups->find('list', ['limit' => 200]); + $addressTypes = $this->StateGroupAddresses->AddressTypes->find('list', ['limit' => 200]); + $this->set(compact('stateGroupAddress', 'stateGroups', 'addressTypes')); + } + + /** + * Edit method + * + * @param string|null $id State Group Address id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $stateGroupAddress = $this->StateGroupAddresses->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $stateGroupAddress = $this->StateGroupAddresses->patchEntity($stateGroupAddress, $this->request->getData()); + if ($this->StateGroupAddresses->save($stateGroupAddress)) { + $this->Flash->success(__('The state group address has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state group address could not be saved. Please, try again.')); + } + $stateGroups = $this->StateGroupAddresses->StateGroups->find('list', ['limit' => 200]); + $addressTypes = $this->StateGroupAddresses->AddressTypes->find('list', ['limit' => 200]); + $this->set(compact('stateGroupAddress', 'stateGroups', 'addressTypes')); + } + + /** + * Delete method + * + * @param string|null $id State Group Address id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $stateGroupAddress = $this->StateGroupAddresses->get($id); + if ($this->StateGroupAddresses->delete($stateGroupAddress)) { + $this->Flash->success(__('The state group address has been deleted.')); + } else { + $this->Flash->error(__('The state group address could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/StateGroupRelationshipsController.php b/community_server/src/Controller/StateGroupRelationshipsController.php new file mode 100644 index 000000000..631ca13d1 --- /dev/null +++ b/community_server/src/Controller/StateGroupRelationshipsController.php @@ -0,0 +1,115 @@ +paginate = [ + 'contain' => ['StateGroup1s', 'StateGroup2s', 'StateRelationships'] + ]; + $stateGroupRelationships = $this->paginate($this->StateGroupRelationships); + + $this->set(compact('stateGroupRelationships')); + } + + /** + * View method + * + * @param string|null $id State Group Relationship id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $stateGroupRelationship = $this->StateGroupRelationships->get($id, [ + 'contain' => ['StateGroup1s', 'StateGroup2s', 'StateRelationships'] + ]); + + $this->set('stateGroupRelationship', $stateGroupRelationship); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $stateGroupRelationship = $this->StateGroupRelationships->newEntity(); + if ($this->request->is('post')) { + $stateGroupRelationship = $this->StateGroupRelationships->patchEntity($stateGroupRelationship, $this->request->getData()); + if ($this->StateGroupRelationships->save($stateGroupRelationship)) { + $this->Flash->success(__('The state group relationship has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state group relationship could not be saved. Please, try again.')); + } + $stateGroup1s = $this->StateGroupRelationships->StateGroup1s->find('list', ['limit' => 200]); + $stateGroup2s = $this->StateGroupRelationships->StateGroup2s->find('list', ['limit' => 200]); + $stateRelationships = $this->StateGroupRelationships->StateRelationships->find('list', ['limit' => 200]); + $this->set(compact('stateGroupRelationship', 'stateGroup1s', 'stateGroup2s', 'stateRelationships')); + } + + /** + * Edit method + * + * @param string|null $id State Group Relationship id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $stateGroupRelationship = $this->StateGroupRelationships->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $stateGroupRelationship = $this->StateGroupRelationships->patchEntity($stateGroupRelationship, $this->request->getData()); + if ($this->StateGroupRelationships->save($stateGroupRelationship)) { + $this->Flash->success(__('The state group relationship has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state group relationship could not be saved. Please, try again.')); + } + $stateGroup1s = $this->StateGroupRelationships->StateGroup1s->find('list', ['limit' => 200]); + $stateGroup2s = $this->StateGroupRelationships->StateGroup2s->find('list', ['limit' => 200]); + $stateRelationships = $this->StateGroupRelationships->StateRelationships->find('list', ['limit' => 200]); + $this->set(compact('stateGroupRelationship', 'stateGroup1s', 'stateGroup2s', 'stateRelationships')); + } + + /** + * Delete method + * + * @param string|null $id State Group Relationship id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $stateGroupRelationship = $this->StateGroupRelationships->get($id); + if ($this->StateGroupRelationships->delete($stateGroupRelationship)) { + $this->Flash->success(__('The state group relationship has been deleted.')); + } else { + $this->Flash->error(__('The state group relationship could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/StateGroupsController.php b/community_server/src/Controller/StateGroupsController.php new file mode 100644 index 000000000..36969671d --- /dev/null +++ b/community_server/src/Controller/StateGroupsController.php @@ -0,0 +1,111 @@ +paginate = [ + 'contain' => ['Indices'] + ]; + $stateGroups = $this->paginate($this->StateGroups); + + $this->set(compact('stateGroups')); + } + + /** + * View method + * + * @param string|null $id State Group id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $stateGroup = $this->StateGroups->get($id, [ + 'contain' => ['Indices', 'StateGroupAddresses', 'StateUsers', 'TransactionGroupCreates', 'Transactions'] + ]); + + $this->set('stateGroup', $stateGroup); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $stateGroup = $this->StateGroups->newEntity(); + if ($this->request->is('post')) { + $stateGroup = $this->StateGroups->patchEntity($stateGroup, $this->request->getData()); + if ($this->StateGroups->save($stateGroup)) { + $this->Flash->success(__('The state group has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state group could not be saved. Please, try again.')); + } + $indices = $this->StateGroups->Indices->find('list', ['limit' => 200]); + $this->set(compact('stateGroup', 'indices')); + } + + /** + * Edit method + * + * @param string|null $id State Group id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $stateGroup = $this->StateGroups->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $stateGroup = $this->StateGroups->patchEntity($stateGroup, $this->request->getData()); + if ($this->StateGroups->save($stateGroup)) { + $this->Flash->success(__('The state group has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state group could not be saved. Please, try again.')); + } + $indices = $this->StateGroups->Indices->find('list', ['limit' => 200]); + $this->set(compact('stateGroup', 'indices')); + } + + /** + * Delete method + * + * @param string|null $id State Group id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $stateGroup = $this->StateGroups->get($id); + if ($this->StateGroups->delete($stateGroup)) { + $this->Flash->success(__('The state group has been deleted.')); + } else { + $this->Flash->error(__('The state group could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/StateRelationshipTypesController.php b/community_server/src/Controller/StateRelationshipTypesController.php new file mode 100644 index 000000000..954b594e2 --- /dev/null +++ b/community_server/src/Controller/StateRelationshipTypesController.php @@ -0,0 +1,106 @@ +paginate($this->StateRelationshipTypes); + + $this->set(compact('stateRelationshipTypes')); + } + + /** + * View method + * + * @param string|null $id State Relationship Type id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $stateRelationshipType = $this->StateRelationshipTypes->get($id, [ + 'contain' => [] + ]); + + $this->set('stateRelationshipType', $stateRelationshipType); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $stateRelationshipType = $this->StateRelationshipTypes->newEntity(); + if ($this->request->is('post')) { + $stateRelationshipType = $this->StateRelationshipTypes->patchEntity($stateRelationshipType, $this->request->getData()); + if ($this->StateRelationshipTypes->save($stateRelationshipType)) { + $this->Flash->success(__('The state relationship type has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state relationship type could not be saved. Please, try again.')); + } + $this->set(compact('stateRelationshipType')); + } + + /** + * Edit method + * + * @param string|null $id State Relationship Type id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $stateRelationshipType = $this->StateRelationshipTypes->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $stateRelationshipType = $this->StateRelationshipTypes->patchEntity($stateRelationshipType, $this->request->getData()); + if ($this->StateRelationshipTypes->save($stateRelationshipType)) { + $this->Flash->success(__('The state relationship type has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state relationship type could not be saved. Please, try again.')); + } + $this->set(compact('stateRelationshipType')); + } + + /** + * Delete method + * + * @param string|null $id State Relationship Type id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $stateRelationshipType = $this->StateRelationshipTypes->get($id); + if ($this->StateRelationshipTypes->delete($stateRelationshipType)) { + $this->Flash->success(__('The state relationship type has been deleted.')); + } else { + $this->Flash->error(__('The state relationship type could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/StateUsersController.php b/community_server/src/Controller/StateUsersController.php new file mode 100644 index 000000000..d85f8b449 --- /dev/null +++ b/community_server/src/Controller/StateUsersController.php @@ -0,0 +1,568 @@ +loadComponent('GradidoNumber'); + $this->loadComponent('JsonRequestClient'); + $this->Auth->allow([ + 'search', 'ajaxCopyLoginToCommunity', 'ajaxCopyCommunityToLogin', + 'ajaxDelete', 'ajaxCountTransactions', 'ajaxVerificationEmailResend', + 'ajaxGetUserEmailVerificationCode', 'ajaxGetCSFRToken' + ]); + $this->set( + 'naviHierarchy', + (new NaviHierarchy())-> + add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->add(new NaviHierarchyEntry(__('Benutzer suchen'), 'StateUsers', 'search', true)) + ); + } + + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $this->paginate = [ + 'contain' => [] + ]; + $stateUsers = $this->paginate($this->StateUsers); + + $this->set(compact('stateUsers')); + } + + public function listIdentHashes() + { + $stateUsers = $this->StateUsers->find('all')->toArray(); + foreach ($stateUsers as $i => $user) { + $stateUsers[$i]->identHash = TransactionCreation::DRMakeStringHash($user->email); + } + $this->set('stateUsers', $stateUsers); + } + + public function search() + { + $startTime = microtime(true); + I18n::setLocale('de_DE'); + $this->viewBuilder()->setLayout('frontend'); + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if ($result !== true) { + return $result; + } + $user = $session->read('StateUser'); + if ($user['role'] != 'admin') { + return $this->redirect(['controller' => 'dashboard', 'action' => 'index']); + } + + $searchForm = new UserSearchForm(); + + $timeUsed = microtime(true) - $startTime; + //$this->set('timeUsed', $timeUsed); + $csfr_token = $this->request->getParam('_csrfToken'); + $this->set(compact('timeUsed', 'searchForm', 'csfr_token')); + + if ($this->request->is('post')) { + $requestData = $this->request->getData(); + + if ($searchForm->validate($requestData)) { + //var_dump($requestData); + $searchString = $requestData['search']; + $searchType = 'unknown'; + if (GenericValidation::email($searchString, [])) { + $searchType = 'email'; + } + // find users on login server + $resultJson = $this->JsonRequestClient->getUsers($session->read('session_id'), $searchString); + $loginServerUser = []; + if ($resultJson['state'] == 'success') { + $dataJson = $resultJson['data']; + if ($dataJson['state'] != 'success') { + if ($dataJson['msg'] == 'session not found') { + $session->destroy(); + return $this->redirect(Router::url('/', true) . 'account', 303); + } + } + //var_dump($dataJson); + if (isset($dataJson['users'])) { + $loginServerUser = $dataJson['users']; + } + } + $pubkeySorted = []; + $emptyPubkeys = []; + foreach ($loginServerUser as $u) { + if (!isset($u['public_hex']) || $u['public_hex'] == '') { + array_push($emptyPubkeys, $u); + } else { + if (!isset($pubkeySorted[$u['public_hex']])) { + $pubkeySorted[$u['public_hex']] = ['login' => [], 'community' => []]; + } + array_push($pubkeySorted[$u['public_hex']]['login'], $u); + } + } + // find user on community server db + $globalSearch = '%' . $searchString . '%'; + $communityUsers = $this->StateUsers + ->find('all') + ->contain(['StateBalances' => ['fields' => ['amount', 'state_user_id']]]); + + $communityUsers->where(['OR' => [ + 'first_name LIKE' => $globalSearch, + 'last_name LIKE' => $globalSearch, + //'username LIKE' => $globalSearch, + 'email LIKE' => $globalSearch + ]]); + + //var_dump($communityUsers->toArray()); + foreach ($communityUsers as $u) { + $pubkey_hex = bin2hex(stream_get_contents($u->public_key)); + $u->public_hex = $pubkey_hex; + if (!isset($pubkeySorted[$pubkey_hex])) { + $pubkeySorted[$pubkey_hex] = ['login' => [], 'community' => []]; + } + array_push($pubkeySorted[$pubkey_hex]['community'], $u); + } + $finalUserEntrys = []; + // detect states + foreach ($pubkeySorted as $pubhex => $user) { + $finalUser = []; + $state = 'account created'; + $color = 'secondary'; + $finalUser['balance'] = 0; + $finalUser['pubkeyhex'] = $pubhex; + $finalUser['created'] = null; + + if (count($user['community']) == 1) { + if (isset($user['community'][0]->state_balances) && + isset($user['community'][0]->state_balances[0]['amount'])) { + $finalUser['balance'] = $user['community'][0]->state_balances[0]->amount; + } + } + + if (count($user['login']) == 0) { + $state = 'account not on login-server'; + $color = 'danger'; + if (count($user['community']) == 1) { + $c_user = $user['community'][0]; + $finalUser['name'] = $c_user->first_name . ' ' . $c_user->last_name; + $finalUser['first_name'] = $c_user->first_name; + $finalUser['last_name'] = $c_user->last_name; + //$finalUser['username'] = $c_user->username; + $finalUser['email'] = $c_user->email; + } + } elseif (count($user['login']) == 1) { + if ($user['login'][0]['email_checked'] == true) { + $state = 'email activated'; + $color = 'primary'; + + if (count($user['community']) == 1) { + $state = 'account copied to community'; + $color = 'success'; + //var_dump($user['community'][0]->state_balances[0]['amount']); + } + } else { + $state = 'email not activated'; + $color = 'warning'; + } + + $l_user = $user['login'][0]; + $finalUser['name'] = $l_user['first_name'] . ' ' . $l_user['last_name']; + $finalUser['first_name'] = $l_user['first_name']; + $finalUser['last_name'] = $l_user['last_name']; + //$finalUser['username'] = $l_user['username']; + $finalUser['email'] = $l_user['email']; + $finalUser['created'] = new FrozenTime($l_user['created']); + } else { + $state = 'account multiple times on login-server'; + $color = 'danger'; + } + $finalUser['indicator'] = ['name' => $state, 'color' => $color]; + array_push($finalUserEntrys, $finalUser); + } + + foreach ($emptyPubkeys as $user) { + $finalUser = []; + $state = 'account not on community server'; + $color = 'secondary'; + if ($user['email_checked'] == false) { + $state = 'email not activated'; + $color = 'warning'; + } else { + $state = 'no keys'; + $color = 'warning'; + } + $finalUser['balance'] = 0; + $finalUser['pubkeyhex'] = ''; + $finalUser['name'] = $user['first_name'] . ' ' . $user['last_name']; + $finalUser['first_name'] = $user['first_name']; + $finalUser['last_name'] = $user['last_name']; + //$finalUser['username'] = $user['username']; + $finalUser['email'] = $user['email']; + $finalUser['created'] = new FrozenTime($user['created']); + $finalUser['indicator'] = ['name' => $state, 'color' => $color]; + array_push($finalUserEntrys, $finalUser); + } + //var_dump($pubkeySorted); + } else { + $this->Flash->error(__('Something was invalid, please try again!')); + } + + $this->set('finalUserEntrys', $finalUserEntrys); + } + $timeUsed = microtime(true) - $startTime; + $this->set('timeUsed', $timeUsed); + } + + public function ajaxCopyCommunityToLogin() + { + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if ($result !== true) { + return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); + } + $user = $session->read('StateUser'); + if ($user['role'] != 'admin') { + return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); + } + if ($this->request->is('post')) { + $jsonData = $this->request->input('json_decode', true); + } + return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); + } + + public function ajaxCopyLoginToCommunity() + { + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if ($result !== true) { + return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); + } + $user = $session->read('StateUser'); + if ($user['role'] != 'admin') { + return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); + } + + if ($this->request->is('post')) { + $jsonData = $this->request->input('json_decode', true); + //$user = $jsonData['user']; + //var_dump($jsonData); + + $newStateUser = $this->StateUsers->newEntity(); + $this->StateUsers->patchEntity($newStateUser, $jsonData); + $newStateUser->public_key = hex2bin($jsonData['pubkeyhex']); + + if (!$this->StateUsers->save($newStateUser)) { + return $this->returnJson(['state' => 'error', 'msg' => 'error by saving', 'details' => json_encode($newStateUser->errors())]); + } + + return $this->returnJson(['state' => 'success']); + } + return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); + } + + public function ajaxVerificationEmailResend() + { + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if ($result !== true) { + return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); + } + $user = $session->read('StateUser'); + if ($user['role'] != 'admin') { + return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); + } + if ($this->request->is('post')) { + $jsonData = $this->request->input('json_decode', true); + $email = $jsonData['email']; + $session_id = $session->read('session_id'); + + return $this->returnJson($this->JsonRequestClient->sendRequest(json_encode([ + 'session_id' => $session_id, + 'email' => $email + ]), '/adminEmailVerificationResend')); + /*return $this->sendRequest(json_encode([ + 'session_id' => $session_id, + 'search' => $searchString + ]), '/getUsers');*/ + } + return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); + } + + public function ajaxGetUserEmailVerificationCode() + { + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if ($result !== true) { + return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); + } + $user = $session->read('StateUser'); + if ($user['role'] != 'admin') { + return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); + } + if ($this->request->is('post')) { + $jsonData = $this->request->input('json_decode', true); + $email = $jsonData['email']; + $session_id = $session->read('session_id'); + + return $this->returnJson($this->JsonRequestClient->sendRequest(json_encode([ + 'session_id' => $session_id, + 'email' => $email, + 'ask' => ['EmailVerificationCode.Register', 'loginServer.path'] + ]), '/getUserInfos')); + } + return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); + } + + + public function ajaxDelete() + { + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if ($result !== true) { + return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); + } + $user = $session->read('StateUser'); + if ($user['role'] != 'admin') { + return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); + } + + if ($this->request->is('post')) { + $jsonData = $this->request->input('json_decode', true); + //$user = $jsonData['user']; + //var_dump($jsonData); + $pubkey = hex2bin($jsonData['pubkeyhex']); + $stateUsers = $this->StateUsers->find('all')->where(['public_key' => $pubkey]); + if ($stateUsers->count() != 1) { + return $this->returnJson(['state' => 'error', 'msg' => 'invalid result count']); + } + + if ($this->StateUsers->delete($stateUsers->first())) { + return $this->returnJson(['state' => 'success']); + } else { + return $this->returnJson(['state' => 'error', 'msg' => 'error by deleting', 'details' => json_encode($stateUser->errors())]); + } + } + return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); + } + + public function ajaxCountTransactions() + { + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + if ($result !== true) { + return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); + } + $user = $session->read('StateUser'); + if ($user['role'] != 'admin') { + return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); + } + + if ($this->request->is('post')) { + $jsonData = $this->request->input('json_decode', true); + //$user = $jsonData['user']; + //var_dump($jsonData); + $pubkey = hex2bin($jsonData['pubkeyhex']); + $stateUsers = $this->StateUsers + ->find('all') + ->where(['public_key' => $pubkey]) + ->select(['id']); + if ($stateUsers->count() != 1) { + return $this->returnJson(['state' => 'error', 'msg' => 'invalid result count']); + } + $stateUser = $stateUsers->first(); + //var_dump($stateUser); + //var_dump($stateUser->toArray()); + $creationsTable = TableRegistry::getTableLocator()->get('TransactionCreations'); + $creationTransactions = $creationsTable + ->find('all') + ->select(['id']) + ->where(['state_user_id' => $stateUser->id]); + + $transferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins'); + $transferTransactions = $transferTable + ->find('all') + ->where(['OR' => ['state_user_id' => $stateUser->id, 'receiver_user_id' => $stateUser->id]]) + ->select(['state_user_id', 'receiver_user_id']); + $counts = ['creation' => $creationTransactions->count(), 'receive' => 0, 'sended' => 0]; + foreach ($transferTransactions as $transfer) { + //var_dump($transfer); + if ($transfer->state_user_id == $stateUser->id) { + $counts['sended']++; + } + if ($transfer->receiver_user_id == $stateUser->id) { + $counts['receive']++; + } + } + return $this->returnJson(['state' => 'success', 'counts' => $counts]); + } + return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); + } + + public function ajaxGetCSFRToken($session_id) + { + if(!isset($session_id) || $session_id == 0) { + $this->returnJson(['state' => 'error', 'msg' => 'no session id']); + } + + $client_ip = $this->request->clientIp(); + + $loginServer = Configure::read('LoginServer'); + $url = $loginServer['host'] . ':' . $loginServer['port']; + + $http = new Client(); + $response = $http->get($url . '/login', ['session_id' => $session_id]); + $json = $response->getJson(); + + if (isset($json) && count($json) > 0) { + if ($json['state'] === 'success') { + if($json['clientIP'] == $client_ip) { + return $this->returnJson(['state' => 'success', 'csfr' => $this->request->getParam('_csrfToken')]); + } else { + return $this->returnJson([ + 'state' => 'error', + 'msg' => 'client ip mismatch', + 'details' => ['login_server' => $json['clientIP'], 'caller' => $client_ip]]); + } + } else { + return $this->returnJson($json); + } + } else { + return $this->returnJson(['state' => 'error', 'invalid response form logins server']); + } + + } + /* + + getField(vnode, 'receive'), + + getField(vnode, 'sended'), + + getField(vnode, 'creation'), + */ + + /** + * View method + * + * @param string|null $id State User id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $stateUser = $this->StateUsers->get($id, [ + 'contain' => [ + 'StateBalances', + 'TransactionCreations' => ['Transactions'], + 'TransactionSendCoins' => ['Transactions', 'ReceiverUsers'], + 'TransactionReceivedCoins' => ['Transactions', 'StateUsers']] + ]); + + $this->set('stateUser', $stateUser); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $stateUser = $this->StateUsers->newEntity(); + if ($this->request->is('post')) { + $stateUser = $this->StateUsers->patchEntity($stateUser, $this->request->getData()); + if ($this->StateUsers->save($stateUser)) { + $this->Flash->success(__('The state user has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state user could not be saved. Please, try again.')); + } + $indices = $this->StateUsers->Indices->find('list', ['limit' => 200]); + $stateGroups = $this->StateUsers->StateGroups->find('list', ['limit' => 200]); + $this->set(compact('stateUser', 'indices', 'stateGroups')); + } + + /** + * Edit method + * + * @param string|null $id State User id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $stateUser = $this->StateUsers->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $stateUser = $this->StateUsers->patchEntity($stateUser, $this->request->getData()); + if ($this->StateUsers->save($stateUser)) { + $this->Flash->success(__('The state user has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The state user could not be saved. Please, try again.')); + } + + $stateGroups = $this->StateUsers->StateGroups->find('list', ['limit' => 200]); + $this->set(compact('stateUser', 'stateGroups')); + } + + /** + * Delete method + * + * @param string|null $id State User id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $stateUser = $this->StateUsers->get($id); + if ($this->StateUsers->delete($stateUser)) { + $this->Flash->success(__('The state user has been deleted.')); + } else { + $this->Flash->error(__('The state user could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/TransactionCreationsController.php b/community_server/src/Controller/TransactionCreationsController.php new file mode 100644 index 000000000..9b05c1782 --- /dev/null +++ b/community_server/src/Controller/TransactionCreationsController.php @@ -0,0 +1,518 @@ +loadComponent('GradidoNumber'); + $this->loadComponent('JsonRequestClient'); + //$this->Auth->allow(['add', 'edit']); + //$this->Auth->allow('create'); + $this->set( + 'naviHierarchy', + (new NaviHierarchy())-> + add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->add(new NaviHierarchyEntry(__('Gradido schöpfen'), 'TransactionCreations', 'create-multi', true)) + ); + } + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $this->paginate = [ + 'contain' => ['Transactions', 'StateUsers'] + ]; + $transactionCreations = $this->paginate($this->TransactionCreations); + $identHashes = []; + foreach ($transactionCreations as $creation) { + $identHash = TransactionCreation::DRMakeStringHash($creation->state_user->email); + $identHashes[$creation->state_user->id] = $identHash; + } + + $this->set(compact('transactionCreations', 'identHashes')); + } + + /** + * View method + * + * @param string|null $id Transaction Creation id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $transactionCreation = $this->TransactionCreations->get($id, [ + 'contain' => ['Transactions', 'StateUsers'] + ]); + + $this->set('transactionCreation', $transactionCreation); + } + + public function create() + { + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $session = $this->getRequest()->getSession(); + $user = $session->read('StateUser'); + if (!$user) { + $result = $this->requestLogin(); + if ($result !== true) { + return $result; + } + $user = $session->read('StateUser'); + } + $creationForm = new CreationForm(); + $transactionCreation = $this->TransactionCreations->newEntity(); + $transactionCreation->state_user_id = $user['id']; + + // adding possible addresses + input field for copy + $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); + $stateUsers = $stateUserTable->find('all')->contain(false); + $receiverProposal = []; + foreach ($stateUsers as $stateUser) { + $name = $stateUser->email; + $keyHex = bin2hex(stream_get_contents($stateUser->public_key)); + if ($name === null) { + $name = $stateUser->first_name . ' ' . $stateUser->last_name; + } + array_push($receiverProposal, ['name' => $name, 'key' => $keyHex, 'email' => $stateUser->email]); + //$stateUser->public_key + } + $timeUsed = microtime(true) - $startTime; + $this->set(compact('transactionCreation', 'timeUsed', 'receiverProposal', 'creationForm')); + + if ($this->request->is('post')) { + $requestData = $this->request->getData(); + $mode = 'next'; + if (isset($requestData['add'])) { + $mode = 'add'; + } + if ($creationForm->validate($requestData)) { + $pubKeyHex = ''; + $identHash = ''; + $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']); + $receiverIndex = intval($requestData['receiver'])-1; + + if (count($receiverProposal) > $receiverIndex) { + $pubKeyHex = $receiverProposal[$receiverIndex]['key']; + $identHash = TransactionCreation::DRMakeStringHash($receiverProposal[$receiverIndex]['email']); + } + $builderResult = TransactionCreation::build( + $amountCent, + $requestData['memo'], + $pubKeyHex, + $identHash + ); + if ($builderResult['state'] == 'success') { + $user_balance = 0; + if (isset($user['balance'])) { + $user_balance = $user['balance']; + } + // $session_id, $base64Message, $user_balance = 0 + $requestResult = $this->JsonRequestClient->sendTransaction( + $session->read('session_id'), + base64_encode($builderResult['transactionBody']->serializeToString()), + $user_balance + ); + if ($requestResult['state'] != 'success') { + $this->addAdminError('TransactionCreations', 'create', $requestResult, $user['id']); + if ($requestResult['type'] == 'request error') { + $this->Flash->error(__('Error by requesting LoginServer, please try again')); + } else { + $this->Flash->error(__('Error, please wait for the admin to fix it')); + } + } else { + $json = $requestResult['data']; + if ($json['state'] != 'success') { + if ($json['msg'] == 'session not found') { + $session->destroy(); + return $this->redirect($this->loginServerUrl . 'account', 303); + } else { + $this->addAdminError('TransactionCreations', 'create', $json, $user['id']); + $this->Flash->error(__('Login Server Error, please wait for the admin to fix it')); + } + } else { + $pendingTransactionCount = $session->read('Transactions.pending'); + if ($pendingTransactionCount == null) { + $pendingTransactionCount = 1; + } else { + $pendingTransactionCount++; + } + $session->write('Transactions.pending', $pendingTransactionCount); + if ($mode === 'next') { + return $this->redirect($this->loginServerUrl . 'account/checkTransactions', 303); + } else { + $this->Flash->success(__('Transaction submitted for review.')); + } + } + } + } else { + $this->Flash->error(__('Building transaction failed')); + } + // */ + } else { + $this->Flash->error(__('Something was invalid, please try again!')); + } + } + } + + public function createMulti($page = 0) + { + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $session = $this->getRequest()->getSession(); + $result = $this->requestLogin(); + $limit = 200; + if ($result !== true) { + return $result; + } + $user = $session->read('StateUser'); + + $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); + + $connection = ConnectionManager::get('default'); + $transactionActiveMonth = $connection->execute( + 'SELECT id, received FROM transactions ' + . 'where received >= date_sub(date_add(curdate(), interval 1 - day(curdate()) day), interval 2 month) ' + . 'AND ' + . 'received < date_add(date_add(curdate(), interval 1 - day(curdate()) day), interval 2 month) ' + . 'AND ' + . 'transaction_type_id = 1' + )->fetchAll('assoc'); + $transactionActiveMonthSortedById = []; + foreach ($transactionActiveMonth as $t) { + $transactionActiveMonthSortedById[$t['id']] = $t['received']; + } + $firstDayLastMonth = new FrozenDate(); + $firstDayLastMonth = $firstDayLastMonth->day(1)->subMonth(1); + $transactionsLastMonthTargeDate = $this->TransactionCreations + ->find('all') + //->select(['state_user_id', 'target_date', 'amount']) + ->where(['EXTRACT(YEAR_MONTH FROM target_date) LIKE' => $firstDayLastMonth->format('Ym')]) + ->group(['state_user_id']) + ->contain([]); + $transactionsLastMonthTargeDate->select([ + 'state_user_id', + 'sum_amount' => $transactionsLastMonthTargeDate->func()->sum('amount') + ]); + + $transactionsLastMonthTargetDateSortedByStateUserId = []; + foreach ($transactionsLastMonthTargeDate as $transactionCreation) { + $transactionsLastMonthTargetDateSortedByStateUserId[$transactionCreation->state_user_id] = $transactionCreation->sum_amount; + } + + $requestData = $this->request->getData(); + if ($this->request->is('post') && + isset($requestData['searchButton']) && + isset($requestData['searchText']) && + !empty($requestData['searchText']) + ) { + $mode = 'search'; + $page = 0; + $this->log("search for text: ".$requestData['searchText'], 'debug'); + $stateUsers = $stateUserTable + ->find('all') + ->select(['id', 'first_name', 'last_name', 'email']) + ->order(['first_name', 'last_name']) + ->where( + ['AND' => [ + 'disabled' => 0, + 'OR' => [ + 'LOWER(first_name) LIKE' => '%'.strtolower($requestData['searchText']).'%', + 'LOWER(last_name) LIKE' => '%'.strtolower($requestData['searchText']).'%', + 'LOWER(email) LIKE' => '%'.strtolower($requestData['searchText']).'%' + ] + ] + ] + ) + ->contain(['TransactionCreations' => [ + 'fields' => [ + 'TransactionCreations.amount', + 'TransactionCreations.transaction_id', + 'TransactionCreations.state_user_id' + ] + ]]); + $this->log("search query: ".$stateUsers, 'debug'); + } else { + $stateUsers = $stateUserTable + ->find('all') + ->select(['id', 'first_name', 'last_name', 'email']) + //->order(['id']) + ->where(['disabled' => 0]) + ->order(['first_name', 'last_name']) + ->contain(['TransactionCreations' => [ + 'fields' => [ + 'TransactionCreations.amount', + 'TransactionCreations.transaction_id', + 'TransactionCreations.state_user_id' + ] + ]]); + } + + //var_dump($stateUsers->toArray()); + $possibleReceivers = []; + $countUsers = 0; + foreach ($stateUsers as $i => $stateUser) { + $countUsers++; + if ($i < $page * $limit || $i >= ($page + 1) * $limit) { + continue; + } + $sumAmount = 0; + $sumAmount2 = 0; + if (isset($transactionsLastMonthTargetDateSortedByStateUserId[$stateUser->id])) { + $sumAmount2 = $transactionsLastMonthTargetDateSortedByStateUserId[$stateUser->id]; + } + foreach ($stateUser->transaction_creations as $transactionCreation) { + //var_dump($transactionCreation); + if (isset($transactionActiveMonthSortedById[$transactionCreation->transaction_id])) { + $sumAmount += $transactionCreation->amount; + } + } + + //if($sumAmount < 20000000) { + array_push($possibleReceivers, [ + 'name' => $stateUser->first_name . ' ' . $stateUser->last_name, + 'id' => $stateUser->id, + 'email' => $stateUser->email, + 'amount' => $sumAmount, + 'amount2' => $sumAmount2 + ]); + /*} else { + $this->Flash->error(__('Creation above 2.000 GDD for 2 last two month')); + }*/ + } + // usort($possibleReceivers, function ($a, $b) { + // return (strtolower($a['name']) <=> strtolower($b['name'])); + // }); + // -> replaced by SQL "order by" above + $creationForm = new CreationForm(); + + $timeUsed = microtime(true) - $startTime; + $this->set(compact('timeUsed', 'stateUsers', 'creationForm', 'possibleReceivers')); + + $this->set('firstDayLastMonth', $firstDayLastMonth); + $this->set('activeUser', $user); + $this->set('creationForm', $creationForm); + $this->set('transactionExecutingCount', $session->read('Transaction.executing')); + $this->set('timeUsed', microtime(true) - $startTime); + $this->set('countUsers', $countUsers); + $this->set('limit', $limit); + $this->set('page', $page); + + if ($this->request->is('post') && (!isset($mode) || !($mode === 'search'))) { + $this->log("real POST", 'debug'); + $mode = 'next'; + if (isset($requestData['add'])) { + $mode = 'add'; + } + $memo = $requestData['memo']; + $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']); + //$targetDate = $requestData['target_date']; + if (!isset($requestData['user']) || count($requestData['user']) == 0) { + $this->Flash->error(__('No user selected')); + } else { + $users = $requestData['user']; + if (isset($requestData['user_pending'])) { + $pendings = $requestData['user_pending']; + } else { + $pendings = []; + } + $receiverUsers = $stateUserTable + ->find('all') + ->where(['id IN' => array_keys($users)]) + ->select(['public_key', 'email', 'id']) + ->contain(false); + $transactions = []; + foreach ($receiverUsers as $receiverUser) { + $localAmountCent = $amountCent; + //$localTargetDate = $targetDate; + $id = $receiverUser->id; + if ($requestData['user_amount'][$id] != '') { + $localAmountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['user_amount'][$id]); + } + if (isset($requestData['user_target_date']) && isset($requestData['user_target_date'][$id])) { + $localTargetDate = $requestData['user_target_date'][$id]; + } + if (isset($pendings[$id])) { + $pendings[$id] += $localAmountCent; + } else { + $pendings[$id] = $localAmountCent; + } + $pubKeyHex = bin2hex(stream_get_contents($receiverUser->public_key)); + $identHash = TransactionCreation::DRMakeStringHash($receiverUser->email); + $localTargetDateFrozen = FrozenDate::now(); + $localTargetDateFrozen = $localTargetDateFrozen + ->year($localTargetDate['year']) + ->month($localTargetDate['month']) + ->day($localTargetDate['day']); + //echo "input: "; var_dump($localTargetDate);echo "
    "; + //echo "output: "; var_dump($localTargetDateFrozen); + //die('a'); + $builderResult = TransactionCreation::build( + $localAmountCent, + $memo, + $pubKeyHex, + $identHash, + $localTargetDateFrozen + ); + if ($builderResult['state'] == 'success') { + array_push($transactions, base64_encode($builderResult['transactionBody']->serializeToString())); + } + } + /*echo "pendings: "; + var_dump($pendings); + echo "
    ";*/ + foreach ($possibleReceivers as $i => $possibleReceiver) { + $id = $possibleReceiver['id']; + if (isset($pendings[$id])) { + $possibleReceivers[$i]['pending'] = $pendings[$id]; + } + } + $this->set('possibleReceivers', $possibleReceivers); + $creationTransactionCount = count($transactions); + if ($creationTransactionCount > 0) { + $user_balance = 0; + if (isset($user['balance'])) { + $user_balance = $user['balance']; + } + // $session_id, $base64Message, $user_balance = 0 + $requestResult = $this->JsonRequestClient->sendTransaction( + $session->read('session_id'), + $transactions, + $user_balance + ); + if ($requestResult['state'] != 'success') { + $this->addAdminError('TransactionCreations', 'createMulti', $requestResult, $user['id']); + if ($requestResult['type'] == 'request error') { + $this->Flash->error(__('Error by requesting LoginServer, please try again')); + } else { + $this->Flash->error(__('Error, please wait for the admin to fix it')); + } + } else { + $json = $requestResult['data']; + if ($json['state'] != 'success') { + if ($json['msg'] == 'session not found') { + $session->destroy(); + return $this->redirect($this->loginServerUrl . 'account', 303); + } else { + $this->addAdminError('TransactionCreations', 'createMulti', $json, $user['id']); + $this->Flash->error(__('Login Server Error, please wait for the admin to fix it')); + } + } else { + $pendingTransactionCount = $session->read('Transactions.pending'); + if ($pendingTransactionCount == null) { + $pendingTransactionCount = $creationTransactionCount; + } else { + $pendingTransactionCount += $creationTransactionCount; + } + $session->write('Transactions.pending', $pendingTransactionCount); + if ($mode === 'next') { + return $this->redirect($this->loginServerUrl . 'account/checkTransactions', 303); + } else { + $this->Flash->success(__('Transaction submitted for review.')); + } + } + } + } + } + } + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + + $transactionCreation = $this->TransactionCreations->newEntity(); + if ($this->request->is('post')) { + $transactionCreation = $this->TransactionCreations->patchEntity($transactionCreation, $this->request->getData()); + if ($this->TransactionCreations->save($transactionCreation)) { + $this->Flash->success(__('The transaction creation has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction creation could not be saved. Please, try again.')); + } + $transactions = $this->TransactionCreations->Transactions->find('list', ['limit' => 200]); + $stateUsers = $this->TransactionCreations->StateUsers->find('list', ['limit' => 200]); + $this->set(compact('transactionCreation', 'transactions', 'stateUsers')); + } + + /** + * Edit method + * + * @param string|null $id Transaction Creation id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $transactionCreation = $this->TransactionCreations->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $transactionCreation = $this->TransactionCreations->patchEntity($transactionCreation, $this->request->getData()); + if ($this->TransactionCreations->save($transactionCreation)) { + $this->Flash->success(__('The transaction creation has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction creation could not be saved. Please, try again.')); + } + $transactions = $this->TransactionCreations->Transactions->find('list', ['limit' => 200]); + $stateUsers = $this->TransactionCreations->StateUsers->find('list', ['limit' => 200]); + $this->set(compact('transactionCreation', 'transactions', 'stateUsers')); + } + + /** + * Delete method + * + * @param string|null $id Transaction Creation id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $transactionCreation = $this->TransactionCreations->get($id); + if ($this->TransactionCreations->delete($transactionCreation)) { + $this->Flash->success(__('The transaction creation has been deleted.')); + } else { + $this->Flash->error(__('The transaction creation could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/TransactionGroupAddaddressController.php b/community_server/src/Controller/TransactionGroupAddaddressController.php new file mode 100644 index 000000000..fc23c111b --- /dev/null +++ b/community_server/src/Controller/TransactionGroupAddaddressController.php @@ -0,0 +1,113 @@ +paginate = [ + 'contain' => ['Transactions', 'AddressTypes'] + ]; + $transactionGroupAddaddress = $this->paginate($this->TransactionGroupAddaddress); + + $this->set(compact('transactionGroupAddaddress')); + } + + /** + * View method + * + * @param string|null $id Transaction Group Addaddres id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $transactionGroupAddaddres = $this->TransactionGroupAddaddress->get($id, [ + 'contain' => ['Transactions', 'AddressTypes'] + ]); + + $this->set('transactionGroupAddaddres', $transactionGroupAddaddres); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $transactionGroupAddaddres = $this->TransactionGroupAddaddress->newEntity(); + if ($this->request->is('post')) { + $transactionGroupAddaddres = $this->TransactionGroupAddaddress->patchEntity($transactionGroupAddaddres, $this->request->getData()); + if ($this->TransactionGroupAddaddress->save($transactionGroupAddaddres)) { + $this->Flash->success(__('The transaction group addaddres has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction group addaddres could not be saved. Please, try again.')); + } + $transactions = $this->TransactionGroupAddaddress->Transactions->find('list', ['limit' => 200]); + $addressTypes = $this->TransactionGroupAddaddress->AddressTypes->find('list', ['limit' => 200]); + $this->set(compact('transactionGroupAddaddres', 'transactions', 'addressTypes')); + } + + /** + * Edit method + * + * @param string|null $id Transaction Group Addaddres id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $transactionGroupAddaddres = $this->TransactionGroupAddaddress->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $transactionGroupAddaddres = $this->TransactionGroupAddaddress->patchEntity($transactionGroupAddaddres, $this->request->getData()); + if ($this->TransactionGroupAddaddress->save($transactionGroupAddaddres)) { + $this->Flash->success(__('The transaction group addaddres has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction group addaddres could not be saved. Please, try again.')); + } + $transactions = $this->TransactionGroupAddaddress->Transactions->find('list', ['limit' => 200]); + $addressTypes = $this->TransactionGroupAddaddress->AddressTypes->find('list', ['limit' => 200]); + $this->set(compact('transactionGroupAddaddres', 'transactions', 'addressTypes')); + } + + /** + * Delete method + * + * @param string|null $id Transaction Group Addaddres id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $transactionGroupAddaddres = $this->TransactionGroupAddaddress->get($id); + if ($this->TransactionGroupAddaddress->delete($transactionGroupAddaddres)) { + $this->Flash->success(__('The transaction group addaddres has been deleted.')); + } else { + $this->Flash->error(__('The transaction group addaddres could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/TransactionGroupAllowtradesController.php b/community_server/src/Controller/TransactionGroupAllowtradesController.php new file mode 100644 index 000000000..0b83332c6 --- /dev/null +++ b/community_server/src/Controller/TransactionGroupAllowtradesController.php @@ -0,0 +1,113 @@ +paginate = [ + 'contain' => ['Transactions', 'Groups'] + ]; + $transactionGroupAllowtrades = $this->paginate($this->TransactionGroupAllowtrades); + + $this->set(compact('transactionGroupAllowtrades')); + } + + /** + * View method + * + * @param string|null $id Transaction Group Allowtrade id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->get($id, [ + 'contain' => ['Transactions', 'Groups'] + ]); + + $this->set('transactionGroupAllowtrade', $transactionGroupAllowtrade); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->newEntity(); + if ($this->request->is('post')) { + $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->patchEntity($transactionGroupAllowtrade, $this->request->getData()); + if ($this->TransactionGroupAllowtrades->save($transactionGroupAllowtrade)) { + $this->Flash->success(__('The transaction group allowtrade has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction group allowtrade could not be saved. Please, try again.')); + } + $transactions = $this->TransactionGroupAllowtrades->Transactions->find('list', ['limit' => 200]); + $groups = $this->TransactionGroupAllowtrades->Groups->find('list', ['limit' => 200]); + $this->set(compact('transactionGroupAllowtrade', 'transactions', 'groups')); + } + + /** + * Edit method + * + * @param string|null $id Transaction Group Allowtrade id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->patchEntity($transactionGroupAllowtrade, $this->request->getData()); + if ($this->TransactionGroupAllowtrades->save($transactionGroupAllowtrade)) { + $this->Flash->success(__('The transaction group allowtrade has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction group allowtrade could not be saved. Please, try again.')); + } + $transactions = $this->TransactionGroupAllowtrades->Transactions->find('list', ['limit' => 200]); + $groups = $this->TransactionGroupAllowtrades->Groups->find('list', ['limit' => 200]); + $this->set(compact('transactionGroupAllowtrade', 'transactions', 'groups')); + } + + /** + * Delete method + * + * @param string|null $id Transaction Group Allowtrade id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->get($id); + if ($this->TransactionGroupAllowtrades->delete($transactionGroupAllowtrade)) { + $this->Flash->success(__('The transaction group allowtrade has been deleted.')); + } else { + $this->Flash->error(__('The transaction group allowtrade could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/TransactionGroupCreatesController.php b/community_server/src/Controller/TransactionGroupCreatesController.php new file mode 100644 index 000000000..57e5c7d8f --- /dev/null +++ b/community_server/src/Controller/TransactionGroupCreatesController.php @@ -0,0 +1,113 @@ +paginate = [ + 'contain' => ['Transactions', 'StateGroups'] + ]; + $transactionGroupCreates = $this->paginate($this->TransactionGroupCreates); + + $this->set(compact('transactionGroupCreates')); + } + + /** + * View method + * + * @param string|null $id Transaction Group Create id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $transactionGroupCreate = $this->TransactionGroupCreates->get($id, [ + 'contain' => ['Transactions', 'StateGroups'] + ]); + + $this->set('transactionGroupCreate', $transactionGroupCreate); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $transactionGroupCreate = $this->TransactionGroupCreates->newEntity(); + if ($this->request->is('post')) { + $transactionGroupCreate = $this->TransactionGroupCreates->patchEntity($transactionGroupCreate, $this->request->getData()); + if ($this->TransactionGroupCreates->save($transactionGroupCreate)) { + $this->Flash->success(__('The transaction group create has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction group create could not be saved. Please, try again.')); + } + $transactions = $this->TransactionGroupCreates->Transactions->find('list', ['limit' => 200]); + $stateGroups = $this->TransactionGroupCreates->StateGroups->find('list', ['limit' => 200]); + $this->set(compact('transactionGroupCreate', 'transactions', 'stateGroups')); + } + + /** + * Edit method + * + * @param string|null $id Transaction Group Create id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $transactionGroupCreate = $this->TransactionGroupCreates->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $transactionGroupCreate = $this->TransactionGroupCreates->patchEntity($transactionGroupCreate, $this->request->getData()); + if ($this->TransactionGroupCreates->save($transactionGroupCreate)) { + $this->Flash->success(__('The transaction group create has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction group create could not be saved. Please, try again.')); + } + $transactions = $this->TransactionGroupCreates->Transactions->find('list', ['limit' => 200]); + $stateGroups = $this->TransactionGroupCreates->StateGroups->find('list', ['limit' => 200]); + $this->set(compact('transactionGroupCreate', 'transactions', 'stateGroups')); + } + + /** + * Delete method + * + * @param string|null $id Transaction Group Create id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $transactionGroupCreate = $this->TransactionGroupCreates->get($id); + if ($this->TransactionGroupCreates->delete($transactionGroupCreate)) { + $this->Flash->success(__('The transaction group create has been deleted.')); + } else { + $this->Flash->error(__('The transaction group create could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/TransactionSendCoinsController.php b/community_server/src/Controller/TransactionSendCoinsController.php new file mode 100644 index 000000000..40cccb90e --- /dev/null +++ b/community_server/src/Controller/TransactionSendCoinsController.php @@ -0,0 +1,358 @@ +loadComponent('GradidoNumber'); + $this->loadComponent('JsonRequestClient'); + //$this->Auth->allow(['add', 'edit']); + $this->Auth->allow('create'); + $this->Auth->allow('createRaw'); + $this->set( + 'naviHierarchy', + (new NaviHierarchy())-> + add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))-> + add(new NaviHierarchyEntry(__('Überweisung'), 'TransactionSendCoins', 'create', true)) + ); + } + + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $this->paginate = [ + 'contain' => ['Transactions', 'StateUsers', 'ReceiverUsers'] + ]; + $transactionSendCoins = $this->paginate($this->TransactionSendCoins); + + $this->set(compact('transactionSendCoins')); + } + + /** + * View method + * + * @param string|null $id Transaction Send Coin id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $transactionSendCoin = $this->TransactionSendCoins->get($id, [ + 'contain' => ['Transactions', 'StateUsers', 'ReceiverUsers'] + ]); + + $this->set('transactionSendCoin', $transactionSendCoin); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $transactionSendCoin = $this->TransactionSendCoins->newEntity(); + if ($this->request->is('post')) { + $transactionSendCoin = $this->TransactionSendCoins->patchEntity($transactionSendCoin, $this->request->getData()); + if ($this->TransactionSendCoins->save($transactionSendCoin)) { + $this->Flash->success(__('The transaction send coin has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction send coin could not be saved. Please, try again.')); + } + $transactions = $this->TransactionSendCoins->Transactions->find('list', ['limit' => 200]); + $stateUsers = $this->TransactionSendCoins->StateUsers->find('list', ['limit' => 200]); + $receiverUsers = $this->TransactionSendCoins->ReceiverUsers->find('list', ['limit' => 200]); + $this->set(compact('transactionSendCoin', 'transactions', 'stateUsers', 'receiverUsers')); + } + + /** + * Edit method + * + * @param string|null $id Transaction Send Coin id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $transactionSendCoin = $this->TransactionSendCoins->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $transactionSendCoin = $this->TransactionSendCoins->patchEntity($transactionSendCoin, $this->request->getData()); + if ($this->TransactionSendCoins->save($transactionSendCoin)) { + $this->Flash->success(__('The transaction send coin has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction send coin could not be saved. Please, try again.')); + } + $transactions = $this->TransactionSendCoins->Transactions->find('list', ['limit' => 200]); + $stateUsers = $this->TransactionSendCoins->StateUsers->find('list', ['limit' => 200]); + $receiverUsers = $this->TransactionSendCoins->ReceiverUsers->find('list', ['limit' => 200]); + $this->set(compact('transactionSendCoin', 'transactions', 'stateUsers', 'receiverUsers')); + } + + public function create() + { + /*$locale = I18n::getLocale(); + $defaultLocale = I18n::getDefaultLocale(); + echo "locale: $locale, default locale: $defaultLocale
    "; + * */ + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $session = $this->getRequest()->getSession(); + $user = $session->read('StateUser'); +// var_dump($user); + if(!$user) { + //return $this->redirect(Router::url('/', true) . 'account/', 303); + $result = $this->requestLogin(); + if($result !== true) { + return $result; + } + $user = $session->read('StateUser'); + } + + $transferForm = new TransferForm(); + $this->set('transferForm', $transferForm); + $this->set('timeUsed', microtime(true) - $startTime); + + if ($this->request->is('post')) { + //$this->Flash->error(__('Wird zurzeit noch entwickelt!')); + + $requestData = $this->request->getData(); + $mode = 'next'; + if(isset($requestData['add'])) {$mode = 'add'; } + if($transferForm->validate($requestData)) { + + $receiverPubKeyHex = ''; + $senderPubKeyHex = $user['public_hex']; + $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']); + + if(!isset($user['balance']) || $amountCent > $user['balance']) { + $this->Flash->error(__('Du hast nicht genug Geld!')); + return; + } + + $receiverEmail = $requestData['email']; + if($receiverEmail === $user['email']) { + $this->Flash->error(__('Du kannst dir leider nicht selbst Geld schicken!')); + return; + } + $receiverPubkeyHex =''; + $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode([ + 'session_id' => $session->read('session_id'), + 'email' => $receiverEmail, + 'ask' => ['user.pubkeyhex', 'user.disabled'] + ]), '/getUserInfos'); + if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) { + // will be allways 64 byte long, even if it is empty + $receiverPubKeyHex = $requestAnswear['data']['userData']['pubkeyhex']; + } else { + $this->addAdminError('TransactionSendCoins', 'create', $requestAnswear, $user['id']); + $this->Flash->error(__('Der Empfänger wurde nicht auf dem Login-Server gefunden, hat er sein Konto schon angelegt?')); + $this->set('timeUsed', microtime(true) - $startTime); + return; + } + if($requestAnswear['data']['userData']['disabled']) { + $this->Flash->error(__('Der Empfänger ist deaktiviert, daher können ihm zurzeit keine Gradidos gesendet werden.')); + $this->set('timeUsed', microtime(true) - $startTime); + return; + } + + + if(0 == ord($receiverPubKeyHex)) { + $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); + $receiverUser = $stateUserTable + ->find('all') + ->select(['public_key']) + ->contain(false) + ->where(['email' => $receiverEmail]); + + + if(!$receiverUser) { + $this->Flash->error(__('Diese E-Mail ist mir nicht bekannt, hat dein Empfänger denn schon ein Gradido-Konto?')); + $this->set('timeUsed', microtime(true) - $startTime); + return; + } + + if(isset($receiverUser->public_key)) { + $receiverPubKeyHex = bin2hex(stream_get_contents($receiverUser->public_key)); + } else { + $this->Flash->error(__('Das Konto mit der E-Mail: ' . $receiverEmail . ' wurde noch nicht aktiviert und kann noch keine GDD empfangen!')); + $this->set('timeUsed', microtime(true) - $startTime); + return; + } + + } + //var_dump($sessionStateUser); + + $builderResult = TransactionTransfer::build( + $amountCent, + $requestData['memo'], + $receiverPubKeyHex, + $senderPubKeyHex + ); + if($builderResult['state'] === 'success') { + + $http = new Client(); + try { + $loginServer = Configure::read('LoginServer'); + $url = $loginServer['host'] . ':' . $loginServer['port']; + $session_id = $session->read('session_id'); + /* + * + * $response = $http->post( + * 'http://example.com/tasks', + * json_encode($data), + * ['type' => 'json'] + * ); + */ + $response = $http->post($url . '/checkTransaction', json_encode([ + 'session_id' => $session_id, + 'transaction_base64' => base64_encode($builderResult['transactionBody']->serializeToString()), + 'balance' => $user['balance'] + ]), ['type' => 'json']); + $json = $response->getJson(); + if($json['state'] != 'success') { + if($json['msg'] == 'session not found') { + $session->destroy(); + return $this->redirect($this->loginServerUrl . 'account', 303); + //$this->Flash->error(__('session not found, please login again')); + } else { + $this->Flash->error(__('login server return error: ' . json_encode($json))); + } + } else { + $pendingTransactionCount = $session->read('Transactions.pending'); + if($pendingTransactionCount == null) { + $pendingTransactionCount = 1; + } else { + $pendingTransactionCount++; + } + $session->write('Transactions.pending', $pendingTransactionCount); + //echo "pending: " . $pendingTransactionCount; + if($mode === 'next') { + return $this->redirect($this->loginServerUrl . 'account/checkTransactions', 303); + } else { + $this->Flash->success(__('Transaction submitted for review.')); + } + } + + } catch(\Exception $e) { + $msg = $e->getMessage(); + $this->Flash->error(__('error http request: ') . $msg); + } + + } else { + $this->Flash->error(__('No Valid Receiver Public given: ' . $receiverPubKeyHex)); + } + +// */ + } else { + $this->Flash->error(__('Something was invalid, please try again!')); + } + } + + $this->set('timeUsed', microtime(true) - $startTime); + } + + public function createRaw() + { + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + + $transferRawForm = new TransferRawForm(); + $this->set('transferRawForm', $transferRawForm); + + if ($this->request->is('post')) { + $requestData = $this->request->getData(); + if($transferRawForm->validate($requestData)) { + $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']); + $sender = ['priv' => $requestData['sender_privkey_hex'], 'pub' => $requestData['sender_pubkey_hex']]; + $reciver = ['pub' => $requestData['receiver_pubkey_hex']]; + + $builderResult = TransactionTransfer::build( + $amountCent, + $requestData['memo'], + $reciver['pub'], + $sender['pub'] + ); + if($builderResult['state'] === 'success') { + $protoTransaction = Transaction::build($builderResult['transactionBody'], $sender); + $transaction = new Transaction($protoTransaction); + if(!$transaction->validate()) { + $this->Flash->error(__('Error validating transaction')); + } else { + if(!$transaction->save()) { + $this->Flash->error(__('Error saving transaction')); + } else { + $this->Flash->success(__('Gradidos erfolgreich überwiesen!')); + } + } + } else { + $this->Flash->error(__('Error building transaction')); + } + + } + //var_dump($requestData); + // + //var_dump($data); + + } + + $this->set('timeUsed', microtime(true) - $startTime); + } + + /** + * Delete method + * + * @param string|null $id Transaction Send Coin id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $transactionSendCoin = $this->TransactionSendCoins->get($id); + if ($this->TransactionSendCoins->delete($transactionSendCoin)) { + $this->Flash->success(__('The transaction send coin has been deleted.')); + } else { + $this->Flash->error(__('The transaction send coin could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/TransactionSignaturesController.php b/community_server/src/Controller/TransactionSignaturesController.php new file mode 100644 index 000000000..91aea9558 --- /dev/null +++ b/community_server/src/Controller/TransactionSignaturesController.php @@ -0,0 +1,111 @@ +paginate = [ + 'contain' => ['Transactions'] + ]; + $transactionSignatures = $this->paginate($this->TransactionSignatures); + + $this->set(compact('transactionSignatures')); + } + + /** + * View method + * + * @param string|null $id Transaction Signature id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $transactionSignature = $this->TransactionSignatures->get($id, [ + 'contain' => ['Transactions'] + ]); + + $this->set('transactionSignature', $transactionSignature); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $transactionSignature = $this->TransactionSignatures->newEntity(); + if ($this->request->is('post')) { + $transactionSignature = $this->TransactionSignatures->patchEntity($transactionSignature, $this->request->getData()); + if ($this->TransactionSignatures->save($transactionSignature)) { + $this->Flash->success(__('The transaction signature has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction signature could not be saved. Please, try again.')); + } + $transactions = $this->TransactionSignatures->Transactions->find('list', ['limit' => 200]); + $this->set(compact('transactionSignature', 'transactions')); + } + + /** + * Edit method + * + * @param string|null $id Transaction Signature id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $transactionSignature = $this->TransactionSignatures->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $transactionSignature = $this->TransactionSignatures->patchEntity($transactionSignature, $this->request->getData()); + if ($this->TransactionSignatures->save($transactionSignature)) { + $this->Flash->success(__('The transaction signature has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction signature could not be saved. Please, try again.')); + } + $transactions = $this->TransactionSignatures->Transactions->find('list', ['limit' => 200]); + $this->set(compact('transactionSignature', 'transactions')); + } + + /** + * Delete method + * + * @param string|null $id Transaction Signature id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $transactionSignature = $this->TransactionSignatures->get($id); + if ($this->TransactionSignatures->delete($transactionSignature)) { + $this->Flash->success(__('The transaction signature has been deleted.')); + } else { + $this->Flash->error(__('The transaction signature could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/TransactionTypesController.php b/community_server/src/Controller/TransactionTypesController.php new file mode 100644 index 000000000..8256b22eb --- /dev/null +++ b/community_server/src/Controller/TransactionTypesController.php @@ -0,0 +1,106 @@ +paginate($this->TransactionTypes); + + $this->set(compact('transactionTypes')); + } + + /** + * View method + * + * @param string|null $id Transaction Type id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $transactionType = $this->TransactionTypes->get($id, [ + 'contain' => ['Transactions'] + ]); + + $this->set('transactionType', $transactionType); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $transactionType = $this->TransactionTypes->newEntity(); + if ($this->request->is('post')) { + $transactionType = $this->TransactionTypes->patchEntity($transactionType, $this->request->getData()); + if ($this->TransactionTypes->save($transactionType)) { + $this->Flash->success(__('The transaction type has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction type could not be saved. Please, try again.')); + } + $this->set(compact('transactionType')); + } + + /** + * Edit method + * + * @param string|null $id Transaction Type id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $transactionType = $this->TransactionTypes->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $transactionType = $this->TransactionTypes->patchEntity($transactionType, $this->request->getData()); + if ($this->TransactionTypes->save($transactionType)) { + $this->Flash->success(__('The transaction type has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction type could not be saved. Please, try again.')); + } + $this->set(compact('transactionType')); + } + + /** + * Delete method + * + * @param string|null $id Transaction Type id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $transactionType = $this->TransactionTypes->get($id); + if ($this->TransactionTypes->delete($transactionType)) { + $this->Flash->success(__('The transaction type has been deleted.')); + } else { + $this->Flash->error(__('The transaction type could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/TransactionsController.php b/community_server/src/Controller/TransactionsController.php new file mode 100644 index 000000000..2f0bc2747 --- /dev/null +++ b/community_server/src/Controller/TransactionsController.php @@ -0,0 +1,259 @@ +loadComponent('GradidoNumber'); + $this->loadComponent('JsonRpcRequestClient'); + $this->Auth->allow(['decode']); + + } + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $this->paginate = [ + 'contain' => ['TransactionTypes'] + ]; + $transactions = $this->paginate($this->Transactions); + + $this->set(compact('transactions')); + } + + /** + * View method + * + * @param string|null $id Transaction id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $transaction = $this->Transactions->get($id, [ + 'contain' => ['TransactionTypes', 'TransactionCreations', 'TransactionGroupAddaddress', 'TransactionGroupAllowtrades', 'TransactionGroupCreates', 'TransactionSendCoins', 'TransactionSignatures'] + ]); + + $this->set('transaction', $transaction); + } + + public function decode() + { + $this->viewBuilder()->setLayout('frontend'); + if ($this->request->is('post')) { + $base64 = $this->request->getData('base64'); + if(!$base64 || $base64 == '') { + $this->Flash->error(__('No valid data given, please try again.')); + } else { + try { + $transactionBin = sodium_base642bin($base64, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING); + } catch(Exception $ex) { + var_dump($ex); + } + $transaction = new TransactionBody($transactionBin); + if($transaction->hasErrors()) { + $this->set('errors', $transaction->getErrors()); + } else { + //$transaction->validate(); + if($transaction->hasErrors()) { + $this->set('errors', $transaction->getErrors()); + } + //var_dump($transaction); + echo "
    bin:
    "; + var_dump($transactionBin); + echo "
    "; + $this->set('transaction', $transaction); + } + + } + } + + } + + public function sendToNode() { + $this->viewBuilder()->setLayout('frontend'); + $startTime = microtime(true); + + //$loginServer = Configure::read('LoginServer'); + + $jsonRpcResult = $this->JsonRpcRequestClient->request('getlasttransaction', []); + $result = $jsonRpcResult['result']; + //var_dump($result); + if($result['state'] != 'success') { + $this->Flash->error(__('error retriving last saved transaction from gradido node.')); + $timeUsed = microtime(true) - $startTime; + $this->set('timeUsed', $timeUsed); + return; + } + + $firstId = 1; + if($result['transaction'] != '') { + $lastKnowTransaction = new Transaction($result['transaction']); + $firstId = $lastKnowTransaction->getId()+1; + } + + $transactionIDEntities = $this->Transactions + ->find('all') + ->select(['id']) + ->where(['id >=' => $firstId]) + ; + $transactionIDs = []; + foreach($transactionIDEntities as $entity) { + array_push($transactionIDs, $entity->id); + } + + $csfr_token = $this->request->getParam('_csrfToken'); + $this->set('csfr_token', $csfr_token); + $this->set('transactionIds', $transactionIDs); + + $timeUsed = microtime(true) - $startTime; + $this->set('timeUsed', $timeUsed); + + if ($this->request->is('post')) { + $host = $this->request->getData('host'); + $port = $this->request->getData('port'); + //$gradidod = new JsonRpcClient($host . ':' . $port); + + + //var_dump($transactionIDs); + + //$result = $this->JsonRpcRequestClient->request('puttransaction', ['group' => 'Hallo', 'transaction' => 'Hallo2' ]); + + //$result = $gradidod->putTransaction(['group' => 'Hallo', 'transaction' => 'Hallo2' ]); + //var_dump($result); + + $timeUsed = microtime(true) - $startTime; + $this->set('timeUsed', $timeUsed); + } + } + + public function ajaxPutTransactionToGradidoNode() + { + $startTime = microtime(true); + if($this->request->is('post')) { + //$jsonData = $this->request->input('json_decode', true); + $data = $this->request->getData(); + //$user = $jsonData['user']; + //var_dump($data); + $transactionId = $data['transaction_id']; + if($transactionId == null || $transactionId < 1) { + $timeUsed = microtime(true) - $startTime; + return $this->returnJson(['state' => 'error', 'msg' => 'invalid transaction id', 'timeUsed' => $timeUsed]); + } + try { + $transaction = Transaction::fromTable($transactionId); + } catch(Exception $e) { + echo "exception: "; + var_dump($e); + } + if(is_array($transaction)) { + $timeUsed = microtime(true) - $startTime; + $transaction['timeUsed'] = $timeUsed; + return $this->returnJson($transaction); + } else { + $transactionBase64 = base64_encode($transaction->serializeToString()); + //echo "base64:
    $transactionBase64
    "; + + $result = $this->JsonRpcRequestClient->request('puttransaction', [ + 'group' => 'd502c4254defe1842d71c484dc35f56983ce938e3c22058795c7520b62ab9123', + 'transaction' => $transactionBase64 + ]); + + $timeUsed = microtime(true) - $startTime; + $result['timeUsed'] = $timeUsed; + return $this->returnJson($result); + } + //return $this->returnJson(['state' => 'success', 'timeUsed' => $timeUsed]); + } + $timeUsed = microtime(true) - $startTime; + return $this->returnJson(['state' => 'error', 'msg' => 'no post request', 'timeUsed' => $timeUsed]); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $transaction = $this->Transactions->newEntity(); + if ($this->request->is('post')) { + $transaction = $this->Transactions->patchEntity($transaction, $this->request->getData()); + if ($this->Transactions->save($transaction)) { + $this->Flash->success(__('The transaction has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction could not be saved. Please, try again.')); + } + $stateGroups = $this->Transactions->StateGroups->find('list', ['limit' => 200]); + $transactionTypes = $this->Transactions->TransactionTypes->find('list', ['limit' => 200]); + $this->set(compact('transaction', 'stateGroups', 'transactionTypes')); + } + + /** + * Edit method + * + * @param string|null $id Transaction id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $transaction = $this->Transactions->get($id, [ + 'contain' => [] + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $transaction = $this->Transactions->patchEntity($transaction, $this->request->getData()); + if ($this->Transactions->save($transaction)) { + $this->Flash->success(__('The transaction has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The transaction could not be saved. Please, try again.')); + } + $stateGroups = $this->Transactions->StateGroups->find('list', ['limit' => 200]); + $transactionTypes = $this->Transactions->TransactionTypes->find('list', ['limit' => 200]); + $this->set(compact('transaction', 'stateGroups', 'transactionTypes')); + } + + /** + * Delete method + * + * @param string|null $id Transaction id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $transaction = $this->Transactions->get($id); + if ($this->Transactions->delete($transaction)) { + $this->Flash->success(__('The transaction has been deleted.')); + } else { + $this->Flash->error(__('The transaction could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Controller/UsersController.php b/community_server/src/Controller/UsersController.php new file mode 100644 index 000000000..f6b0472d3 --- /dev/null +++ b/community_server/src/Controller/UsersController.php @@ -0,0 +1,167 @@ +set( + 'naviHierarchy', + (new NaviHierarchy())-> + add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->add(new NaviHierarchyEntry(__('Benutzerstatistiken'), 'Users', 'statistics', true)) + ); + } + + /** + * Index method + * + * @return \Cake\Http\Response|null + */ + public function index() + { + $users = $this->paginate($this->Users); + + $this->set(compact('users')); + } + + public function statistics() + { + $startTime = microtime(true); + $this->viewBuilder()->setLayout('frontend'); + $users = $this->Users->find('all')->select(['id']); + + //$newUsersThisMonth + $now = new Time(); + $sortDate = $this->getStartEndForMonth($now->month, $now->year); + $newUsersThisMonth = $this->Users->find('all') + ->select(['id']) + ->where(['created >=' => $sortDate[0], 'created <' => $sortDate[1]]); + $lastMonth = new Time(); + $lastMonth = $lastMonth->subMonth(1); + $prevSortDate = $this->getStartEndForMonth($lastMonth->month, $lastMonth->year); + $newUsersLastMonth = $this->Users->find('all') + ->select(['id']) + ->where(['created >=' => $prevSortDate[0], 'created <' => $prevSortDate[1]]); + + // new user sorted after date + $connection = ConnectionManager::get('loginServer'); + $newAccountsPerDay = $connection->execute('SELECT count(id) as count, created FROM users GROUP BY CAST(created as DATE) ORDER BY created DESC ')->fetchAll('assoc'); + + $newAccountsTree = []; + foreach($newAccountsPerDay as $entry) { + $created = new Time($entry['created']); + if(!isset($newAccountsTree[$created->year])) { + $newAccountsTree[$created->year] = []; + } + if(!isset($newAccountsTree[$created->year][$created->month])) { + $newAccountsTree[$created->year][$created->month] = ['count' => 0, 'days' => []]; + } + array_push($newAccountsTree[$created->year][$created->month]['days'], $entry); + $newAccountsTree[$created->year][$created->month]['count'] += intval($entry['count']); + } + + // last 5 new users + $lastUsers = $this->Users->find('all')->order(['created DESC'])->limit(5); + + $timeUsed = microtime(true) - $startTime; + + $this->set(compact( + 'users', 'newUsersThisMonth', 'newUsersLastMonth', + 'timeUsed', 'newAccountsTree', 'lastUsers')); + } + + /** + * View method + * + * @param string|null $id User id. + * @return \Cake\Http\Response|null + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function view($id = null) + { + $user = $this->Users->get($id, [ + 'contain' => ['EmailOptIn', 'UserBackups', 'UserRoles'], + ]); + + $this->set('user', $user); + } + + /** + * Add method + * + * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. + */ + public function add() + { + $user = $this->Users->newEntity(); + if ($this->request->is('post')) { + $user = $this->Users->patchEntity($user, $this->request->getData()); + if ($this->Users->save($user)) { + $this->Flash->success(__('The user has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The user could not be saved. Please, try again.')); + } + $this->set(compact('user')); + } + + /** + * Edit method + * + * @param string|null $id User id. + * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function edit($id = null) + { + $user = $this->Users->get($id, [ + 'contain' => [], + ]); + if ($this->request->is(['patch', 'post', 'put'])) { + $user = $this->Users->patchEntity($user, $this->request->getData()); + if ($this->Users->save($user)) { + $this->Flash->success(__('The user has been saved.')); + + return $this->redirect(['action' => 'index']); + } + $this->Flash->error(__('The user could not be saved. Please, try again.')); + } + $this->set(compact('user')); + } + + /** + * Delete method + * + * @param string|null $id User id. + * @return \Cake\Http\Response|null Redirects to index. + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. + */ + public function delete($id = null) + { + $this->request->allowMethod(['post', 'delete']); + $user = $this->Users->get($id); + if ($this->Users->delete($user)) { + $this->Flash->success(__('The user has been deleted.')); + } else { + $this->Flash->error(__('The user could not be deleted. Please, try again.')); + } + + return $this->redirect(['action' => 'index']); + } +} diff --git a/community_server/src/Form/CreationForm.php b/community_server/src/Form/CreationForm.php new file mode 100644 index 000000000..70b4fce40 --- /dev/null +++ b/community_server/src/Form/CreationForm.php @@ -0,0 +1,73 @@ +addField('receiver_pubkey_hex', ['type' => 'string']) + ->addField('receiver', ['type' => 'select']) + ->addField('amount', ['type' => 'decimal', 'precision' => 2]) + ->addField('target_date', ['type' => 'date']) + ->addField('memo', ['type' =>'text', 'default' => '', 'rows' => 3, 'maxlength' => 150]); + } + + function validationDefault(Validator $validator) + { + $validator->setProvider('custom', 'App\Model\Validation\TransactionValidation'); + /* + $validator->add('receiver_pubkey_hex', 'length', [ + 'rule' => ['length', 64], + 'message' => 'a valid pubkey in hex format is required (64 character)' + ])->add('receiver_pubkey_hex_select', 'length', [ + 'rule' => ['length', 64], + 'message' => 'a valid pubkey in hex format is required (64 character)', + ]); +*/ + // TODO: add validation for used character to prevent hacking attempts + $validator->add('memo', 'length', [ + 'rule' => ['maxLength', 150], + 'message' => 'max 150 character' + ]) + //->alphaNumeric('memo', __('Only Alpha Numeric Character allowed')) + ->add('memo', 'custom', [ + 'rule' => 'alphaNumeric', + 'provider' => 'custom', + //'message' => __('Only Alpha Numeric Character allowed') + 'message' => __('No HTML Tags like > or < please.') + ]) + ->allowEmptyString('memo', null, 'create') + /*->add('receiver_pubkey_hex', 'custom', [ + 'rule' => 'hexKey64', + 'provider' => 'custom', + 'message' => 'a valid pubkey in hex format is required (64 character)' + ]) + ->allowEmptyString('receiver_pubkey_hex', null, 'create')*/ + ->add('amount', 'custom', [ + 'rule' => 'amount', + 'provider' => 'custom', + 'message' => __('Please give a valid number with maximal 2 decimal places') + ]); + return $validator; + } + /* + * $validator->add('title', 'custom', [ + 'rule' => 'customRule', + 'provider' => 'custom', + 'message' => 'The title is not unique enough' +]); + */ + + protected function _execute(array $data) + { + // Send an email. + return true; + } +} \ No newline at end of file diff --git a/community_server/src/Form/DecodeTransaction.php b/community_server/src/Form/DecodeTransaction.php new file mode 100644 index 000000000..3ac00faa6 --- /dev/null +++ b/community_server/src/Form/DecodeTransaction.php @@ -0,0 +1,8 @@ +addField('first_name', ['type' => 'string']) + ->addField('last_name', ['type' => 'string']) + ->addField('profile_img', ['type' => 'string']) + ->addField('profile_desc', ['type' =>'text', 'default' => '', 'rows' => 10, 'maxlength' => 2000]); + } + + function validationDefault(Validator $validator) + { + $validator->setProvider('generic', 'App\Model\Validation\GenericValidation'); + $validator->add('first_name', 'length', [ + 'rule' => ['maxLength', 255], + 'message' => __('The first name should contain max 255 characters') + ]) + ->add('last_name', 'length', [ + 'rule' => ['maxLength', 255], + 'message' => __('The last name should contain max 255 characters') + ]) + ->add('profile_desc', 'length', [ + 'rule' => ['maxLength', 2000], + 'message' => __('The description should contain max 2000 characters') + ]) + ->add('profile_desc', 'generic', [ + 'rule' => 'alphaNumeric', + 'provider' => 'generic', + 'message' => __('No HTML Tags like > or < please.') + ]) + ->allowEmptyString('profile_img', null, 'create') + ->allowEmptyString('profile_desc', null, 'create') + ; + return $validator; + } + + protected function _execute(array $data) + { + // Send an email. (??? xxx) + return true; + } +} diff --git a/community_server/src/Form/TransferForm.php b/community_server/src/Form/TransferForm.php new file mode 100644 index 000000000..5572ddaf9 --- /dev/null +++ b/community_server/src/Form/TransferForm.php @@ -0,0 +1,75 @@ +addField('email', ['type' => 'string']) + ->addField('amount', ['type' => 'decimal', 'precision' => 2]) + ->addField('memo', ['type' =>'text', 'default' => '', 'rows' => 3, 'maxlength' => 150]); + } + + function validationDefault(Validator $validator) + { + $validator->setProvider('custom', 'App\Model\Validation\TransactionValidation'); + /* + $validator->add('receiver_pubkey_hex', 'length', [ + 'rule' => ['length', 64], + 'message' => 'a valid pubkey in hex format is required (64 character)' + ])->add('receiver_pubkey_hex_select', 'length', [ + 'rule' => ['length', 64], + 'message' => 'a valid pubkey in hex format is required (64 character)', + ]); +*/ + // TODO: add validation for used character to prevent hacking attempts + $validator->add('email', 'format', [ + 'rule' => 'email', + 'message' => __('A valid email address is required') + ]) + ->add('memo', 'length', [ + 'rule' => ['maxLength', 150], + 'message' => __('The memo should contain max 150 character') + ]) + //->alphaNumeric('memo', __('Only Alpha Numeric Character allowed')) + ->add('memo', 'custom', [ + 'rule' => 'alphaNumeric', + 'provider' => 'custom', + //'message' => __('Only Alpha Numeric Character allowed') + 'message' => __('No HTML Tags like > or < please.') + ]) + ->allowEmptyString('memo', null, 'create') + /*->add('receiver_pubkey_hex', 'custom', [ + 'rule' => 'hexKey64', + 'provider' => 'custom', + 'message' => 'a valid pubkey in hex format is required (64 character)' + ]) + ->allowEmptyString('receiver_pubkey_hex', null, 'create')*/ + ->add('amount', 'custom', [ + 'rule' => 'amount', + 'provider' => 'custom', + 'message' => __('Please give a valid positive number with maximal 2 decimal places') + ]); + return $validator; + } + /* + * $validator->add('title', 'custom', [ + 'rule' => 'customRule', + 'provider' => 'custom', + 'message' => 'The title is not unique enough' +]); + */ + + protected function _execute(array $data) + { + // Send an email. + return true; + } +} diff --git a/community_server/src/Form/TransferRawForm.php b/community_server/src/Form/TransferRawForm.php new file mode 100644 index 000000000..50c548ec5 --- /dev/null +++ b/community_server/src/Form/TransferRawForm.php @@ -0,0 +1,73 @@ +addField('sender_privkey_hex', ['type' => 'string']) + ->addField('sender_pubkey_hex', ['type' => 'string']) + ->addField('receiver_pubkey_hex', ['type' => 'string']) + ->addField('amount', ['type' => 'decimal', 'precision' => 2]) + ->addField('memo', ['type' =>'text', 'default' => '', 'rows' => 3, 'maxlength' => 150]); + } + + function validationDefault(Validator $validator) + { + $validator->setProvider('custom', 'App\Model\Validation\TransactionValidation'); + + $validator + ->add('memo', 'length', [ + 'rule' => ['maxLength', 150], + 'message' => __('The memo should contain max 150 character') + ]) + ->add('memo', 'custom', [ + 'rule' => 'alphaNumeric', + 'provider' => 'custom', + //'message' => __('Only Alpha Numeric Character allowed') + 'message' => __('No HTML Tags like > or < please.') + ]) + ->allowEmptyString('memo', null, 'create') + ->add('receiver_pubkey_hex', 'custom', [ + 'rule' => 'hexKey64', + 'provider' => 'custom', + 'message' => 'a valid pubkey in hex format is required (64 character)' + ]) + ->add('sender_privkey_hex', 'custom', [ + 'rule' => 'hexKey128', + 'provider' => 'custom', + 'message' => 'a valid privkey in hex format is required (128 character)' + ]) + ->add('sender_pubkey_hex', 'custom', [ + 'rule' => 'hexKey64', + 'provider' => 'custom', + 'message' => 'a valid pubkey in hex format is required (64 character)' + ]) + ->add('amount', 'custom', [ + 'rule' => 'amount', + 'provider' => 'custom', + 'message' => __('Please give a valid positive number with maximal 2 decimal places') + ]); + return $validator; + } + /* + * $validator->add('title', 'custom', [ + 'rule' => 'customRule', + 'provider' => 'custom', + 'message' => 'The title is not unique enough' +]); + */ + + protected function _execute(array $data) + { + // Send an email. + return true; + } +} \ No newline at end of file diff --git a/community_server/src/Form/UserSearchForm.php b/community_server/src/Form/UserSearchForm.php new file mode 100644 index 000000000..e2955e244 --- /dev/null +++ b/community_server/src/Form/UserSearchForm.php @@ -0,0 +1,56 @@ +addField('search', ['type' => 'string']); + } + + function validationDefault(Validator $validator) + { + $validator->setProvider('custom', 'App\Model\Validation\GenericValidation'); + /* + $validator->add('receiver_pubkey_hex', 'length', [ + 'rule' => ['length', 64], + 'message' => 'a valid pubkey in hex format is required (64 character)' + ])->add('receiver_pubkey_hex_select', 'length', [ + 'rule' => ['length', 64], + 'message' => 'a valid pubkey in hex format is required (64 character)', + ]); +*/ + // TODO: add validation for used character to prevent hacking attempts + $validator->add('search', 'length', [ + 'rule' => ['maxLength', 50], + 'message' => __('The search text should contain max 50 character') + ]) + //->alphaNumeric('memo', __('Only Alpha Numeric Character allowed')) + ->add('search', 'custom', [ + 'rule' => 'alphaNumeric', + 'provider' => 'custom', + //'message' => __('Only Alpha Numeric Character allowed') + 'message' => __('No HTML Tags like < or > please.') + ]); + return $validator; + } + /* + * $validator->add('title', 'custom', [ + 'rule' => 'customRule', + 'provider' => 'custom', + 'message' => 'The title is not unique enough' +]); + */ + + protected function _execute(array $data) + { + // Send an email. + return true; + } +} \ No newline at end of file diff --git a/community_server/src/Locale/cake.pot b/community_server/src/Locale/cake.pot new file mode 100644 index 000000000..7d317194e --- /dev/null +++ b/community_server/src/Locale/cake.pot @@ -0,0 +1,29 @@ +# LANGUAGE translation of CakePHP Application +# Copyright YEAR NAME +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2019-11-12 14:40+0000\n" +"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n" +"Last-Translator: NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: Template/Error/error400.ctp:36 +#: Template/Error/error500.ctp:41 +msgid "Error" +msgstr "" + +#: Template/Error/error400.ctp:37 +msgid "The requested address {0} was not found on this server." +msgstr "" + +#: Template/Error/error500.ctp:39 +msgid "An Internal Error Has Occurred" +msgstr "" + diff --git a/community_server/src/Locale/de_DE/default.mo b/community_server/src/Locale/de_DE/default.mo new file mode 100644 index 000000000..024e2f28d Binary files /dev/null and b/community_server/src/Locale/de_DE/default.mo differ diff --git a/community_server/src/Locale/de_DE/default.po b/community_server/src/Locale/de_DE/default.po new file mode 100644 index 000000000..90d3c053d --- /dev/null +++ b/community_server/src/Locale/de_DE/default.po @@ -0,0 +1,2223 @@ +# LANGUAGE translation of CakePHP Application +# Copyright YEAR NAME +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2020-01-17 18:44+0000\n" +"PO-Revision-Date: 2020-01-17 19:48+0100\n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.2.4\n" +"Last-Translator: \n" +"Language: de_DE\n" + +#: Controller/AddressTypesController.php:55 +#: Controller/AddressTypesController.php:79 +msgid "The address type has been saved." +msgstr "" + +#: Controller/AddressTypesController.php:59 +#: Controller/AddressTypesController.php:83 +msgid "The address type could not be saved. Please, try again." +msgstr "" + +#: Controller/AddressTypesController.php:100 +msgid "The address type has been deleted." +msgstr "" + +#: Controller/AddressTypesController.php:102 +msgid "The address type could not be deleted. Please, try again." +msgstr "" + +#: Controller/AdminErrorsController.php:57 +#: Controller/AdminErrorsController.php:82 +msgid "The admin error has been saved." +msgstr "" + +#: Controller/AdminErrorsController.php:61 +#: Controller/AdminErrorsController.php:86 +msgid "The admin error could not be saved. Please, try again." +msgstr "" + +#: Controller/AdminErrorsController.php:104 +msgid "The admin error has been deleted." +msgstr "" + +#: Controller/AdminErrorsController.php:106 +msgid "The admin error could not be deleted. Please, try again." +msgstr "" + +#: Controller/AppController.php:196 +msgid "error updating state user " +msgstr "" + +#: Controller/AppController.php:212 +msgid "error saving state user " +msgstr "" + +#: Controller/AppController.php:220 +msgid "invalid session" +msgstr "" + +#: Controller/AppController.php:227 +#: Controller/TransactionSendCoinsController.php:222 +msgid "error http request: " +msgstr "" + +#: Controller/AppController.php:264 +msgid "Serious error, couldn't save to db, please write the admin: " +msgstr "" + +#: Controller/OperatorTypesController.php:54 +#: Controller/OperatorTypesController.php:78 +msgid "The operator type has been saved." +msgstr "" + +#: Controller/OperatorTypesController.php:58 +#: Controller/OperatorTypesController.php:82 +msgid "The operator type could not be saved. Please, try again." +msgstr "" + +#: Controller/OperatorTypesController.php:99 +msgid "The operator type has been deleted." +msgstr "" + +#: Controller/OperatorTypesController.php:101 +msgid "The operator type could not be deleted. Please, try again." +msgstr "" + +#: Controller/OperatorsController.php:182 +#: Controller/OperatorsController.php:207 +msgid "The operator has been saved." +msgstr "" + +#: Controller/OperatorsController.php:186 +#: Controller/OperatorsController.php:211 +msgid "The operator could not be saved. Please, try again." +msgstr "" + +#: Controller/OperatorsController.php:229 +msgid "The operator has been deleted." +msgstr "" + +#: Controller/OperatorsController.php:231 +msgid "The operator could not be deleted. Please, try again." +msgstr "" + +#: Controller/ServerUsersController.php:42 +msgid "Invalid username or password, try again" +msgstr "" + +#: Controller/ServerUsersController.php:78 +#: Controller/ServerUsersController.php:102 +msgid "The server user has been saved." +msgstr "" + +#: Controller/ServerUsersController.php:82 +#: Controller/ServerUsersController.php:106 +msgid "The server user could not be saved. Please, try again." +msgstr "" + +#: Controller/ServerUsersController.php:123 +msgid "The server user has been deleted." +msgstr "" + +#: Controller/ServerUsersController.php:125 +msgid "The server user could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateBalancesController.php:175 +#: Controller/StateBalancesController.php:200 +msgid "The state balance has been saved." +msgstr "" + +#: Controller/StateBalancesController.php:179 +#: Controller/StateBalancesController.php:204 +msgid "The state balance could not be saved. Please, try again." +msgstr "" + +#: Controller/StateBalancesController.php:222 +msgid "The state balance has been deleted." +msgstr "" + +#: Controller/StateBalancesController.php:224 +msgid "The state balance could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateCreatedController.php:57 +#: Controller/StateCreatedController.php:83 +msgid "The state created has been saved." +msgstr "" + +#: Controller/StateCreatedController.php:61 +#: Controller/StateCreatedController.php:87 +msgid "The state created could not be saved. Please, try again." +msgstr "" + +#: Controller/StateCreatedController.php:106 +msgid "The state created has been deleted." +msgstr "" + +#: Controller/StateCreatedController.php:108 +msgid "The state created could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateErrorsController.php:66 +msgid "Error belongs to another User, cannot delete" +msgstr "" + +#: Controller/StateErrorsController.php:69 +#: Controller/StateErrorsController.php:157 +msgid "The state error has been deleted." +msgstr "" + +#: Controller/StateErrorsController.php:71 +#: Controller/StateErrorsController.php:159 +msgid "The state error could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateErrorsController.php:108 +#: Controller/StateErrorsController.php:134 +msgid "The state error has been saved." +msgstr "" + +#: Controller/StateErrorsController.php:112 +#: Controller/StateErrorsController.php:138 +msgid "The state error could not be saved. Please, try again." +msgstr "" + +#: Controller/StateGroupAddressesController.php:57 +#: Controller/StateGroupAddressesController.php:83 +msgid "The state group address has been saved." +msgstr "" + +#: Controller/StateGroupAddressesController.php:61 +#: Controller/StateGroupAddressesController.php:87 +msgid "The state group address could not be saved. Please, try again." +msgstr "" + +#: Controller/StateGroupAddressesController.php:106 +msgid "The state group address has been deleted." +msgstr "" + +#: Controller/StateGroupAddressesController.php:108 +msgid "The state group address could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateGroupRelationshipsController.php:57 +#: Controller/StateGroupRelationshipsController.php:84 +msgid "The state group relationship has been saved." +msgstr "" + +#: Controller/StateGroupRelationshipsController.php:61 +#: Controller/StateGroupRelationshipsController.php:88 +msgid "The state group relationship could not be saved. Please, try again." +msgstr "" + +#: Controller/StateGroupRelationshipsController.php:108 +msgid "The state group relationship has been deleted." +msgstr "" + +#: Controller/StateGroupRelationshipsController.php:110 +msgid "The state group relationship could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateGroupsController.php:57 +#: Controller/StateGroupsController.php:82 +msgid "The state group has been saved." +msgstr "" + +#: Controller/StateGroupsController.php:61 +#: Controller/StateGroupsController.php:86 +msgid "The state group could not be saved. Please, try again." +msgstr "" + +#: Controller/StateGroupsController.php:104 +msgid "The state group has been deleted." +msgstr "" + +#: Controller/StateGroupsController.php:106 +msgid "The state group could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateRelationshipTypesController.php:54 +#: Controller/StateRelationshipTypesController.php:78 +msgid "The state relationship type has been saved." +msgstr "" + +#: Controller/StateRelationshipTypesController.php:58 +#: Controller/StateRelationshipTypesController.php:82 +msgid "The state relationship type could not be saved. Please, try again." +msgstr "" + +#: Controller/StateRelationshipTypesController.php:99 +msgid "The state relationship type has been deleted." +msgstr "" + +#: Controller/StateRelationshipTypesController.php:101 +msgid "The state relationship type could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateUsersController.php:13 +msgid "account created" +msgstr "Konto angelegt" + +#: Controller/StateUsersController.php:14 +msgid "account not on login-server" +msgstr "Konto nicht auf Login-Server" + +#: Controller/StateUsersController.php:15 +msgid "email activated" +msgstr "Konto aktiviert" + +#: Controller/StateUsersController.php:16 +msgid "account copied to community" +msgstr "Konto kopiert nach Community-Server" + +#: Controller/StateUsersController.php:17 +msgid "email not activated" +msgstr "Konto nicht aktiviert" + +#: Controller/StateUsersController.php:18 +msgid "account multiple times on login-server" +msgstr "Konto mehrfach vorhanden" + +#: Controller/StateUsersController.php:19 +msgid "account not on community server" +msgstr "Konto nicht auf Community-Server" + +#: Controller/StateUsersController.php:20 +msgid "no keys" +msgstr "Keine Schlüssel generiert" + +#: Controller/StateUsersController.php:209 +#: Controller/TransactionCreationsController.php:174 +#: Controller/TransactionSendCoinsController.php:231 +msgid "Something was invalid, please try again!" +msgstr "" + +#: Controller/StateUsersController.php:244 +#: Controller/StateUsersController.php:270 +msgid "The state user has been saved." +msgstr "" + +#: Controller/StateUsersController.php:248 +#: Controller/StateUsersController.php:274 +msgid "The state user could not be saved. Please, try again." +msgstr "" + +#: Controller/StateUsersController.php:293 +msgid "The state user has been deleted." +msgstr "" + +#: Controller/StateUsersController.php:295 +msgid "The state user could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionCreationsController.php:139 +#: Controller/TransactionCreationsController.php:326 +msgid "Error by requesting LoginServer, please try again" +msgstr "" + +#: Controller/TransactionCreationsController.php:141 +#: Controller/TransactionCreationsController.php:328 +msgid "Error, please wait for the admin to fix it" +msgstr "" + +#: Controller/TransactionCreationsController.php:151 +#: Controller/TransactionCreationsController.php:338 +msgid "Login Server Error, please wait for the admin to fix it" +msgstr "" + +#: Controller/TransactionCreationsController.php:165 +#: Controller/TransactionCreationsController.php:352 +#: Controller/TransactionSendCoinsController.php:216 +msgid "Transaction submitted for review." +msgstr "" + +#: Controller/TransactionCreationsController.php:170 +msgid "Building transaction failed" +msgstr "" + +#: Controller/TransactionCreationsController.php:262 +msgid "No user selected" +msgstr "" + +#: Controller/TransactionCreationsController.php:373 +#: Controller/TransactionCreationsController.php:399 +msgid "The transaction creation has been saved." +msgstr "" + +#: Controller/TransactionCreationsController.php:377 +#: Controller/TransactionCreationsController.php:403 +msgid "The transaction creation could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionCreationsController.php:422 +msgid "The transaction creation has been deleted." +msgstr "" + +#: Controller/TransactionCreationsController.php:424 +msgid "The transaction creation could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionGroupAddaddressController.php:57 +#: Controller/TransactionGroupAddaddressController.php:83 +msgid "The transaction group addaddres has been saved." +msgstr "" + +#: Controller/TransactionGroupAddaddressController.php:61 +#: Controller/TransactionGroupAddaddressController.php:87 +msgid "The transaction group addaddres could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionGroupAddaddressController.php:106 +msgid "The transaction group addaddres has been deleted." +msgstr "" + +#: Controller/TransactionGroupAddaddressController.php:108 +msgid "" +"The transaction group addaddres could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionGroupAllowtradesController.php:57 +#: Controller/TransactionGroupAllowtradesController.php:83 +msgid "The transaction group allowtrade has been saved." +msgstr "" + +#: Controller/TransactionGroupAllowtradesController.php:61 +#: Controller/TransactionGroupAllowtradesController.php:87 +msgid "The transaction group allowtrade could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionGroupAllowtradesController.php:106 +msgid "The transaction group allowtrade has been deleted." +msgstr "" + +#: Controller/TransactionGroupAllowtradesController.php:108 +msgid "" +"The transaction group allowtrade could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionGroupCreatesController.php:57 +#: Controller/TransactionGroupCreatesController.php:83 +msgid "The transaction group create has been saved." +msgstr "" + +#: Controller/TransactionGroupCreatesController.php:61 +#: Controller/TransactionGroupCreatesController.php:87 +msgid "The transaction group create could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionGroupCreatesController.php:106 +msgid "The transaction group create has been deleted." +msgstr "" + +#: Controller/TransactionGroupCreatesController.php:108 +msgid "The transaction group create could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionSendCoinsController.php:73 +#: Controller/TransactionSendCoinsController.php:100 +msgid "The transaction send coin has been saved." +msgstr "" + +#: Controller/TransactionSendCoinsController.php:77 +#: Controller/TransactionSendCoinsController.php:104 +msgid "The transaction send coin could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionSendCoinsController.php:145 +msgid "Du hast nicht genug Geld!" +msgstr "" + +#: Controller/TransactionSendCoinsController.php:151 +msgid "Du kannst dir leider nicht selbst Geld schicken!" +msgstr "" + +#: Controller/TransactionSendCoinsController.php:163 +msgid "" +"Diese E-Mail ist mir nicht bekannt, hat dein Empfänger denn schon ein " +"Gradido-Konto?" +msgstr "" + +#: Controller/TransactionSendCoinsController.php:202 +msgid "login server return error: " +msgstr "" + +#: Controller/TransactionSendCoinsController.php:226 +msgid "No Valid Receiver Public given" +msgstr "" + +#: Controller/TransactionSendCoinsController.php:250 +msgid "The transaction send coin has been deleted." +msgstr "" + +#: Controller/TransactionSendCoinsController.php:252 +msgid "The transaction send coin could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionSignaturesController.php:57 +#: Controller/TransactionSignaturesController.php:82 +msgid "The transaction signature has been saved." +msgstr "" + +#: Controller/TransactionSignaturesController.php:61 +#: Controller/TransactionSignaturesController.php:86 +msgid "The transaction signature could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionSignaturesController.php:104 +msgid "The transaction signature has been deleted." +msgstr "" + +#: Controller/TransactionSignaturesController.php:106 +msgid "The transaction signature could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionTypesController.php:54 +#: Controller/TransactionTypesController.php:78 +msgid "The transaction type has been saved." +msgstr "" + +#: Controller/TransactionTypesController.php:58 +#: Controller/TransactionTypesController.php:82 +msgid "The transaction type could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionTypesController.php:99 +msgid "The transaction type has been deleted." +msgstr "" + +#: Controller/TransactionTypesController.php:101 +msgid "The transaction type could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionsController.php:63 +msgid "No valid data given, please try again." +msgstr "" + +#: Controller/TransactionsController.php:101 +#: Controller/TransactionsController.php:127 +msgid "The transaction has been saved." +msgstr "" + +#: Controller/TransactionsController.php:105 +#: Controller/TransactionsController.php:131 +msgid "The transaction could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionsController.php:150 +msgid "The transaction has been deleted." +msgstr "" + +#: Controller/TransactionsController.php:152 +msgid "The transaction could not be deleted. Please, try again." +msgstr "" + +#: Form/CreationForm.php:43 Form/TransferForm.php:46 +msgid "No HTML Tags like > or < please." +msgstr "" + +#: Form/CreationForm.php:55 +msgid "Please give a valid number with maximal 2 decimal places" +msgstr "" + +#: Form/TransferForm.php:35 +msgid "A valid email address is required" +msgstr "" + +#: Form/TransferForm.php:39 +msgid "The memo should contain max 150 character" +msgstr "" + +#: Form/TransferForm.php:58 +msgid "Please give a valid positive number with maximal 2 decimal places" +msgstr "" + +#: Form/UserSearchForm.php:32 +msgid "The search text should contain max 50 character" +msgstr "" + +#: Form/UserSearchForm.php:39 +msgid "No HTML Tags like < or > please." +msgstr "" + +#: Model/Table/ServerUsersTable.php:58 +msgid "Please give a username" +msgstr "" + +#: Model/Table/ServerUsersTable.php:64 +msgid "Please give a password" +msgstr "" + +#: Model/Table/ServerUsersTable.php:69 +msgid "Please give a email" +msgstr "" + +#: Template/AddressTypes/add.ctp:9 Template/AddressTypes/edit.ctp:9 +#: Template/AddressTypes/index.ctp:9 Template/AddressTypes/index.ctp:25 +#: Template/AddressTypes/view.ctp:9 Template/AddressTypes/view.ctp:45 +#: Template/AddressTypes/view.ctp:72 Template/AdminErrors/add.ctp:9 +#: Template/AdminErrors/edit.ctp:9 Template/AdminErrors/index.ctp:9 +#: Template/AdminErrors/index.ctp:28 Template/AdminErrors/view.ctp:9 +#: Template/OperatorTypes/add.ctp:9 Template/OperatorTypes/edit.ctp:9 +#: Template/OperatorTypes/index.ctp:9 Template/OperatorTypes/index.ctp:23 +#: Template/OperatorTypes/view.ctp:9 Template/OperatorTypes/view.ctp:43 +#: Template/Operators/add.ctp:9 Template/Operators/edit.ctp:9 +#: Template/Operators/index.ctp:9 Template/Operators/index.ctp:24 +#: Template/Operators/view.ctp:9 Template/ServerUsers/add.ctp:9 +#: Template/ServerUsers/edit.ctp:9 Template/ServerUsers/index.ctp:9 +#: Template/ServerUsers/index.ctp:26 Template/ServerUsers/view.ctp:9 +#: Template/StateBalances/add.ctp:9 Template/StateBalances/edit.ctp:9 +#: Template/StateBalances/index.ctp:9 Template/StateBalances/index.ctp:24 +#: Template/StateBalances/view.ctp:9 Template/StateCreated/add.ctp:9 +#: Template/StateCreated/edit.ctp:9 Template/StateCreated/index.ctp:9 +#: Template/StateCreated/index.ctp:29 Template/StateCreated/view.ctp:9 +#: Template/StateErrors/add.ctp:9 Template/StateErrors/edit.ctp:9 +#: Template/StateErrors/index.ctp:9 Template/StateErrors/index.ctp:26 +#: Template/StateErrors/view.ctp:9 Template/StateGroupAddresses/add.ctp:9 +#: Template/StateGroupAddresses/edit.ctp:9 +#: Template/StateGroupAddresses/index.ctp:9 +#: Template/StateGroupAddresses/index.ctp:25 +#: Template/StateGroupAddresses/view.ctp:9 +#: Template/StateGroupRelationships/add.ctp:9 +#: Template/StateGroupRelationships/edit.ctp:9 +#: Template/StateGroupRelationships/index.ctp:9 +#: Template/StateGroupRelationships/index.ctp:22 +#: Template/StateGroupRelationships/view.ctp:9 Template/StateGroups/add.ctp:9 +#: Template/StateGroups/edit.ctp:9 Template/StateGroups/index.ctp:9 +#: Template/StateGroups/index.ctp:29 Template/StateGroups/view.ctp:9 +#: Template/StateGroups/view.ctp:49 Template/StateGroups/view.ctp:76 +#: Template/StateGroups/view.ctp:104 Template/StateGroups/view.ctp:133 +#: Template/StateRelationshipTypes/add.ctp:9 +#: Template/StateRelationshipTypes/edit.ctp:9 +#: Template/StateRelationshipTypes/index.ctp:9 +#: Template/StateRelationshipTypes/index.ctp:21 +#: Template/StateRelationshipTypes/view.ctp:9 Template/StateUsers/add.ctp:9 +#: Template/StateUsers/edit.ctp:9 Template/StateUsers/index.ctp:9 +#: Template/StateUsers/index.ctp:34 Template/StateUsers/view.ctp:9 +#: Template/StateUsers/view.ctp:51 Template/StateUsers/view.ctp:81 +#: Template/StateUsers/view.ctp:112 Template/StateUsers/view.ctp:143 +#: Template/TransactionCreations/add.ctp:9 +#: Template/TransactionCreations/edit.ctp:9 +#: Template/TransactionCreations/index.ctp:9 +#: Template/TransactionCreations/index.ctp:26 +#: Template/TransactionCreations/view.ctp:9 +#: Template/TransactionGroupAddaddress/add.ctp:9 +#: Template/TransactionGroupAddaddress/edit.ctp:9 +#: Template/TransactionGroupAddaddress/index.ctp:9 +#: Template/TransactionGroupAddaddress/index.ctp:25 +#: Template/TransactionGroupAddaddress/view.ctp:9 +#: Template/TransactionGroupAllowtrades/add.ctp:9 +#: Template/TransactionGroupAllowtrades/edit.ctp:9 +#: Template/TransactionGroupAllowtrades/index.ctp:9 +#: Template/TransactionGroupAllowtrades/index.ctp:24 +#: Template/TransactionGroupAllowtrades/view.ctp:9 +#: Template/TransactionGroupCreates/add.ctp:9 +#: Template/TransactionGroupCreates/edit.ctp:9 +#: Template/TransactionGroupCreates/index.ctp:9 +#: Template/TransactionGroupCreates/index.ctp:26 +#: Template/TransactionGroupCreates/view.ctp:9 +#: Template/TransactionSendCoins/add.ctp:9 +#: Template/TransactionSendCoins/edit.ctp:9 +#: Template/TransactionSendCoins/index.ctp:9 +#: Template/TransactionSendCoins/index.ctp:27 +#: Template/TransactionSendCoins/view.ctp:9 +#: Template/TransactionSignatures/add.ctp:9 +#: Template/TransactionSignatures/edit.ctp:9 +#: Template/TransactionSignatures/index.ctp:9 +#: Template/TransactionSignatures/index.ctp:22 +#: Template/TransactionSignatures/view.ctp:9 +#: Template/TransactionTypes/add.ctp:9 Template/TransactionTypes/edit.ctp:9 +#: Template/TransactionTypes/index.ctp:9 Template/TransactionTypes/index.ctp:23 +#: Template/TransactionTypes/view.ctp:9 Template/TransactionTypes/view.ctp:44 +#: Template/Transactions/add.ctp:9 Template/Transactions/edit.ctp:9 +#: Template/Transactions/index.ctp:9 Template/Transactions/index.ctp:40 +#: Template/Transactions/view.ctp:9 Template/Transactions/view.ctp:66 +#: Template/Transactions/view.ctp:97 Template/Transactions/view.ctp:125 +#: Template/Transactions/view.ctp:152 Template/Transactions/view.ctp:180 +#: Template/Transactions/view.ctp:211 Template/Transactions/view.ctp:241 +msgid "Actions" +msgstr "" + +#: Template/AddressTypes/add.ctp:10 Template/AddressTypes/edit.ctp:16 +#: Template/AddressTypes/view.ctp:12 Template/StateGroupAddresses/add.ctp:13 +#: Template/StateGroupAddresses/edit.ctp:19 +#: Template/StateGroupAddresses/index.ctp:13 +#: Template/StateGroupAddresses/view.ctp:16 +#: Template/TransactionGroupAddaddress/add.ctp:13 +#: Template/TransactionGroupAddaddress/edit.ctp:19 +#: Template/TransactionGroupAddaddress/index.ctp:13 +#: Template/TransactionGroupAddaddress/view.ctp:16 +msgid "List Address Types" +msgstr "" + +#: Template/AddressTypes/add.ctp:11 Template/AddressTypes/edit.ctp:17 +#: Template/AddressTypes/index.ctp:11 Template/AddressTypes/view.ctp:14 +#: Template/StateGroupAddresses/add.ctp:10 +#: Template/StateGroupAddresses/edit.ctp:16 +#: Template/StateGroupAddresses/view.ctp:12 Template/StateGroups/add.ctp:11 +#: Template/StateGroups/edit.ctp:17 Template/StateGroups/index.ctp:11 +#: Template/StateGroups/view.ctp:14 +msgid "List State Group Addresses" +msgstr "" + +#: Template/AddressTypes/add.ctp:12 Template/AddressTypes/edit.ctp:18 +#: Template/AddressTypes/index.ctp:12 Template/AddressTypes/view.ctp:15 +#: Template/StateGroupAddresses/index.ctp:10 +#: Template/StateGroupAddresses/view.ctp:13 Template/StateGroups/add.ctp:12 +#: Template/StateGroups/edit.ctp:18 Template/StateGroups/index.ctp:12 +#: Template/StateGroups/view.ctp:15 +msgid "New State Group Address" +msgstr "" + +#: Template/AddressTypes/add.ctp:13 Template/AddressTypes/edit.ctp:19 +#: Template/AddressTypes/index.ctp:13 Template/AddressTypes/view.ctp:16 +#: Template/TransactionGroupAddaddress/add.ctp:10 +#: Template/TransactionGroupAddaddress/edit.ctp:16 +#: Template/TransactionGroupAddaddress/view.ctp:12 +#: Template/Transactions/add.ctp:19 Template/Transactions/edit.ctp:25 +#: Template/Transactions/index.ctp:19 Template/Transactions/view.ctp:22 +msgid "List Transaction Group Addaddress" +msgstr "" + +#: Template/AddressTypes/add.ctp:14 Template/AddressTypes/edit.ctp:20 +#: Template/AddressTypes/index.ctp:14 Template/AddressTypes/view.ctp:17 +#: Template/TransactionGroupAddaddress/index.ctp:10 +#: Template/TransactionGroupAddaddress/view.ctp:13 +#: Template/Transactions/add.ctp:20 Template/Transactions/edit.ctp:26 +#: Template/Transactions/index.ctp:20 Template/Transactions/view.ctp:23 +msgid "New Transaction Group Addaddres" +msgstr "" + +#: Template/AddressTypes/add.ctp:20 +msgid "Add Address Type" +msgstr "" + +#: Template/AddressTypes/add.ctp:26 Template/AddressTypes/edit.ctp:32 +#: Template/AdminErrors/add.ctp:28 Template/AdminErrors/edit.ctp:34 +#: Template/OperatorTypes/add.ctp:24 Template/OperatorTypes/edit.ctp:30 +#: Template/Operators/add.ctp:24 Template/Operators/edit.ctp:30 +#: Template/ServerUsers/add.ctp:24 Template/ServerUsers/edit.ctp:32 +#: Template/StateBalances/add.ctp:24 Template/StateBalances/edit.ctp:30 +#: Template/StateCreated/add.ctp:29 Template/StateCreated/edit.ctp:35 +#: Template/StateErrors/add.ctp:27 Template/StateErrors/edit.ctp:33 +#: Template/StateGroupAddresses/add.ctp:26 +#: Template/StateGroupAddresses/edit.ctp:32 +#: Template/StateGroupRelationships/add.ctp:23 +#: Template/StateGroupRelationships/edit.ctp:29 Template/StateGroups/add.ctp:30 +#: Template/StateGroups/edit.ctp:36 Template/StateRelationshipTypes/add.ctp:22 +#: Template/StateRelationshipTypes/edit.ctp:28 Template/StateUsers/add.ctp:32 +#: Template/StateUsers/edit.ctp:38 Template/TransactionCreations/add.ctp:27 +#: Template/TransactionCreations/edit.ctp:33 +#: Template/TransactionGroupAddaddress/add.ctp:26 +#: Template/TransactionGroupAddaddress/edit.ctp:32 +#: Template/TransactionGroupAllowtrades/add.ctp:25 +#: Template/TransactionGroupAllowtrades/edit.ctp:31 +#: Template/TransactionGroupCreates/add.ctp:27 +#: Template/TransactionGroupCreates/edit.ctp:33 +#: Template/TransactionSendCoins/add.ctp:28 +#: Template/TransactionSendCoins/edit.ctp:34 +#: Template/TransactionSignatures/add.ctp:23 +#: Template/TransactionSignatures/edit.ctp:29 +#: Template/TransactionTypes/add.ctp:24 Template/TransactionTypes/edit.ctp:30 +#: Template/Transactions/add.ctp:41 Template/Transactions/edit.ctp:47 +msgid "Submit" +msgstr "" + +#: Template/AddressTypes/edit.ctp:11 Template/AddressTypes/index.ctp:37 +#: Template/AddressTypes/view.ctp:56 Template/AddressTypes/view.ctp:83 +#: Template/AdminErrors/edit.ctp:11 Template/AdminErrors/index.ctp:45 +#: Template/OperatorTypes/edit.ctp:11 Template/OperatorTypes/index.ctp:35 +#: Template/OperatorTypes/view.ctp:54 Template/Operators/edit.ctp:11 +#: Template/Operators/index.ctp:40 Template/ServerUsers/edit.ctp:11 +#: Template/ServerUsers/index.ctp:43 Template/StateBalances/edit.ctp:11 +#: Template/StateBalances/index.ctp:37 Template/StateCreated/edit.ctp:11 +#: Template/StateCreated/index.ctp:45 Template/StateErrors/edit.ctp:11 +#: Template/StateErrors/index.ctp:39 Template/StateErrors/show_for_user.ctp:43 +#: Template/StateGroupAddresses/edit.ctp:11 +#: Template/StateGroupAddresses/index.ctp:37 +#: Template/StateGroupRelationships/edit.ctp:11 +#: Template/StateGroupRelationships/index.ctp:35 +#: Template/StateGroups/edit.ctp:11 Template/StateGroups/index.ctp:41 +#: Template/StateGroups/view.ctp:60 Template/StateGroups/view.ctp:87 +#: Template/StateGroups/view.ctp:116 Template/StateGroups/view.ctp:145 +#: Template/StateRelationshipTypes/edit.ctp:11 +#: Template/StateRelationshipTypes/index.ctp:33 Template/StateUsers/edit.ctp:11 +#: Template/StateUsers/index.ctp:49 Template/StateUsers/view.ctp:62 +#: Template/StateUsers/view.ctp:95 Template/StateUsers/view.ctp:124 +#: Template/StateUsers/view.ctp:157 Template/TransactionCreations/edit.ctp:11 +#: Template/TransactionCreations/index.ctp:39 +#: Template/TransactionGroupAddaddress/edit.ctp:11 +#: Template/TransactionGroupAddaddress/index.ctp:37 +#: Template/TransactionGroupAllowtrades/edit.ctp:11 +#: Template/TransactionGroupAllowtrades/index.ctp:37 +#: Template/TransactionGroupCreates/edit.ctp:11 +#: Template/TransactionGroupCreates/index.ctp:39 +#: Template/TransactionSendCoins/edit.ctp:11 +#: Template/TransactionSendCoins/index.ctp:41 +#: Template/TransactionSignatures/edit.ctp:11 +#: Template/TransactionSignatures/index.ctp:33 +#: Template/TransactionTypes/edit.ctp:11 Template/TransactionTypes/index.ctp:35 +#: Template/TransactionTypes/view.ctp:56 Template/Transactions/edit.ctp:11 +#: Template/Transactions/index.ctp:53 Template/Transactions/view.ctp:80 +#: Template/Transactions/view.ctp:109 Template/Transactions/view.ctp:136 +#: Template/Transactions/view.ctp:163 Template/Transactions/view.ctp:192 +#: Template/Transactions/view.ctp:225 Template/Transactions/view.ctp:252 +msgid "Delete" +msgstr "" + +#: Template/AddressTypes/edit.ctp:13 Template/AddressTypes/index.ctp:37 +#: Template/AddressTypes/view.ctp:11 Template/AddressTypes/view.ctp:56 +#: Template/AddressTypes/view.ctp:83 Template/AdminErrors/edit.ctp:13 +#: Template/AdminErrors/index.ctp:45 Template/AdminErrors/view.ctp:11 +#: Template/OperatorTypes/edit.ctp:13 Template/OperatorTypes/index.ctp:35 +#: Template/OperatorTypes/view.ctp:11 Template/OperatorTypes/view.ctp:54 +#: Template/Operators/edit.ctp:13 Template/Operators/index.ctp:40 +#: Template/Operators/view.ctp:11 Template/ServerUsers/edit.ctp:13 +#: Template/ServerUsers/index.ctp:43 Template/ServerUsers/view.ctp:11 +#: Template/StateBalances/edit.ctp:13 Template/StateBalances/index.ctp:37 +#: Template/StateBalances/view.ctp:11 Template/StateCreated/edit.ctp:13 +#: Template/StateCreated/index.ctp:45 Template/StateCreated/view.ctp:11 +#: Template/StateErrors/edit.ctp:13 Template/StateErrors/index.ctp:39 +#: Template/StateErrors/view.ctp:11 Template/StateGroupAddresses/edit.ctp:13 +#: Template/StateGroupAddresses/index.ctp:37 +#: Template/StateGroupAddresses/view.ctp:11 +#: Template/StateGroupRelationships/edit.ctp:13 +#: Template/StateGroupRelationships/index.ctp:35 +#: Template/StateGroupRelationships/view.ctp:11 +#: Template/StateGroups/edit.ctp:13 Template/StateGroups/index.ctp:41 +#: Template/StateGroups/view.ctp:11 Template/StateGroups/view.ctp:60 +#: Template/StateGroups/view.ctp:87 Template/StateGroups/view.ctp:116 +#: Template/StateGroups/view.ctp:145 +#: Template/StateRelationshipTypes/edit.ctp:13 +#: Template/StateRelationshipTypes/index.ctp:33 +#: Template/StateRelationshipTypes/view.ctp:11 Template/StateUsers/edit.ctp:13 +#: Template/StateUsers/index.ctp:49 Template/StateUsers/view.ctp:11 +#: Template/StateUsers/view.ctp:62 Template/StateUsers/view.ctp:95 +#: Template/StateUsers/view.ctp:124 Template/StateUsers/view.ctp:157 +#: Template/TransactionCreations/edit.ctp:13 +#: Template/TransactionCreations/index.ctp:39 +#: Template/TransactionCreations/view.ctp:11 +#: Template/TransactionGroupAddaddress/edit.ctp:13 +#: Template/TransactionGroupAddaddress/index.ctp:37 +#: Template/TransactionGroupAddaddress/view.ctp:11 +#: Template/TransactionGroupAllowtrades/edit.ctp:13 +#: Template/TransactionGroupAllowtrades/index.ctp:37 +#: Template/TransactionGroupAllowtrades/view.ctp:11 +#: Template/TransactionGroupCreates/edit.ctp:13 +#: Template/TransactionGroupCreates/index.ctp:39 +#: Template/TransactionGroupCreates/view.ctp:11 +#: Template/TransactionSendCoins/edit.ctp:13 +#: Template/TransactionSendCoins/index.ctp:41 +#: Template/TransactionSendCoins/view.ctp:11 +#: Template/TransactionSignatures/edit.ctp:13 +#: Template/TransactionSignatures/index.ctp:33 +#: Template/TransactionSignatures/view.ctp:11 +#: Template/TransactionTypes/edit.ctp:13 Template/TransactionTypes/index.ctp:35 +#: Template/TransactionTypes/view.ctp:11 Template/TransactionTypes/view.ctp:56 +#: Template/Transactions/edit.ctp:13 Template/Transactions/index.ctp:53 +#: Template/Transactions/view.ctp:11 Template/Transactions/view.ctp:80 +#: Template/Transactions/view.ctp:109 Template/Transactions/view.ctp:136 +#: Template/Transactions/view.ctp:163 Template/Transactions/view.ctp:192 +#: Template/Transactions/view.ctp:225 Template/Transactions/view.ctp:252 +msgid "Are you sure you want to delete # {0}?" +msgstr "" + +#: Template/AddressTypes/edit.ctp:26 Template/AddressTypes/view.ctp:10 +msgid "Edit Address Type" +msgstr "" + +#: Template/AddressTypes/index.ctp:10 Template/AddressTypes/view.ctp:13 +#: Template/StateGroupAddresses/add.ctp:14 +#: Template/StateGroupAddresses/edit.ctp:20 +#: Template/StateGroupAddresses/index.ctp:14 +#: Template/StateGroupAddresses/view.ctp:17 +#: Template/TransactionGroupAddaddress/add.ctp:14 +#: Template/TransactionGroupAddaddress/edit.ctp:20 +#: Template/TransactionGroupAddaddress/index.ctp:14 +#: Template/TransactionGroupAddaddress/view.ctp:17 +msgid "New Address Type" +msgstr "" + +#: Template/AddressTypes/index.ctp:18 +msgid "Address Types" +msgstr "" + +#: Template/AddressTypes/index.ctp:35 Template/AddressTypes/view.ctp:54 +#: Template/AddressTypes/view.ctp:81 Template/AdminErrors/index.ctp:43 +#: Template/OperatorTypes/index.ctp:33 Template/OperatorTypes/view.ctp:52 +#: Template/Operators/index.ctp:38 Template/ServerUsers/index.ctp:41 +#: Template/StateBalances/index.ctp:35 Template/StateCreated/index.ctp:43 +#: Template/StateErrors/index.ctp:37 Template/StateGroupAddresses/index.ctp:35 +#: Template/StateGroupRelationships/index.ctp:33 +#: Template/StateGroups/index.ctp:39 Template/StateGroups/view.ctp:58 +#: Template/StateGroups/view.ctp:85 Template/StateGroups/view.ctp:114 +#: Template/StateGroups/view.ctp:143 +#: Template/StateRelationshipTypes/index.ctp:31 +#: Template/StateUsers/index.ctp:47 Template/StateUsers/view.ctp:60 +#: Template/StateUsers/view.ctp:93 Template/StateUsers/view.ctp:122 +#: Template/StateUsers/view.ctp:155 Template/TransactionCreations/index.ctp:37 +#: Template/TransactionGroupAddaddress/index.ctp:35 +#: Template/TransactionGroupAllowtrades/index.ctp:35 +#: Template/TransactionGroupCreates/index.ctp:37 +#: Template/TransactionSendCoins/index.ctp:39 +#: Template/TransactionSignatures/index.ctp:31 +#: Template/TransactionTypes/index.ctp:33 Template/TransactionTypes/view.ctp:54 +#: Template/Transactions/index.ctp:51 Template/Transactions/view.ctp:78 +#: Template/Transactions/view.ctp:107 Template/Transactions/view.ctp:134 +#: Template/Transactions/view.ctp:161 Template/Transactions/view.ctp:190 +#: Template/Transactions/view.ctp:223 Template/Transactions/view.ctp:250 +msgid "View" +msgstr "" + +#: Template/AddressTypes/index.ctp:36 Template/AddressTypes/view.ctp:55 +#: Template/AddressTypes/view.ctp:82 Template/AdminErrors/index.ctp:44 +#: Template/OperatorTypes/index.ctp:34 Template/OperatorTypes/view.ctp:53 +#: Template/Operators/index.ctp:39 Template/ServerUsers/index.ctp:42 +#: Template/StateBalances/index.ctp:36 Template/StateCreated/index.ctp:44 +#: Template/StateErrors/index.ctp:38 Template/StateGroupAddresses/index.ctp:36 +#: Template/StateGroupRelationships/index.ctp:34 +#: Template/StateGroups/index.ctp:40 Template/StateGroups/view.ctp:59 +#: Template/StateGroups/view.ctp:86 Template/StateGroups/view.ctp:115 +#: Template/StateGroups/view.ctp:144 +#: Template/StateRelationshipTypes/index.ctp:32 +#: Template/StateUsers/index.ctp:48 Template/StateUsers/view.ctp:61 +#: Template/StateUsers/view.ctp:94 Template/StateUsers/view.ctp:123 +#: Template/StateUsers/view.ctp:156 Template/TransactionCreations/index.ctp:38 +#: Template/TransactionGroupAddaddress/index.ctp:36 +#: Template/TransactionGroupAllowtrades/index.ctp:36 +#: Template/TransactionGroupCreates/index.ctp:38 +#: Template/TransactionSendCoins/index.ctp:40 +#: Template/TransactionSignatures/index.ctp:32 +#: Template/TransactionTypes/index.ctp:34 Template/TransactionTypes/view.ctp:55 +#: Template/Transactions/index.ctp:52 Template/Transactions/view.ctp:79 +#: Template/Transactions/view.ctp:108 Template/Transactions/view.ctp:135 +#: Template/Transactions/view.ctp:162 Template/Transactions/view.ctp:191 +#: Template/Transactions/view.ctp:224 Template/Transactions/view.ctp:251 +msgid "Edit" +msgstr "" + +#: Template/AddressTypes/index.ctp:45 Template/AdminErrors/index.ctp:53 +#: Template/OperatorTypes/index.ctp:43 Template/Operators/index.ctp:48 +#: Template/ServerUsers/index.ctp:51 Template/StateBalances/index.ctp:45 +#: Template/StateCreated/index.ctp:53 Template/StateErrors/index.ctp:47 +#: Template/StateGroupAddresses/index.ctp:45 +#: Template/StateGroupRelationships/index.ctp:43 +#: Template/StateGroups/index.ctp:49 +#: Template/StateRelationshipTypes/index.ctp:41 +#: Template/StateUsers/index.ctp:57 Template/TransactionCreations/index.ctp:47 +#: Template/TransactionGroupAddaddress/index.ctp:45 +#: Template/TransactionGroupAllowtrades/index.ctp:45 +#: Template/TransactionGroupCreates/index.ctp:47 +#: Template/TransactionSendCoins/index.ctp:49 +#: Template/TransactionSignatures/index.ctp:41 +#: Template/TransactionTypes/index.ctp:43 Template/Transactions/index.ctp:61 +msgid "first" +msgstr "" + +#: Template/AddressTypes/index.ctp:46 Template/AdminErrors/index.ctp:54 +#: Template/OperatorTypes/index.ctp:44 Template/Operators/index.ctp:49 +#: Template/ServerUsers/index.ctp:52 Template/StateBalances/index.ctp:46 +#: Template/StateCreated/index.ctp:54 Template/StateErrors/index.ctp:48 +#: Template/StateGroupAddresses/index.ctp:46 +#: Template/StateGroupRelationships/index.ctp:44 +#: Template/StateGroups/index.ctp:50 +#: Template/StateRelationshipTypes/index.ctp:42 +#: Template/StateUsers/index.ctp:58 Template/TransactionCreations/index.ctp:48 +#: Template/TransactionGroupAddaddress/index.ctp:46 +#: Template/TransactionGroupAllowtrades/index.ctp:46 +#: Template/TransactionGroupCreates/index.ctp:48 +#: Template/TransactionSendCoins/index.ctp:50 +#: Template/TransactionSignatures/index.ctp:42 +#: Template/TransactionTypes/index.ctp:44 Template/Transactions/index.ctp:62 +msgid "previous" +msgstr "" + +#: Template/AddressTypes/index.ctp:48 Template/AdminErrors/index.ctp:56 +#: Template/OperatorTypes/index.ctp:46 Template/Operators/index.ctp:51 +#: Template/ServerUsers/index.ctp:54 Template/StateBalances/index.ctp:48 +#: Template/StateCreated/index.ctp:56 Template/StateErrors/index.ctp:50 +#: Template/StateGroupAddresses/index.ctp:48 +#: Template/StateGroupRelationships/index.ctp:46 +#: Template/StateGroups/index.ctp:52 +#: Template/StateRelationshipTypes/index.ctp:44 +#: Template/StateUsers/index.ctp:60 Template/TransactionCreations/index.ctp:50 +#: Template/TransactionGroupAddaddress/index.ctp:48 +#: Template/TransactionGroupAllowtrades/index.ctp:48 +#: Template/TransactionGroupCreates/index.ctp:50 +#: Template/TransactionSendCoins/index.ctp:52 +#: Template/TransactionSignatures/index.ctp:44 +#: Template/TransactionTypes/index.ctp:46 Template/Transactions/index.ctp:64 +msgid "next" +msgstr "" + +#: Template/AddressTypes/index.ctp:49 Template/AdminErrors/index.ctp:57 +#: Template/OperatorTypes/index.ctp:47 Template/Operators/index.ctp:52 +#: Template/ServerUsers/index.ctp:55 Template/StateBalances/index.ctp:49 +#: Template/StateCreated/index.ctp:57 Template/StateErrors/index.ctp:51 +#: Template/StateGroupAddresses/index.ctp:49 +#: Template/StateGroupRelationships/index.ctp:47 +#: Template/StateGroups/index.ctp:53 +#: Template/StateRelationshipTypes/index.ctp:45 +#: Template/StateUsers/index.ctp:61 Template/TransactionCreations/index.ctp:51 +#: Template/TransactionGroupAddaddress/index.ctp:49 +#: Template/TransactionGroupAllowtrades/index.ctp:49 +#: Template/TransactionGroupCreates/index.ctp:51 +#: Template/TransactionSendCoins/index.ctp:53 +#: Template/TransactionSignatures/index.ctp:45 +#: Template/TransactionTypes/index.ctp:47 Template/Transactions/index.ctp:65 +msgid "last" +msgstr "" + +#: Template/AddressTypes/index.ctp:51 Template/AdminErrors/index.ctp:59 +#: Template/OperatorTypes/index.ctp:49 Template/Operators/index.ctp:54 +#: Template/ServerUsers/index.ctp:57 Template/StateBalances/index.ctp:51 +#: Template/StateCreated/index.ctp:59 Template/StateErrors/index.ctp:53 +#: Template/StateGroupAddresses/index.ctp:51 +#: Template/StateGroupRelationships/index.ctp:49 +#: Template/StateGroups/index.ctp:55 +#: Template/StateRelationshipTypes/index.ctp:47 +#: Template/StateUsers/index.ctp:63 Template/TransactionCreations/index.ctp:53 +#: Template/TransactionGroupAddaddress/index.ctp:51 +#: Template/TransactionGroupAllowtrades/index.ctp:51 +#: Template/TransactionGroupCreates/index.ctp:53 +#: Template/TransactionSendCoins/index.ctp:55 +#: Template/TransactionSignatures/index.ctp:47 +#: Template/TransactionTypes/index.ctp:49 Template/Transactions/index.ctp:67 +msgid "" +"Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} " +"total" +msgstr "" + +#: Template/AddressTypes/view.ctp:11 +msgid "Delete Address Type" +msgstr "" + +#: Template/AddressTypes/view.ctp:24 Template/OperatorTypes/view.ctp:22 +#: Template/StateGroups/view.ctp:28 Template/StateGroups/view.ctp:103 +#: Template/StateRelationshipTypes/view.ctp:20 +#: Template/TransactionGroupCreates/view.ctp:32 +#: Template/TransactionTypes/view.ctp:22 Template/Transactions/view.ctp:179 +msgid "Name" +msgstr "" + +#: Template/AddressTypes/view.ctp:28 Template/OperatorTypes/view.ctp:26 +#: Template/StateRelationshipTypes/view.ctp:24 +#: Template/TransactionTypes/view.ctp:26 +msgid "Text" +msgstr "" + +#: Template/AddressTypes/view.ctp:32 Template/AddressTypes/view.ctp:41 +#: Template/AddressTypes/view.ctp:68 Template/AdminErrors/view.ctp:46 +#: Template/OperatorTypes/view.ctp:30 Template/OperatorTypes/view.ctp:39 +#: Template/Operators/view.ctp:32 Template/ServerUsers/view.ctp:36 +#: Template/StateBalances/view.ctp:26 Template/StateCreated/view.ctp:32 +#: Template/StateErrors/view.ctp:32 Template/StateGroupAddresses/view.ctp:32 +#: Template/StateGroupRelationships/view.ctp:20 +#: Template/StateGroups/view.ctp:32 Template/StateGroups/view.ctp:45 +#: Template/StateGroups/view.ctp:72 Template/StateGroups/view.ctp:99 +#: Template/StateGroups/view.ctp:128 +#: Template/StateRelationshipTypes/view.ctp:28 Template/StateUsers/view.ctp:34 +#: Template/StateUsers/view.ctp:47 Template/StateUsers/view.ctp:74 +#: Template/StateUsers/view.ctp:107 Template/StateUsers/view.ctp:136 +#: Template/TransactionCreations/view.ctp:32 +#: Template/TransactionGroupAddaddress/view.ctp:32 +#: Template/TransactionGroupAllowtrades/view.ctp:26 +#: Template/TransactionGroupCreates/view.ctp:36 +#: Template/TransactionSendCoins/view.ctp:32 +#: Template/TransactionSignatures/view.ctp:26 +#: Template/TransactionTypes/view.ctp:30 Template/TransactionTypes/view.ctp:39 +#: Template/Transactions/view.ctp:46 Template/Transactions/view.ctp:59 +#: Template/Transactions/view.ctp:92 Template/Transactions/view.ctp:121 +#: Template/Transactions/view.ctp:148 Template/Transactions/view.ctp:175 +#: Template/Transactions/view.ctp:204 Template/Transactions/view.ctp:237 +msgid "Id" +msgstr "" + +#: Template/AddressTypes/view.ctp:37 Template/StateGroups/view.ctp:41 +msgid "Related State Group Addresses" +msgstr "" + +#: Template/AddressTypes/view.ctp:42 Template/StateGroups/view.ctp:46 +#: Template/StateGroups/view.ctp:74 Template/StateGroups/view.ctp:102 +#: Template/StateGroups/view.ctp:129 Template/TransactionTypes/view.ctp:40 +#: Template/Transactions/view.ctp:178 +msgid "State Group Id" +msgstr "" + +#: Template/AddressTypes/view.ctp:43 Template/AddressTypes/view.ctp:71 +#: Template/StateGroups/view.ctp:47 Template/StateGroups/view.ctp:75 +#: Template/Transactions/view.ctp:124 +msgid "Public Key" +msgstr "" + +#: Template/AddressTypes/view.ctp:44 Template/AddressTypes/view.ctp:70 +#: Template/StateGroups/view.ctp:48 Template/Transactions/view.ctp:123 +msgid "Address Type Id" +msgstr "" + +#: Template/AddressTypes/view.ctp:64 Template/Transactions/view.ctp:117 +msgid "Related Transaction Group Addaddress" +msgstr "" + +#: Template/AddressTypes/view.ctp:69 Template/StateGroups/view.ctp:100 +#: Template/StateUsers/view.ctp:75 Template/StateUsers/view.ctp:108 +#: Template/StateUsers/view.ctp:137 Template/Transactions/view.ctp:60 +#: Template/Transactions/view.ctp:93 Template/Transactions/view.ctp:122 +#: Template/Transactions/view.ctp:149 Template/Transactions/view.ctp:176 +#: Template/Transactions/view.ctp:205 Template/Transactions/view.ctp:238 +msgid "Transaction Id" +msgstr "" + +#: Template/AdminErrors/add.ctp:10 Template/AdminErrors/edit.ctp:16 +#: Template/AdminErrors/view.ctp:12 +msgid "List Admin Errors" +msgstr "" + +#: Template/AdminErrors/add.ctp:11 Template/AdminErrors/edit.ctp:17 +#: Template/AdminErrors/index.ctp:11 Template/AdminErrors/view.ctp:14 +#: Template/StateBalances/add.ctp:11 Template/StateBalances/edit.ctp:17 +#: Template/StateBalances/index.ctp:11 Template/StateBalances/view.ctp:14 +#: Template/StateCreated/add.ctp:13 Template/StateCreated/edit.ctp:19 +#: Template/StateCreated/index.ctp:13 Template/StateCreated/view.ctp:16 +#: Template/StateErrors/add.ctp:11 Template/StateErrors/edit.ctp:17 +#: Template/StateErrors/index.ctp:11 Template/StateErrors/view.ctp:14 +#: Template/StateGroups/add.ctp:13 Template/StateGroups/edit.ctp:19 +#: Template/StateGroups/index.ctp:13 Template/StateGroups/view.ctp:16 +#: Template/StateUsers/add.ctp:10 Template/StateUsers/edit.ctp:16 +#: Template/StateUsers/view.ctp:12 Template/TransactionCreations/add.ctp:13 +#: Template/TransactionCreations/edit.ctp:19 +#: Template/TransactionCreations/index.ctp:13 +#: Template/TransactionCreations/view.ctp:16 +#: Template/TransactionSendCoins/add.ctp:13 +#: Template/TransactionSendCoins/edit.ctp:19 +#: Template/TransactionSendCoins/index.ctp:13 +#: Template/TransactionSendCoins/view.ctp:16 +msgid "List State Users" +msgstr "" + +#: Template/AdminErrors/add.ctp:12 Template/AdminErrors/edit.ctp:18 +#: Template/AdminErrors/index.ctp:12 Template/AdminErrors/view.ctp:15 +#: Template/StateBalances/add.ctp:12 Template/StateBalances/edit.ctp:18 +#: Template/StateBalances/index.ctp:12 Template/StateBalances/view.ctp:15 +#: Template/StateCreated/add.ctp:14 Template/StateCreated/edit.ctp:20 +#: Template/StateCreated/index.ctp:14 Template/StateCreated/view.ctp:17 +#: Template/StateErrors/add.ctp:12 Template/StateErrors/edit.ctp:18 +#: Template/StateErrors/index.ctp:12 Template/StateErrors/view.ctp:15 +#: Template/StateGroups/add.ctp:14 Template/StateGroups/edit.ctp:20 +#: Template/StateGroups/index.ctp:14 Template/StateGroups/view.ctp:17 +#: Template/StateUsers/index.ctp:10 Template/StateUsers/view.ctp:13 +#: Template/TransactionCreations/add.ctp:14 +#: Template/TransactionCreations/edit.ctp:20 +#: Template/TransactionCreations/index.ctp:14 +#: Template/TransactionCreations/view.ctp:17 +#: Template/TransactionSendCoins/add.ctp:14 +#: Template/TransactionSendCoins/edit.ctp:20 +#: Template/TransactionSendCoins/index.ctp:14 +#: Template/TransactionSendCoins/view.ctp:17 +msgid "New State User" +msgstr "" + +#: Template/AdminErrors/add.ctp:18 +msgid "Add Admin Error" +msgstr "" + +#: Template/AdminErrors/edit.ctp:24 Template/AdminErrors/view.ctp:10 +msgid "Edit Admin Error" +msgstr "" + +#: Template/AdminErrors/index.ctp:10 Template/AdminErrors/view.ctp:13 +msgid "New Admin Error" +msgstr "" + +#: Template/AdminErrors/index.ctp:16 +msgid "Admin Errors" +msgstr "" + +#: Template/AdminErrors/view.ctp:11 +msgid "Delete Admin Error" +msgstr "" + +#: Template/AdminErrors/view.ctp:22 Template/StateBalances/view.ctp:22 +#: Template/StateCreated/view.ctp:28 Template/StateErrors/view.ctp:24 +#: Template/TransactionCreations/view.ctp:28 +#: Template/TransactionSendCoins/view.ctp:28 +msgid "State User" +msgstr "" + +#: Template/AdminErrors/view.ctp:26 +msgid "Controller" +msgstr "" + +#: Template/AdminErrors/view.ctp:30 +msgid "Action" +msgstr "" + +#: Template/AdminErrors/view.ctp:34 +msgid "State" +msgstr "" + +#: Template/AdminErrors/view.ctp:38 +msgid "Msg" +msgstr "" + +#: Template/AdminErrors/view.ctp:42 +msgid "Details" +msgstr "" + +#: Template/AdminErrors/view.ctp:50 Template/ServerUsers/view.ctp:44 +#: Template/StateCreated/view.ctp:48 Template/StateErrors/view.ctp:36 +#: Template/StateUsers/view.ctp:79 Template/Transactions/view.ctp:64 +msgid "Created" +msgstr "" + +#: Template/Dashboard/error_http_request.ctp:9 +msgid "Error, Please try again" +msgstr "" + +#: Template/Dashboard/error_http_request.ctp:13 Template/Layout/error.ctp:43 +msgid "Back" +msgstr "" + +#: Template/Dashboard/index.ctp:12 Template/Dashboard/server_index.ctp:9 +msgid "Willkommen" +msgstr "" + +#: Template/Dashboard/index.ctp:22 +msgid "übersicht" +msgstr "" + +#: Template/Dashboard/index.ctp:27 +msgid "überweisen" +msgstr "" + +#: Template/Dashboard/index.ctp:34 +msgid "löschen" +msgstr "" + +#: Template/Dashboard/index.ctp:40 Template/Dashboard/server_index.ctp:16 +msgid "einzeln schöpfen" +msgstr "" + +#: Template/Dashboard/index.ctp:45 Template/Dashboard/server_index.ctp:21 +msgid "viele schöpfen" +msgstr "" + +#: Template/Dashboard/index.ctp:51 Template/Dashboard/server_index.ctp:27 +#: Template/Element/navi_header.ctp:33 +msgid "Fehler" +msgstr "" + +#: Template/Dashboard/index.ctp:59 Template/StateUsers/search.ctp:9 +msgid "Benutzer suchen" +msgstr "" + +#: Template/Element/navi.ctp:25 Template/StateBalances/overview.ctp:8 +msgid "Kontoübersicht" +msgstr "" + +#: Template/Element/navi.ctp:35 Template/Layout/frontend.ctp:69 +#: Template/Layout/frontend_ripple.ctp:105 +msgid "Startseite" +msgstr "" + +#: Template/Element/navi.ctp:36 Template/TransactionSendCoins/create.ctp:9 +msgid "Überweisung" +msgstr "" + +#: Template/Element/navi.ctp:44 +msgid "Abmelden" +msgstr "" + +#: Template/Element/navi_header.ctp:38 +msgid "Transaktionen sind noch zu unterzeichnen" +msgstr "" + +#: Template/Element/Flash/success.ctp:9 +msgid "Info:" +msgstr "" + +#: Template/Layout/default.ctp:45 Template/Layout/frontend.ctp:78 +msgid "Logout" +msgstr "" + +#: Template/Layout/error.ctp:35 Template/Error/error400.ctp:36 +#: Template/Error/error500.ctp:41 +msgid "Error" +msgstr "" + +#: Template/Layout/frontend.ctp:60 +msgid "Fehler " +msgstr "" + +#: Template/Layout/frontend.ctp:70 +msgid "Kontostand" +msgstr "" + +#: Template/Layout/frontend.ctp:74 +msgid "Transaktionen unterzeichnen" +msgstr "" + +#: Template/Layout/frontend_ripple.ctp:44 +msgid "Community Server in Entwicklung" +msgstr "" + +#: Template/OperatorTypes/add.ctp:10 Template/OperatorTypes/edit.ctp:16 +#: Template/OperatorTypes/view.ctp:12 +msgid "List Operator Types" +msgstr "" + +#: Template/OperatorTypes/add.ctp:11 Template/OperatorTypes/edit.ctp:17 +#: Template/OperatorTypes/index.ctp:11 Template/OperatorTypes/view.ctp:14 +#: Template/Operators/add.ctp:10 Template/Operators/edit.ctp:16 +#: Template/Operators/view.ctp:12 +msgid "List Operators" +msgstr "" + +#: Template/OperatorTypes/add.ctp:12 Template/OperatorTypes/edit.ctp:18 +#: Template/OperatorTypes/index.ctp:12 Template/OperatorTypes/view.ctp:15 +#: Template/Operators/index.ctp:10 Template/Operators/view.ctp:13 +msgid "New Operator" +msgstr "" + +#: Template/OperatorTypes/add.ctp:18 +msgid "Add Operator Type" +msgstr "" + +#: Template/OperatorTypes/edit.ctp:24 Template/OperatorTypes/view.ctp:10 +msgid "Edit Operator Type" +msgstr "" + +#: Template/OperatorTypes/index.ctp:10 Template/OperatorTypes/view.ctp:13 +msgid "New Operator Type" +msgstr "" + +#: Template/OperatorTypes/index.ctp:16 +msgid "Operator Types" +msgstr "" + +#: Template/OperatorTypes/view.ctp:11 +msgid "Delete Operator Type" +msgstr "" + +#: Template/OperatorTypes/view.ctp:35 +msgid "Related Operators" +msgstr "" + +#: Template/OperatorTypes/view.ctp:40 Template/Operators/view.ctp:20 +#: Template/ServerUsers/view.ctp:20 +msgid "Username" +msgstr "" + +#: Template/OperatorTypes/view.ctp:41 Template/Operators/view.ctp:36 +msgid "Operator Type Id" +msgstr "" + +#: Template/OperatorTypes/view.ctp:42 Template/Operators/view.ctp:28 +msgid "Data Base64" +msgstr "" + +#: Template/Operators/add.ctp:16 +msgid "Add Operator" +msgstr "" + +#: Template/Operators/edit.ctp:22 Template/Operators/view.ctp:10 +msgid "Edit Operator" +msgstr "" + +#: Template/Operators/index.ctp:14 +msgid "Operators" +msgstr "" + +#: Template/Operators/view.ctp:11 +msgid "Delete Operator" +msgstr "" + +#: Template/Operators/view.ctp:24 +msgid "User Pubkey" +msgstr "" + +#: Template/ServerUsers/add.ctp:10 Template/ServerUsers/edit.ctp:16 +#: Template/ServerUsers/view.ctp:12 +msgid "List Server Users" +msgstr "" + +#: Template/ServerUsers/add.ctp:16 +msgid "Add Server User" +msgstr "" + +#: Template/ServerUsers/edit.ctp:22 Template/ServerUsers/view.ctp:10 +msgid "Edit Server User" +msgstr "" + +#: Template/ServerUsers/index.ctp:10 Template/ServerUsers/view.ctp:13 +msgid "New Server User" +msgstr "" + +#: Template/ServerUsers/index.ctp:14 +msgid "Server Users" +msgstr "" + +#: Template/ServerUsers/login.ctp:13 +msgid "Please enter your username and password" +msgstr "" + +#: Template/ServerUsers/login.ctp:17 +msgid "Login" +msgstr "" + +#: Template/ServerUsers/view.ctp:11 +msgid "Delete Server User" +msgstr "" + +#: Template/ServerUsers/view.ctp:24 +msgid "Password" +msgstr "" + +#: Template/ServerUsers/view.ctp:28 +msgid "Email" +msgstr "" + +#: Template/ServerUsers/view.ctp:32 +msgid "Role" +msgstr "" + +#: Template/ServerUsers/view.ctp:40 +msgid "Last Login" +msgstr "" + +#: Template/ServerUsers/view.ctp:48 Template/StateBalances/view.ctp:34 +#: Template/StateUsers/view.ctp:49 +msgid "Modified" +msgstr "" + +#: Template/ServerUsers/view.ctp:52 +msgid "Activated" +msgstr "" + +#: Template/ServerUsers/view.ctp:53 +#: Template/TransactionGroupAllowtrades/view.ctp:35 +msgid "Yes" +msgstr "" + +#: Template/ServerUsers/view.ctp:53 +#: Template/TransactionGroupAllowtrades/view.ctp:35 +msgid "No" +msgstr "" + +#: Template/StateBalances/add.ctp:10 Template/StateBalances/edit.ctp:16 +#: Template/StateBalances/view.ctp:12 Template/StateUsers/add.ctp:13 +#: Template/StateUsers/edit.ctp:19 Template/StateUsers/index.ctp:13 +#: Template/StateUsers/view.ctp:16 +msgid "List State Balances" +msgstr "" + +#: Template/StateBalances/add.ctp:18 +msgid "Add State Balance" +msgstr "" + +#: Template/StateBalances/edit.ctp:24 Template/StateBalances/view.ctp:10 +msgid "Edit State Balance" +msgstr "" + +#: Template/StateBalances/index.ctp:10 Template/StateBalances/view.ctp:13 +#: Template/StateUsers/add.ctp:14 Template/StateUsers/edit.ctp:20 +#: Template/StateUsers/index.ctp:14 Template/StateUsers/view.ctp:17 +msgid "New State Balance" +msgstr "" + +#: Template/StateBalances/index.ctp:16 +msgid "State Balances" +msgstr "" + +#: Template/StateBalances/overview.ctp:15 +msgid "Aktueller Kontostand: " +msgstr "" + +#: Template/StateBalances/overview.ctp:42 +msgid "Absender" +msgstr "" + +#: Template/StateBalances/overview.ctp:43 +#: Template/TransactionSendCoins/create.ctp:30 +msgid "Verwendungszweck" +msgstr "" + +#: Template/StateBalances/overview.ctp:44 +msgid "Datum" +msgstr "" + +#: Template/StateBalances/overview.ctp:45 +msgid "Betrag" +msgstr "" + +#: Template/StateBalances/overview.ctp:46 +msgid "Transaktions Nr." +msgstr "" + +#: Template/StateBalances/overview.ctp:46 +msgid "Nr" +msgstr "" + +#: Template/StateBalances/overview.ctp:79 +msgid "Geschöpft" +msgstr "" + +#: Template/StateBalances/overview.ctp:81 +msgid "Gesendet" +msgstr "" + +#: Template/StateBalances/overview.ctp:83 +msgid "Empfangen" +msgstr "" + +#: Template/StateBalances/overview.ctp:118 +#: Template/TransactionCreations/create_multi.ctp:167 +msgid "Laufende Transaktion" +msgstr "" + +#: Template/StateBalances/overview.ctp:120 +#: Template/TransactionCreations/create_multi.ctp:169 +msgid "Laufende Transaktionen" +msgstr "" + +#: Template/StateBalances/view.ctp:11 +msgid "Delete State Balance" +msgstr "" + +#: Template/StateBalances/view.ctp:30 Template/StateUsers/view.ctp:50 +#: Template/StateUsers/view.ctp:110 Template/StateUsers/view.ctp:141 +#: Template/TransactionCreations/view.ctp:36 +#: Template/TransactionSendCoins/view.ctp:36 Template/Transactions/view.ctp:95 +#: Template/Transactions/view.ctp:209 +msgid "Amount" +msgstr "" + +#: Template/StateCreated/add.ctp:10 Template/StateCreated/edit.ctp:16 +#: Template/StateCreated/view.ctp:12 Template/StateUsers/add.ctp:15 +#: Template/StateUsers/edit.ctp:21 Template/StateUsers/index.ctp:15 +#: Template/StateUsers/view.ctp:18 Template/Transactions/add.ctp:15 +#: Template/Transactions/edit.ctp:21 Template/Transactions/index.ctp:15 +#: Template/Transactions/view.ctp:18 +msgid "List State Created" +msgstr "" + +#: Template/StateCreated/add.ctp:11 Template/StateCreated/edit.ctp:17 +#: Template/StateCreated/index.ctp:11 Template/StateCreated/view.ctp:14 +#: Template/StateGroups/add.ctp:17 Template/StateGroups/edit.ctp:23 +#: Template/StateGroups/index.ctp:17 Template/StateGroups/view.ctp:20 +#: Template/TransactionCreations/add.ctp:11 +#: Template/TransactionCreations/edit.ctp:17 +#: Template/TransactionCreations/index.ctp:11 +#: Template/TransactionCreations/view.ctp:14 +#: Template/TransactionGroupAddaddress/add.ctp:11 +#: Template/TransactionGroupAddaddress/edit.ctp:17 +#: Template/TransactionGroupAddaddress/index.ctp:11 +#: Template/TransactionGroupAddaddress/view.ctp:14 +#: Template/TransactionGroupAllowtrades/add.ctp:11 +#: Template/TransactionGroupAllowtrades/edit.ctp:17 +#: Template/TransactionGroupAllowtrades/index.ctp:11 +#: Template/TransactionGroupAllowtrades/view.ctp:14 +#: Template/TransactionGroupCreates/add.ctp:11 +#: Template/TransactionGroupCreates/edit.ctp:17 +#: Template/TransactionGroupCreates/index.ctp:11 +#: Template/TransactionGroupCreates/view.ctp:14 +#: Template/TransactionSendCoins/add.ctp:11 +#: Template/TransactionSendCoins/edit.ctp:17 +#: Template/TransactionSendCoins/index.ctp:11 +#: Template/TransactionSendCoins/view.ctp:14 +#: Template/TransactionSignatures/add.ctp:11 +#: Template/TransactionSignatures/edit.ctp:17 +#: Template/TransactionSignatures/index.ctp:11 +#: Template/TransactionSignatures/view.ctp:14 +#: Template/TransactionTypes/add.ctp:11 Template/TransactionTypes/edit.ctp:17 +#: Template/TransactionTypes/index.ctp:11 Template/TransactionTypes/view.ctp:14 +#: Template/Transactions/add.ctp:10 Template/Transactions/edit.ctp:16 +#: Template/Transactions/view.ctp:12 +msgid "List Transactions" +msgstr "" + +#: Template/StateCreated/add.ctp:12 Template/StateCreated/edit.ctp:18 +#: Template/StateCreated/index.ctp:12 Template/StateCreated/view.ctp:15 +#: Template/StateGroups/add.ctp:18 Template/StateGroups/edit.ctp:24 +#: Template/StateGroups/index.ctp:18 Template/StateGroups/view.ctp:21 +#: Template/TransactionCreations/add.ctp:12 +#: Template/TransactionCreations/edit.ctp:18 +#: Template/TransactionCreations/index.ctp:12 +#: Template/TransactionCreations/view.ctp:15 +#: Template/TransactionGroupAddaddress/add.ctp:12 +#: Template/TransactionGroupAddaddress/edit.ctp:18 +#: Template/TransactionGroupAddaddress/index.ctp:12 +#: Template/TransactionGroupAddaddress/view.ctp:15 +#: Template/TransactionGroupAllowtrades/add.ctp:12 +#: Template/TransactionGroupAllowtrades/edit.ctp:18 +#: Template/TransactionGroupAllowtrades/index.ctp:12 +#: Template/TransactionGroupAllowtrades/view.ctp:15 +#: Template/TransactionGroupCreates/add.ctp:12 +#: Template/TransactionGroupCreates/edit.ctp:18 +#: Template/TransactionGroupCreates/index.ctp:12 +#: Template/TransactionGroupCreates/view.ctp:15 +#: Template/TransactionSendCoins/add.ctp:12 +#: Template/TransactionSendCoins/edit.ctp:18 +#: Template/TransactionSendCoins/index.ctp:12 +#: Template/TransactionSendCoins/view.ctp:15 +#: Template/TransactionSignatures/add.ctp:12 +#: Template/TransactionSignatures/edit.ctp:18 +#: Template/TransactionSignatures/index.ctp:12 +#: Template/TransactionSignatures/view.ctp:15 +#: Template/TransactionTypes/add.ctp:12 Template/TransactionTypes/edit.ctp:18 +#: Template/TransactionTypes/index.ctp:12 Template/TransactionTypes/view.ctp:15 +#: Template/Transactions/index.ctp:10 Template/Transactions/view.ctp:13 +msgid "New Transaction" +msgstr "" + +#: Template/StateCreated/add.ctp:20 +msgid "Add State Created" +msgstr "" + +#: Template/StateCreated/edit.ctp:26 Template/StateCreated/view.ctp:10 +msgid "Edit State Created" +msgstr "" + +#: Template/StateCreated/index.ctp:10 Template/StateCreated/view.ctp:13 +#: Template/StateUsers/add.ctp:16 Template/StateUsers/edit.ctp:22 +#: Template/StateUsers/index.ctp:16 Template/StateUsers/view.ctp:19 +#: Template/Transactions/add.ctp:16 Template/Transactions/edit.ctp:22 +#: Template/Transactions/index.ctp:16 Template/Transactions/view.ctp:19 +msgid "New State Created" +msgstr "" + +#: Template/StateCreated/index.ctp:18 +msgid "State Created" +msgstr "" + +#: Template/StateCreated/view.ctp:11 +msgid "Delete State Created" +msgstr "" + +#: Template/StateCreated/view.ctp:24 Template/TransactionCreations/view.ctp:24 +#: Template/TransactionGroupAddaddress/view.ctp:24 +#: Template/TransactionGroupAllowtrades/view.ctp:22 +#: Template/TransactionGroupCreates/view.ctp:24 +#: Template/TransactionSendCoins/view.ctp:24 +#: Template/TransactionSignatures/view.ctp:22 +msgid "Transaction" +msgstr "" + +#: Template/StateCreated/view.ctp:36 Template/StateUsers/view.ctp:76 +#: Template/Transactions/view.ctp:61 +msgid "Month" +msgstr "" + +#: Template/StateCreated/view.ctp:40 Template/StateUsers/view.ctp:77 +#: Template/Transactions/view.ctp:62 +msgid "Year" +msgstr "" + +#: Template/StateCreated/view.ctp:44 Template/StateUsers/view.ctp:80 +#: Template/Transactions/view.ctp:65 +msgid "Short Ident Hash" +msgstr "" + +#: Template/StateErrors/add.ctp:10 Template/StateErrors/edit.ctp:16 +#: Template/StateErrors/view.ctp:12 +msgid "List State Errors" +msgstr "" + +#: Template/StateErrors/add.ctp:13 Template/StateErrors/edit.ctp:19 +#: Template/StateErrors/index.ctp:13 Template/StateErrors/view.ctp:16 +#: Template/TransactionTypes/add.ctp:10 Template/TransactionTypes/edit.ctp:16 +#: Template/TransactionTypes/view.ctp:12 Template/Transactions/add.ctp:13 +#: Template/Transactions/edit.ctp:19 Template/Transactions/index.ctp:13 +#: Template/Transactions/view.ctp:16 +msgid "List Transaction Types" +msgstr "" + +#: Template/StateErrors/add.ctp:14 Template/StateErrors/edit.ctp:20 +#: Template/StateErrors/index.ctp:14 Template/StateErrors/view.ctp:17 +#: Template/TransactionTypes/index.ctp:10 Template/TransactionTypes/view.ctp:13 +#: Template/Transactions/add.ctp:14 Template/Transactions/edit.ctp:20 +#: Template/Transactions/index.ctp:14 Template/Transactions/view.ctp:17 +msgid "New Transaction Type" +msgstr "" + +#: Template/StateErrors/add.ctp:20 +msgid "Add State Error" +msgstr "" + +#: Template/StateErrors/edit.ctp:26 Template/StateErrors/view.ctp:10 +msgid "Edit State Error" +msgstr "" + +#: Template/StateErrors/index.ctp:10 Template/StateErrors/view.ctp:13 +msgid "New State Error" +msgstr "" + +#: Template/StateErrors/index.ctp:18 +msgid "State Errors" +msgstr "" + +#: Template/StateErrors/show_for_user.ctp:9 +msgid "Fehlermeldungen" +msgstr "" + +#: Template/StateErrors/view.ctp:11 +msgid "Delete State Error" +msgstr "" + +#: Template/StateErrors/view.ctp:28 Template/Transactions/view.ctp:42 +msgid "Transaction Type" +msgstr "" + +#: Template/StateErrors/view.ctp:41 +msgid "Message Json" +msgstr "" + +#: Template/StateGroupAddresses/add.ctp:11 +#: Template/StateGroupAddresses/edit.ctp:17 +#: Template/StateGroupAddresses/index.ctp:11 +#: Template/StateGroupAddresses/view.ctp:14 Template/StateGroups/add.ctp:10 +#: Template/StateGroups/edit.ctp:16 Template/StateGroups/view.ctp:12 +#: Template/StateUsers/add.ctp:11 Template/StateUsers/edit.ctp:17 +#: Template/StateUsers/index.ctp:11 Template/StateUsers/view.ctp:14 +#: Template/TransactionGroupCreates/add.ctp:13 +#: Template/TransactionGroupCreates/edit.ctp:19 +#: Template/TransactionGroupCreates/index.ctp:13 +#: Template/TransactionGroupCreates/view.ctp:16 +#: Template/Transactions/add.ctp:11 Template/Transactions/edit.ctp:17 +#: Template/Transactions/index.ctp:11 Template/Transactions/view.ctp:14 +msgid "List State Groups" +msgstr "" + +#: Template/StateGroupAddresses/add.ctp:12 +#: Template/StateGroupAddresses/edit.ctp:18 +#: Template/StateGroupAddresses/index.ctp:12 +#: Template/StateGroupAddresses/view.ctp:15 Template/StateGroups/index.ctp:10 +#: Template/StateGroups/view.ctp:13 Template/StateUsers/add.ctp:12 +#: Template/StateUsers/edit.ctp:18 Template/StateUsers/index.ctp:12 +#: Template/StateUsers/view.ctp:15 Template/TransactionGroupCreates/add.ctp:14 +#: Template/TransactionGroupCreates/edit.ctp:20 +#: Template/TransactionGroupCreates/index.ctp:14 +#: Template/TransactionGroupCreates/view.ctp:17 +#: Template/Transactions/add.ctp:12 Template/Transactions/edit.ctp:18 +#: Template/Transactions/index.ctp:12 Template/Transactions/view.ctp:15 +msgid "New State Group" +msgstr "" + +#: Template/StateGroupAddresses/add.ctp:20 +msgid "Add State Group Address" +msgstr "" + +#: Template/StateGroupAddresses/edit.ctp:26 +#: Template/StateGroupAddresses/view.ctp:10 +msgid "Edit State Group Address" +msgstr "" + +#: Template/StateGroupAddresses/index.ctp:18 +msgid "State Group Addresses" +msgstr "" + +#: Template/StateGroupAddresses/view.ctp:11 +msgid "Delete State Group Address" +msgstr "" + +#: Template/StateGroupAddresses/view.ctp:24 Template/StateUsers/view.ctp:30 +#: Template/TransactionGroupCreates/view.ctp:28 +#: Template/Transactions/view.ctp:38 +msgid "State Group" +msgstr "" + +#: Template/StateGroupAddresses/view.ctp:28 +#: Template/TransactionGroupAddaddress/view.ctp:28 +msgid "Address Type" +msgstr "" + +#: Template/StateGroupRelationships/add.ctp:10 +#: Template/StateGroupRelationships/edit.ctp:16 +#: Template/StateGroupRelationships/view.ctp:12 +msgid "List State Group Relationships" +msgstr "" + +#: Template/StateGroupRelationships/add.ctp:16 +msgid "Add State Group Relationship" +msgstr "" + +#: Template/StateGroupRelationships/edit.ctp:22 +#: Template/StateGroupRelationships/view.ctp:10 +msgid "Edit State Group Relationship" +msgstr "" + +#: Template/StateGroupRelationships/index.ctp:10 +#: Template/StateGroupRelationships/view.ctp:13 +msgid "New State Group Relationship" +msgstr "" + +#: Template/StateGroupRelationships/index.ctp:14 +msgid "State Group Relationships" +msgstr "" + +#: Template/StateGroupRelationships/view.ctp:11 +msgid "Delete State Group Relationship" +msgstr "" + +#: Template/StateGroupRelationships/view.ctp:24 +msgid "State Group1 Id" +msgstr "" + +#: Template/StateGroupRelationships/view.ctp:28 +msgid "State Group2 Id" +msgstr "" + +#: Template/StateGroupRelationships/view.ctp:32 +msgid "State Relationship Id" +msgstr "" + +#: Template/StateGroups/add.ctp:15 Template/StateGroups/edit.ctp:21 +#: Template/StateGroups/index.ctp:15 Template/StateGroups/view.ctp:18 +#: Template/TransactionGroupCreates/add.ctp:10 +#: Template/TransactionGroupCreates/edit.ctp:16 +#: Template/TransactionGroupCreates/view.ctp:12 +#: Template/Transactions/add.ctp:23 Template/Transactions/edit.ctp:29 +#: Template/Transactions/index.ctp:23 Template/Transactions/view.ctp:26 +msgid "List Transaction Group Creates" +msgstr "" + +#: Template/StateGroups/add.ctp:16 Template/StateGroups/edit.ctp:22 +#: Template/StateGroups/index.ctp:16 Template/StateGroups/view.ctp:19 +#: Template/TransactionGroupCreates/index.ctp:10 +#: Template/TransactionGroupCreates/view.ctp:13 +#: Template/Transactions/add.ctp:24 Template/Transactions/edit.ctp:30 +#: Template/Transactions/index.ctp:24 Template/Transactions/view.ctp:27 +msgid "New Transaction Group Create" +msgstr "" + +#: Template/StateGroups/add.ctp:24 +msgid "Add State Group" +msgstr "" + +#: Template/StateGroups/edit.ctp:30 Template/StateGroups/view.ctp:10 +msgid "Edit State Group" +msgstr "" + +#: Template/StateGroups/index.ctp:22 +msgid "State Groups" +msgstr "" + +#: Template/StateGroups/view.ctp:11 +msgid "Delete State Group" +msgstr "" + +#: Template/StateGroups/view.ctp:36 +msgid "User Count" +msgstr "" + +#: Template/StateGroups/view.ctp:68 +msgid "Related State Users" +msgstr "" + +#: Template/StateGroups/view.ctp:73 Template/StateUsers/view.ctp:38 +msgid "Index Id" +msgstr "" + +#: Template/StateGroups/view.ctp:95 Template/Transactions/view.ctp:171 +msgid "Related Transaction Group Creates" +msgstr "" + +#: Template/StateGroups/view.ctp:101 Template/Transactions/view.ctp:177 +msgid "Group Public Key" +msgstr "" + +#: Template/StateGroups/view.ctp:124 Template/TransactionTypes/view.ctp:35 +msgid "Related Transactions" +msgstr "" + +#: Template/StateGroups/view.ctp:130 Template/TransactionTypes/view.ctp:41 +msgid "Transaction Type Id" +msgstr "" + +#: Template/StateGroups/view.ctp:131 Template/TransactionTypes/view.ctp:42 +msgid "Tx Hash" +msgstr "" + +#: Template/StateGroups/view.ctp:132 Template/TransactionTypes/view.ctp:43 +#: Template/Transactions/view.ctp:50 +msgid "Received" +msgstr "" + +#: Template/StateRelationshipTypes/add.ctp:10 +#: Template/StateRelationshipTypes/edit.ctp:16 +#: Template/StateRelationshipTypes/view.ctp:12 +msgid "List State Relationship Types" +msgstr "" + +#: Template/StateRelationshipTypes/add.ctp:16 +msgid "Add State Relationship Type" +msgstr "" + +#: Template/StateRelationshipTypes/edit.ctp:22 +#: Template/StateRelationshipTypes/view.ctp:10 +msgid "Edit State Relationship Type" +msgstr "" + +#: Template/StateRelationshipTypes/index.ctp:10 +#: Template/StateRelationshipTypes/view.ctp:13 +msgid "New State Relationship Type" +msgstr "" + +#: Template/StateRelationshipTypes/index.ctp:14 +msgid "State Relationship Types" +msgstr "" + +#: Template/StateRelationshipTypes/view.ctp:11 +msgid "Delete State Relationship Type" +msgstr "" + +#: Template/StateUsers/add.ctp:17 Template/StateUsers/edit.ctp:23 +#: Template/StateUsers/index.ctp:17 Template/StateUsers/view.ctp:20 +#: Template/TransactionCreations/add.ctp:10 +#: Template/TransactionCreations/edit.ctp:16 +#: Template/TransactionCreations/view.ctp:12 Template/Transactions/add.ctp:17 +#: Template/Transactions/edit.ctp:23 Template/Transactions/index.ctp:17 +#: Template/Transactions/view.ctp:20 +msgid "List Transaction Creations" +msgstr "" + +#: Template/StateUsers/add.ctp:18 Template/StateUsers/edit.ctp:24 +#: Template/StateUsers/index.ctp:18 Template/StateUsers/view.ctp:21 +#: Template/TransactionCreations/index.ctp:10 +#: Template/TransactionCreations/view.ctp:13 Template/Transactions/add.ctp:18 +#: Template/Transactions/edit.ctp:24 Template/Transactions/index.ctp:18 +#: Template/Transactions/view.ctp:21 +msgid "New Transaction Creation" +msgstr "" + +#: Template/StateUsers/add.ctp:19 Template/StateUsers/edit.ctp:25 +#: Template/StateUsers/index.ctp:19 Template/StateUsers/view.ctp:22 +#: Template/TransactionSendCoins/add.ctp:10 +#: Template/TransactionSendCoins/edit.ctp:16 +#: Template/TransactionSendCoins/view.ctp:12 Template/Transactions/add.ctp:25 +#: Template/Transactions/edit.ctp:31 Template/Transactions/index.ctp:25 +#: Template/Transactions/view.ctp:28 +msgid "List Transaction Send Coins" +msgstr "" + +#: Template/StateUsers/add.ctp:20 Template/StateUsers/edit.ctp:26 +#: Template/StateUsers/index.ctp:20 Template/StateUsers/view.ctp:23 +#: Template/TransactionSendCoins/index.ctp:10 +#: Template/TransactionSendCoins/view.ctp:13 Template/Transactions/add.ctp:26 +#: Template/Transactions/edit.ctp:32 Template/Transactions/index.ctp:26 +#: Template/Transactions/view.ctp:29 +msgid "New Transaction Send Coin" +msgstr "" + +#: Template/StateUsers/add.ctp:26 +msgid "Add State User" +msgstr "" + +#: Template/StateUsers/edit.ctp:32 Template/StateUsers/view.ctp:10 +msgid "Edit State User" +msgstr "" + +#: Template/StateUsers/index.ctp:24 +msgid "State Users" +msgstr "" + +#: Template/StateUsers/search.ctp:24 +msgid "Vorname oder Nachname oder E-Mail" +msgstr "" + +#: Template/StateUsers/search.ctp:25 +msgid "Datenbank durchsuchen" +msgstr "" + +#: Template/StateUsers/search.ctp:38 +msgid "Benutzer gefunden" +msgstr "" + +#: Template/StateUsers/search.ctp:73 +msgid "Keine Benutzer gefunden" +msgstr "" + +#: Template/StateUsers/view.ctp:11 +msgid "Delete State User" +msgstr "" + +#: Template/StateUsers/view.ctp:43 +msgid "Related State Balances" +msgstr "" + +#: Template/StateUsers/view.ctp:48 Template/StateUsers/view.ctp:78 +#: Template/StateUsers/view.ctp:109 Template/StateUsers/view.ctp:138 +#: Template/Transactions/view.ctp:63 Template/Transactions/view.ctp:94 +#: Template/Transactions/view.ctp:206 +msgid "State User Id" +msgstr "" + +#: Template/StateUsers/view.ctp:70 Template/Transactions/view.ctp:55 +msgid "Related State Created" +msgstr "" + +#: Template/StateUsers/view.ctp:103 Template/Transactions/view.ctp:88 +msgid "Related Transaction Creations" +msgstr "" + +#: Template/StateUsers/view.ctp:111 Template/Transactions/view.ctp:96 +msgid "Ident Hash" +msgstr "" + +#: Template/StateUsers/view.ctp:132 Template/Transactions/view.ctp:200 +msgid "Related Transaction Send Coins" +msgstr "" + +#: Template/StateUsers/view.ctp:139 Template/Transactions/view.ctp:207 +msgid "Receiver Public Key" +msgstr "" + +#: Template/StateUsers/view.ctp:140 Template/Transactions/view.ctp:208 +msgid "Receiver User Id" +msgstr "" + +#: Template/StateUsers/view.ctp:142 Template/TransactionSendCoins/view.ctp:40 +#: Template/Transactions/view.ctp:210 +msgid "Sender Final Balance" +msgstr "" + +#: Template/TransactionCreations/add.ctp:20 +msgid "Add Transaction Creation" +msgstr "" + +#: Template/TransactionCreations/create.ctp:17 +#: Template/TransactionCreations/create_multi.ctp:17 +msgid "Schöpfungstransaktion" +msgstr "" + +#: Template/TransactionCreations/create.ctp:28 +#: Template/TransactionCreations/create_multi.ctp:107 +msgid "Transaktion(n) abschließen" +msgstr "" + +#: Template/TransactionCreations/create.ctp:29 +#: Template/TransactionCreations/create_multi.ctp:108 +#: Template/TransactionSendCoins/create.ctp:33 +msgid "Weitere Transaktion erstellen" +msgstr "" + +#: Template/TransactionCreations/create_multi.ctp:85 +msgid "Für benutzerdefinierten Betrag" +msgstr "" + +#: Template/TransactionCreations/create_multi.ctp:172 +msgid "Alle Transaktionen abgeschlossen!" +msgstr "" + +#: Template/TransactionCreations/edit.ctp:26 +#: Template/TransactionCreations/view.ctp:10 +msgid "Edit Transaction Creation" +msgstr "" + +#: Template/TransactionCreations/index.ctp:18 +msgid "Transaction Creations" +msgstr "" + +#: Template/TransactionCreations/view.ctp:11 +msgid "Delete Transaction Creation" +msgstr "" + +#: Template/TransactionGroupAddaddress/add.ctp:20 +msgid "Add Transaction Group Addaddres" +msgstr "" + +#: Template/TransactionGroupAddaddress/edit.ctp:26 +#: Template/TransactionGroupAddaddress/view.ctp:10 +msgid "Edit Transaction Group Addaddres" +msgstr "" + +#: Template/TransactionGroupAddaddress/index.ctp:18 +msgid "Transaction Group Addaddress" +msgstr "" + +#: Template/TransactionGroupAddaddress/view.ctp:11 +msgid "Delete Transaction Group Addaddres" +msgstr "" + +#: Template/TransactionGroupAllowtrades/add.ctp:10 +#: Template/TransactionGroupAllowtrades/edit.ctp:16 +#: Template/TransactionGroupAllowtrades/view.ctp:12 +#: Template/Transactions/add.ctp:21 Template/Transactions/edit.ctp:27 +#: Template/Transactions/index.ctp:21 Template/Transactions/view.ctp:24 +msgid "List Transaction Group Allowtrades" +msgstr "" + +#: Template/TransactionGroupAllowtrades/add.ctp:18 +msgid "Add Transaction Group Allowtrade" +msgstr "" + +#: Template/TransactionGroupAllowtrades/edit.ctp:24 +#: Template/TransactionGroupAllowtrades/view.ctp:10 +msgid "Edit Transaction Group Allowtrade" +msgstr "" + +#: Template/TransactionGroupAllowtrades/index.ctp:10 +#: Template/TransactionGroupAllowtrades/view.ctp:13 +#: Template/Transactions/add.ctp:22 Template/Transactions/edit.ctp:28 +#: Template/Transactions/index.ctp:22 Template/Transactions/view.ctp:25 +msgid "New Transaction Group Allowtrade" +msgstr "" + +#: Template/TransactionGroupAllowtrades/index.ctp:16 +msgid "Transaction Group Allowtrades" +msgstr "" + +#: Template/TransactionGroupAllowtrades/view.ctp:11 +msgid "Delete Transaction Group Allowtrade" +msgstr "" + +#: Template/TransactionGroupAllowtrades/view.ctp:30 +#: Template/Transactions/view.ctp:150 +msgid "Group Id" +msgstr "" + +#: Template/TransactionGroupAllowtrades/view.ctp:34 +#: Template/Transactions/view.ctp:151 +msgid "Allow" +msgstr "" + +#: Template/TransactionGroupCreates/add.ctp:20 +msgid "Add Transaction Group Create" +msgstr "" + +#: Template/TransactionGroupCreates/edit.ctp:26 +#: Template/TransactionGroupCreates/view.ctp:10 +msgid "Edit Transaction Group Create" +msgstr "" + +#: Template/TransactionGroupCreates/index.ctp:18 +msgid "Transaction Group Creates" +msgstr "" + +#: Template/TransactionGroupCreates/view.ctp:11 +msgid "Delete Transaction Group Create" +msgstr "" + +#: Template/TransactionSendCoins/add.ctp:20 +msgid "Add Transaction Send Coin" +msgstr "" + +#: Template/TransactionSendCoins/create.ctp:29 +msgid "Betrag in GDD" +msgstr "" + +#: Template/TransactionSendCoins/create.ctp:31 +msgid "Empfänger" +msgstr "" + +#: Template/TransactionSendCoins/create.ctp:32 +msgid "Transaktion abschließen" +msgstr "" + +#: Template/TransactionSendCoins/edit.ctp:26 +#: Template/TransactionSendCoins/view.ctp:10 +msgid "Edit Transaction Send Coin" +msgstr "" + +#: Template/TransactionSendCoins/index.ctp:18 +msgid "Transaction Send Coins" +msgstr "" + +#: Template/TransactionSendCoins/view.ctp:11 +msgid "Delete Transaction Send Coin" +msgstr "" + +#: Template/TransactionSignatures/add.ctp:10 +#: Template/TransactionSignatures/edit.ctp:16 +#: Template/TransactionSignatures/view.ctp:12 Template/Transactions/add.ctp:27 +#: Template/Transactions/edit.ctp:33 Template/Transactions/index.ctp:27 +#: Template/Transactions/view.ctp:30 +msgid "List Transaction Signatures" +msgstr "" + +#: Template/TransactionSignatures/add.ctp:18 +msgid "Add Transaction Signature" +msgstr "" + +#: Template/TransactionSignatures/edit.ctp:24 +#: Template/TransactionSignatures/view.ctp:10 +msgid "Edit Transaction Signature" +msgstr "" + +#: Template/TransactionSignatures/index.ctp:10 +#: Template/TransactionSignatures/view.ctp:13 Template/Transactions/add.ctp:28 +#: Template/Transactions/edit.ctp:34 Template/Transactions/index.ctp:28 +#: Template/Transactions/view.ctp:31 +msgid "New Transaction Signature" +msgstr "" + +#: Template/TransactionSignatures/index.ctp:16 +msgid "Transaction Signatures" +msgstr "" + +#: Template/TransactionSignatures/view.ctp:11 +msgid "Delete Transaction Signature" +msgstr "" + +#: Template/TransactionTypes/add.ctp:18 +msgid "Add Transaction Type" +msgstr "" + +#: Template/TransactionTypes/edit.ctp:24 Template/TransactionTypes/view.ctp:10 +msgid "Edit Transaction Type" +msgstr "" + +#: Template/TransactionTypes/index.ctp:16 +msgid "Transaction Types" +msgstr "" + +#: Template/TransactionTypes/view.ctp:11 +msgid "Delete Transaction Type" +msgstr "" + +#: Template/Transactions/add.ctp:34 +msgid "Add Transaction" +msgstr "" + +#: Template/Transactions/edit.ctp:40 Template/Transactions/view.ctp:10 +msgid "Edit Transaction" +msgstr "" + +#: Template/Transactions/index.ctp:32 +msgid "Transactions" +msgstr "" + +#: Template/Transactions/view.ctp:11 +msgid "Delete Transaction" +msgstr "" + +#: Template/Transactions/view.ctp:144 +msgid "Related Transaction Group Allowtrades" +msgstr "" + +#: Template/Transactions/view.ctp:233 +msgid "Related Transaction Signatures" +msgstr "" + +#: Template/Transactions/view.ctp:239 +msgid "Signature" +msgstr "" + +#: Template/Transactions/view.ctp:240 +msgid "Pubkey" +msgstr "" + +#: Template/Error/error400.ctp:37 +msgid "The requested address {0} was not found on this server." +msgstr "" + +#: Template/Error/error500.ctp:39 +msgid "An Internal Error Has Occurred" +msgstr "" diff --git a/community_server/src/Locale/default.pot b/community_server/src/Locale/default.pot new file mode 100644 index 000000000..af483fad6 --- /dev/null +++ b/community_server/src/Locale/default.pot @@ -0,0 +1,2666 @@ +# LANGUAGE translation of CakePHP Application +# Copyright YEAR NAME +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2020-02-10 10:20+0000\n" +"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n" +"Last-Translator: NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: Controller/AddressTypesController.php:55 +#: Controller/AddressTypesController.php:79 +msgid "The address type has been saved." +msgstr "" + +#: Controller/AddressTypesController.php:59 +#: Controller/AddressTypesController.php:83 +msgid "The address type could not be saved. Please, try again." +msgstr "" + +#: Controller/AddressTypesController.php:100 +msgid "The address type has been deleted." +msgstr "" + +#: Controller/AddressTypesController.php:102 +msgid "The address type could not be deleted. Please, try again." +msgstr "" + +#: Controller/AdminErrorsController.php:57 +#: Controller/AdminErrorsController.php:82 +msgid "The admin error has been saved." +msgstr "" + +#: Controller/AdminErrorsController.php:61 +#: Controller/AdminErrorsController.php:86 +msgid "The admin error could not be saved. Please, try again." +msgstr "" + +#: Controller/AdminErrorsController.php:104 +msgid "The admin error has been deleted." +msgstr "" + +#: Controller/AdminErrorsController.php:106 +msgid "The admin error could not be deleted. Please, try again." +msgstr "" + +#: Controller/AppController.php:197 +msgid "error updating state user " +msgstr "" + +#: Controller/AppController.php:213 +msgid "error saving state user " +msgstr "" + +#: Controller/AppController.php:220 +msgid "no pubkey" +msgstr "" + +#: Controller/AppController.php:226 +msgid "invalid session" +msgstr "" + +#: Controller/AppController.php:233 +#: Controller/TransactionSendCoinsController.php:222 +msgid "error http request: " +msgstr "" + +#: Controller/AppController.php:270 +msgid "Serious error, couldn't save to db, please write the admin: " +msgstr "" + +#: Controller/OperatorTypesController.php:54 +#: Controller/OperatorTypesController.php:78 +msgid "The operator type has been saved." +msgstr "" + +#: Controller/OperatorTypesController.php:58 +#: Controller/OperatorTypesController.php:82 +msgid "The operator type could not be saved. Please, try again." +msgstr "" + +#: Controller/OperatorTypesController.php:99 +msgid "The operator type has been deleted." +msgstr "" + +#: Controller/OperatorTypesController.php:101 +msgid "The operator type could not be deleted. Please, try again." +msgstr "" + +#: Controller/OperatorsController.php:182 +#: Controller/OperatorsController.php:207 +msgid "The operator has been saved." +msgstr "" + +#: Controller/OperatorsController.php:186 +#: Controller/OperatorsController.php:211 +msgid "The operator could not be saved. Please, try again." +msgstr "" + +#: Controller/OperatorsController.php:229 +msgid "The operator has been deleted." +msgstr "" + +#: Controller/OperatorsController.php:231 +msgid "The operator could not be deleted. Please, try again." +msgstr "" + +#: Controller/ServerUsersController.php:42 +msgid "Invalid username or password, try again" +msgstr "" + +#: Controller/ServerUsersController.php:78 +#: Controller/ServerUsersController.php:102 +msgid "The server user has been saved." +msgstr "" + +#: Controller/ServerUsersController.php:82 +#: Controller/ServerUsersController.php:106 +msgid "The server user could not be saved. Please, try again." +msgstr "" + +#: Controller/ServerUsersController.php:123 +msgid "The server user has been deleted." +msgstr "" + +#: Controller/ServerUsersController.php:125 +msgid "The server user could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateBalancesController.php:175 +#: Controller/StateBalancesController.php:200 +msgid "The state balance has been saved." +msgstr "" + +#: Controller/StateBalancesController.php:179 +#: Controller/StateBalancesController.php:204 +msgid "The state balance could not be saved. Please, try again." +msgstr "" + +#: Controller/StateBalancesController.php:222 +msgid "The state balance has been deleted." +msgstr "" + +#: Controller/StateBalancesController.php:224 +msgid "The state balance could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateCreatedController.php:57 +#: Controller/StateCreatedController.php:83 +msgid "The state created has been saved." +msgstr "" + +#: Controller/StateCreatedController.php:61 +#: Controller/StateCreatedController.php:87 +msgid "The state created could not be saved. Please, try again." +msgstr "" + +#: Controller/StateCreatedController.php:106 +msgid "The state created has been deleted." +msgstr "" + +#: Controller/StateCreatedController.php:108 +msgid "The state created could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateErrorsController.php:66 +msgid "Error belongs to another User, cannot delete" +msgstr "" + +#: Controller/StateErrorsController.php:69 +#: Controller/StateErrorsController.php:157 +msgid "The state error has been deleted." +msgstr "" + +#: Controller/StateErrorsController.php:71 +#: Controller/StateErrorsController.php:159 +msgid "The state error could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateErrorsController.php:108 +#: Controller/StateErrorsController.php:134 +msgid "The state error has been saved." +msgstr "" + +#: Controller/StateErrorsController.php:112 +#: Controller/StateErrorsController.php:138 +msgid "The state error could not be saved. Please, try again." +msgstr "" + +#: Controller/StateGroupAddressesController.php:57 +#: Controller/StateGroupAddressesController.php:83 +msgid "The state group address has been saved." +msgstr "" + +#: Controller/StateGroupAddressesController.php:61 +#: Controller/StateGroupAddressesController.php:87 +msgid "The state group address could not be saved. Please, try again." +msgstr "" + +#: Controller/StateGroupAddressesController.php:106 +msgid "The state group address has been deleted." +msgstr "" + +#: Controller/StateGroupAddressesController.php:108 +msgid "The state group address could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateGroupRelationshipsController.php:57 +#: Controller/StateGroupRelationshipsController.php:84 +msgid "The state group relationship has been saved." +msgstr "" + +#: Controller/StateGroupRelationshipsController.php:61 +#: Controller/StateGroupRelationshipsController.php:88 +msgid "The state group relationship could not be saved. Please, try again." +msgstr "" + +#: Controller/StateGroupRelationshipsController.php:108 +msgid "The state group relationship has been deleted." +msgstr "" + +#: Controller/StateGroupRelationshipsController.php:110 +msgid "The state group relationship could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateGroupsController.php:57 +#: Controller/StateGroupsController.php:82 +msgid "The state group has been saved." +msgstr "" + +#: Controller/StateGroupsController.php:61 +#: Controller/StateGroupsController.php:86 +msgid "The state group could not be saved. Please, try again." +msgstr "" + +#: Controller/StateGroupsController.php:104 +msgid "The state group has been deleted." +msgstr "" + +#: Controller/StateGroupsController.php:106 +msgid "The state group could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateRelationshipTypesController.php:54 +#: Controller/StateRelationshipTypesController.php:78 +msgid "The state relationship type has been saved." +msgstr "" + +#: Controller/StateRelationshipTypesController.php:58 +#: Controller/StateRelationshipTypesController.php:82 +msgid "The state relationship type could not be saved. Please, try again." +msgstr "" + +#: Controller/StateRelationshipTypesController.php:99 +msgid "The state relationship type has been deleted." +msgstr "" + +#: Controller/StateRelationshipTypesController.php:101 +msgid "The state relationship type could not be deleted. Please, try again." +msgstr "" + +#: Controller/StateUsersController.php:15 +msgid "account created" +msgstr "" + +#: Controller/StateUsersController.php:16 +msgid "account not on login-server" +msgstr "" + +#: Controller/StateUsersController.php:17 +msgid "email activated" +msgstr "" + +#: Controller/StateUsersController.php:18 +msgid "account copied to community" +msgstr "" + +#: Controller/StateUsersController.php:19 +msgid "email not activated" +msgstr "" + +#: Controller/StateUsersController.php:20 +msgid "account multiple times on login-server" +msgstr "" + +#: Controller/StateUsersController.php:21 +msgid "account not on community server" +msgstr "" + +#: Controller/StateUsersController.php:22 +msgid "no keys" +msgstr "" + +#: Controller/StateUsersController.php:219 +#: Controller/TransactionCreationsController.php:179 +#: Controller/TransactionSendCoinsController.php:231 +msgid "Something was invalid, please try again!" +msgstr "" + +#: Controller/StateUsersController.php:275 +#: Controller/StateUsersController.php:301 +msgid "The state user has been saved." +msgstr "" + +#: Controller/StateUsersController.php:279 +#: Controller/StateUsersController.php:305 +msgid "The state user could not be saved. Please, try again." +msgstr "" + +#: Controller/StateUsersController.php:324 +msgid "The state user has been deleted." +msgstr "" + +#: Controller/StateUsersController.php:326 +msgid "The state user could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionCreationsController.php:144 +#: Controller/TransactionCreationsController.php:331 +msgid "Error by requesting LoginServer, please try again" +msgstr "" + +#: Controller/TransactionCreationsController.php:146 +#: Controller/TransactionCreationsController.php:333 +msgid "Error, please wait for the admin to fix it" +msgstr "" + +#: Controller/TransactionCreationsController.php:156 +#: Controller/TransactionCreationsController.php:343 +msgid "Login Server Error, please wait for the admin to fix it" +msgstr "" + +#: Controller/TransactionCreationsController.php:170 +#: Controller/TransactionCreationsController.php:357 +#: Controller/TransactionSendCoinsController.php:216 +msgid "Transaction submitted for review." +msgstr "" + +#: Controller/TransactionCreationsController.php:175 +msgid "Building transaction failed" +msgstr "" + +#: Controller/TransactionCreationsController.php:267 +msgid "No user selected" +msgstr "" + +#: Controller/TransactionCreationsController.php:378 +#: Controller/TransactionCreationsController.php:404 +msgid "The transaction creation has been saved." +msgstr "" + +#: Controller/TransactionCreationsController.php:382 +#: Controller/TransactionCreationsController.php:408 +msgid "The transaction creation could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionCreationsController.php:427 +msgid "The transaction creation has been deleted." +msgstr "" + +#: Controller/TransactionCreationsController.php:429 +msgid "The transaction creation could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionGroupAddaddressController.php:57 +#: Controller/TransactionGroupAddaddressController.php:83 +msgid "The transaction group addaddres has been saved." +msgstr "" + +#: Controller/TransactionGroupAddaddressController.php:61 +#: Controller/TransactionGroupAddaddressController.php:87 +msgid "The transaction group addaddres could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionGroupAddaddressController.php:106 +msgid "The transaction group addaddres has been deleted." +msgstr "" + +#: Controller/TransactionGroupAddaddressController.php:108 +msgid "The transaction group addaddres could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionGroupAllowtradesController.php:57 +#: Controller/TransactionGroupAllowtradesController.php:83 +msgid "The transaction group allowtrade has been saved." +msgstr "" + +#: Controller/TransactionGroupAllowtradesController.php:61 +#: Controller/TransactionGroupAllowtradesController.php:87 +msgid "The transaction group allowtrade could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionGroupAllowtradesController.php:106 +msgid "The transaction group allowtrade has been deleted." +msgstr "" + +#: Controller/TransactionGroupAllowtradesController.php:108 +msgid "The transaction group allowtrade could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionGroupCreatesController.php:57 +#: Controller/TransactionGroupCreatesController.php:83 +msgid "The transaction group create has been saved." +msgstr "" + +#: Controller/TransactionGroupCreatesController.php:61 +#: Controller/TransactionGroupCreatesController.php:87 +msgid "The transaction group create could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionGroupCreatesController.php:106 +msgid "The transaction group create has been deleted." +msgstr "" + +#: Controller/TransactionGroupCreatesController.php:108 +msgid "The transaction group create could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionSendCoinsController.php:73 +#: Controller/TransactionSendCoinsController.php:100 +msgid "The transaction send coin has been saved." +msgstr "" + +#: Controller/TransactionSendCoinsController.php:77 +#: Controller/TransactionSendCoinsController.php:104 +msgid "The transaction send coin could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionSendCoinsController.php:145 +msgid "Du hast nicht genug Geld!" +msgstr "" + +#: Controller/TransactionSendCoinsController.php:151 +msgid "Du kannst dir leider nicht selbst Geld schicken!" +msgstr "" + +#: Controller/TransactionSendCoinsController.php:163 +msgid "Diese E-Mail ist mir nicht bekannt, hat dein Empfänger denn schon ein Gradido-Konto?" +msgstr "" + +#: Controller/TransactionSendCoinsController.php:202 +msgid "login server return error: " +msgstr "" + +#: Controller/TransactionSendCoinsController.php:226 +msgid "No Valid Receiver Public given" +msgstr "" + +#: Controller/TransactionSendCoinsController.php:250 +msgid "The transaction send coin has been deleted." +msgstr "" + +#: Controller/TransactionSendCoinsController.php:252 +msgid "The transaction send coin could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionSignaturesController.php:57 +#: Controller/TransactionSignaturesController.php:82 +msgid "The transaction signature has been saved." +msgstr "" + +#: Controller/TransactionSignaturesController.php:61 +#: Controller/TransactionSignaturesController.php:86 +msgid "The transaction signature could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionSignaturesController.php:104 +msgid "The transaction signature has been deleted." +msgstr "" + +#: Controller/TransactionSignaturesController.php:106 +msgid "The transaction signature could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionTypesController.php:54 +#: Controller/TransactionTypesController.php:78 +msgid "The transaction type has been saved." +msgstr "" + +#: Controller/TransactionTypesController.php:58 +#: Controller/TransactionTypesController.php:82 +msgid "The transaction type could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionTypesController.php:99 +msgid "The transaction type has been deleted." +msgstr "" + +#: Controller/TransactionTypesController.php:101 +msgid "The transaction type could not be deleted. Please, try again." +msgstr "" + +#: Controller/TransactionsController.php:66 +msgid "No valid data given, please try again." +msgstr "" + +#: Controller/TransactionsController.php:103 +msgid "error retriving last saved transaction from gradido node." +msgstr "" + +#: Controller/TransactionsController.php:197 +#: Controller/TransactionsController.php:223 +msgid "The transaction has been saved." +msgstr "" + +#: Controller/TransactionsController.php:201 +#: Controller/TransactionsController.php:227 +msgid "The transaction could not be saved. Please, try again." +msgstr "" + +#: Controller/TransactionsController.php:246 +msgid "The transaction has been deleted." +msgstr "" + +#: Controller/TransactionsController.php:248 +msgid "The transaction could not be deleted. Please, try again." +msgstr "" + +#: Form/CreationForm.php:43 +#: Form/TransferForm.php:46 +msgid "No HTML Tags like > or < please." +msgstr "" + +#: Form/CreationForm.php:55 +msgid "Please give a valid number with maximal 2 decimal places" +msgstr "" + +#: Form/TransferForm.php:35 +msgid "A valid email address is required" +msgstr "" + +#: Form/TransferForm.php:39 +msgid "The memo should contain max 150 character" +msgstr "" + +#: Form/TransferForm.php:58 +msgid "Please give a valid positive number with maximal 2 decimal places" +msgstr "" + +#: Form/UserSearchForm.php:32 +msgid "The search text should contain max 50 character" +msgstr "" + +#: Form/UserSearchForm.php:39 +msgid "No HTML Tags like < or > please." +msgstr "" + +#: Model/Table/ServerUsersTable.php:58 +msgid "Please give a username" +msgstr "" + +#: Model/Table/ServerUsersTable.php:64 +msgid "Please give a password" +msgstr "" + +#: Model/Table/ServerUsersTable.php:69 +msgid "Please give a email" +msgstr "" + +#: Model/Transactions/TransactionCreation.php:177 +msgid "Gradido Schöpfung erhalten" +msgstr "" + +#: Model/Transactions/TransactionTransfer.php:239 +msgid "Gradidos erhalten" +msgstr "" + +#: Template/AddressTypes/add.ctp:9 +#: Template/AddressTypes/edit.ctp:9 +#: Template/AddressTypes/index.ctp:9 +#: Template/AddressTypes/index.ctp:25 +#: Template/AddressTypes/view.ctp:9 +#: Template/AddressTypes/view.ctp:45 +#: Template/AddressTypes/view.ctp:72 +#: Template/AdminErrors/add.ctp:9 +#: Template/AdminErrors/edit.ctp:9 +#: Template/AdminErrors/index.ctp:9 +#: Template/AdminErrors/index.ctp:28 +#: Template/AdminErrors/view.ctp:9 +#: Template/OperatorTypes/add.ctp:9 +#: Template/OperatorTypes/edit.ctp:9 +#: Template/OperatorTypes/index.ctp:9 +#: Template/OperatorTypes/index.ctp:23 +#: Template/OperatorTypes/view.ctp:9 +#: Template/OperatorTypes/view.ctp:43 +#: Template/Operators/add.ctp:9 +#: Template/Operators/edit.ctp:9 +#: Template/Operators/index.ctp:9 +#: Template/Operators/index.ctp:24 +#: Template/Operators/view.ctp:9 +#: Template/ServerUsers/add.ctp:9 +#: Template/ServerUsers/edit.ctp:9 +#: Template/ServerUsers/index.ctp:9 +#: Template/ServerUsers/index.ctp:26 +#: Template/ServerUsers/view.ctp:9 +#: Template/StateBalances/add.ctp:9 +#: Template/StateBalances/edit.ctp:9 +#: Template/StateBalances/index.ctp:9 +#: Template/StateBalances/index.ctp:24 +#: Template/StateBalances/view.ctp:9 +#: Template/StateCreated/add.ctp:9 +#: Template/StateCreated/edit.ctp:9 +#: Template/StateCreated/index.ctp:9 +#: Template/StateCreated/index.ctp:29 +#: Template/StateCreated/view.ctp:9 +#: Template/StateErrors/add.ctp:9 +#: Template/StateErrors/edit.ctp:9 +#: Template/StateErrors/index.ctp:9 +#: Template/StateErrors/index.ctp:26 +#: Template/StateErrors/view.ctp:9 +#: Template/StateGroupAddresses/add.ctp:9 +#: Template/StateGroupAddresses/edit.ctp:9 +#: Template/StateGroupAddresses/index.ctp:9 +#: Template/StateGroupAddresses/index.ctp:25 +#: Template/StateGroupAddresses/view.ctp:9 +#: Template/StateGroupRelationships/add.ctp:9 +#: Template/StateGroupRelationships/edit.ctp:9 +#: Template/StateGroupRelationships/index.ctp:9 +#: Template/StateGroupRelationships/index.ctp:22 +#: Template/StateGroupRelationships/view.ctp:9 +#: Template/StateGroups/add.ctp:9 +#: Template/StateGroups/edit.ctp:9 +#: Template/StateGroups/index.ctp:9 +#: Template/StateGroups/index.ctp:29 +#: Template/StateGroups/view.ctp:9 +#: Template/StateGroups/view.ctp:49 +#: Template/StateGroups/view.ctp:76 +#: Template/StateGroups/view.ctp:104 +#: Template/StateGroups/view.ctp:133 +#: Template/StateRelationshipTypes/add.ctp:9 +#: Template/StateRelationshipTypes/edit.ctp:9 +#: Template/StateRelationshipTypes/index.ctp:9 +#: Template/StateRelationshipTypes/index.ctp:21 +#: Template/StateRelationshipTypes/view.ctp:9 +#: Template/StateUsers/add.ctp:9 +#: Template/StateUsers/edit.ctp:9 +#: Template/StateUsers/index.ctp:9 +#: Template/StateUsers/index.ctp:34 +#: Template/StateUsers/view.ctp:9 +#: Template/StateUsers/view.ctp:51 +#: Template/StateUsers/view.ctp:81 +#: Template/StateUsers/view.ctp:112 +#: Template/StateUsers/view.ctp:143 +#: Template/TransactionCreations/add.ctp:9 +#: Template/TransactionCreations/edit.ctp:9 +#: Template/TransactionCreations/index.ctp:9 +#: Template/TransactionCreations/index.ctp:27 +#: Template/TransactionCreations/view.ctp:9 +#: Template/TransactionGroupAddaddress/add.ctp:9 +#: Template/TransactionGroupAddaddress/edit.ctp:9 +#: Template/TransactionGroupAddaddress/index.ctp:9 +#: Template/TransactionGroupAddaddress/index.ctp:25 +#: Template/TransactionGroupAddaddress/view.ctp:9 +#: Template/TransactionGroupAllowtrades/add.ctp:9 +#: Template/TransactionGroupAllowtrades/edit.ctp:9 +#: Template/TransactionGroupAllowtrades/index.ctp:9 +#: Template/TransactionGroupAllowtrades/index.ctp:24 +#: Template/TransactionGroupAllowtrades/view.ctp:9 +#: Template/TransactionGroupCreates/add.ctp:9 +#: Template/TransactionGroupCreates/edit.ctp:9 +#: Template/TransactionGroupCreates/index.ctp:9 +#: Template/TransactionGroupCreates/index.ctp:26 +#: Template/TransactionGroupCreates/view.ctp:9 +#: Template/TransactionSendCoins/add.ctp:9 +#: Template/TransactionSendCoins/edit.ctp:9 +#: Template/TransactionSendCoins/index.ctp:9 +#: Template/TransactionSendCoins/index.ctp:27 +#: Template/TransactionSendCoins/view.ctp:9 +#: Template/TransactionSignatures/add.ctp:9 +#: Template/TransactionSignatures/edit.ctp:9 +#: Template/TransactionSignatures/index.ctp:9 +#: Template/TransactionSignatures/index.ctp:22 +#: Template/TransactionSignatures/view.ctp:9 +#: Template/TransactionTypes/add.ctp:9 +#: Template/TransactionTypes/edit.ctp:9 +#: Template/TransactionTypes/index.ctp:9 +#: Template/TransactionTypes/index.ctp:23 +#: Template/TransactionTypes/view.ctp:9 +#: Template/TransactionTypes/view.ctp:44 +#: Template/Transactions/add.ctp:9 +#: Template/Transactions/edit.ctp:9 +#: Template/Transactions/index.ctp:9 +#: Template/Transactions/view.ctp:9 +#: Template/Transactions/view.ctp:66 +#: Template/Transactions/view.ctp:97 +#: Template/Transactions/view.ctp:125 +#: Template/Transactions/view.ctp:152 +#: Template/Transactions/view.ctp:180 +#: Template/Transactions/view.ctp:211 +#: Template/Transactions/view.ctp:241 +msgid "Actions" +msgstr "" + +#: Template/AddressTypes/add.ctp:10 +#: Template/AddressTypes/edit.ctp:16 +#: Template/AddressTypes/view.ctp:12 +#: Template/StateGroupAddresses/add.ctp:13 +#: Template/StateGroupAddresses/edit.ctp:19 +#: Template/StateGroupAddresses/index.ctp:13 +#: Template/StateGroupAddresses/view.ctp:16 +#: Template/TransactionGroupAddaddress/add.ctp:13 +#: Template/TransactionGroupAddaddress/edit.ctp:19 +#: Template/TransactionGroupAddaddress/index.ctp:13 +#: Template/TransactionGroupAddaddress/view.ctp:16 +msgid "List Address Types" +msgstr "" + +#: Template/AddressTypes/add.ctp:11 +#: Template/AddressTypes/edit.ctp:17 +#: Template/AddressTypes/index.ctp:11 +#: Template/AddressTypes/view.ctp:14 +#: Template/StateGroupAddresses/add.ctp:10 +#: Template/StateGroupAddresses/edit.ctp:16 +#: Template/StateGroupAddresses/view.ctp:12 +#: Template/StateGroups/add.ctp:11 +#: Template/StateGroups/edit.ctp:17 +#: Template/StateGroups/index.ctp:11 +#: Template/StateGroups/view.ctp:14 +msgid "List State Group Addresses" +msgstr "" + +#: Template/AddressTypes/add.ctp:12 +#: Template/AddressTypes/edit.ctp:18 +#: Template/AddressTypes/index.ctp:12 +#: Template/AddressTypes/view.ctp:15 +#: Template/StateGroupAddresses/index.ctp:10 +#: Template/StateGroupAddresses/view.ctp:13 +#: Template/StateGroups/add.ctp:12 +#: Template/StateGroups/edit.ctp:18 +#: Template/StateGroups/index.ctp:12 +#: Template/StateGroups/view.ctp:15 +msgid "New State Group Address" +msgstr "" + +#: Template/AddressTypes/add.ctp:13 +#: Template/AddressTypes/edit.ctp:19 +#: Template/AddressTypes/index.ctp:13 +#: Template/AddressTypes/view.ctp:16 +#: Template/TransactionGroupAddaddress/add.ctp:10 +#: Template/TransactionGroupAddaddress/edit.ctp:16 +#: Template/TransactionGroupAddaddress/view.ctp:12 +#: Template/Transactions/add.ctp:19 +#: Template/Transactions/edit.ctp:25 +#: Template/Transactions/index.ctp:19 +#: Template/Transactions/view.ctp:22 +msgid "List Transaction Group Addaddress" +msgstr "" + +#: Template/AddressTypes/add.ctp:14 +#: Template/AddressTypes/edit.ctp:20 +#: Template/AddressTypes/index.ctp:14 +#: Template/AddressTypes/view.ctp:17 +#: Template/TransactionGroupAddaddress/index.ctp:10 +#: Template/TransactionGroupAddaddress/view.ctp:13 +#: Template/Transactions/add.ctp:20 +#: Template/Transactions/edit.ctp:26 +#: Template/Transactions/index.ctp:20 +#: Template/Transactions/view.ctp:23 +msgid "New Transaction Group Addaddres" +msgstr "" + +#: Template/AddressTypes/add.ctp:20 +msgid "Add Address Type" +msgstr "" + +#: Template/AddressTypes/add.ctp:26 +#: Template/AddressTypes/edit.ctp:32 +#: Template/AdminErrors/add.ctp:28 +#: Template/AdminErrors/edit.ctp:34 +#: Template/OperatorTypes/add.ctp:24 +#: Template/OperatorTypes/edit.ctp:30 +#: Template/Operators/add.ctp:24 +#: Template/Operators/edit.ctp:30 +#: Template/ServerUsers/add.ctp:24 +#: Template/ServerUsers/edit.ctp:32 +#: Template/StateBalances/add.ctp:24 +#: Template/StateBalances/edit.ctp:30 +#: Template/StateCreated/add.ctp:29 +#: Template/StateCreated/edit.ctp:35 +#: Template/StateErrors/add.ctp:27 +#: Template/StateErrors/edit.ctp:33 +#: Template/StateGroupAddresses/add.ctp:26 +#: Template/StateGroupAddresses/edit.ctp:32 +#: Template/StateGroupRelationships/add.ctp:23 +#: Template/StateGroupRelationships/edit.ctp:29 +#: Template/StateGroups/add.ctp:30 +#: Template/StateGroups/edit.ctp:36 +#: Template/StateRelationshipTypes/add.ctp:22 +#: Template/StateRelationshipTypes/edit.ctp:28 +#: Template/StateUsers/add.ctp:32 +#: Template/StateUsers/edit.ctp:38 +#: Template/TransactionCreations/add.ctp:27 +#: Template/TransactionCreations/edit.ctp:33 +#: Template/TransactionGroupAddaddress/add.ctp:26 +#: Template/TransactionGroupAddaddress/edit.ctp:32 +#: Template/TransactionGroupAllowtrades/add.ctp:25 +#: Template/TransactionGroupAllowtrades/edit.ctp:31 +#: Template/TransactionGroupCreates/add.ctp:27 +#: Template/TransactionGroupCreates/edit.ctp:33 +#: Template/TransactionSendCoins/add.ctp:28 +#: Template/TransactionSendCoins/edit.ctp:34 +#: Template/TransactionSignatures/add.ctp:23 +#: Template/TransactionSignatures/edit.ctp:29 +#: Template/TransactionTypes/add.ctp:24 +#: Template/TransactionTypes/edit.ctp:30 +#: Template/Transactions/add.ctp:41 +#: Template/Transactions/edit.ctp:47 +msgid "Submit" +msgstr "" + +#: Template/AddressTypes/edit.ctp:11 +#: Template/AddressTypes/index.ctp:37 +#: Template/AddressTypes/view.ctp:56 +#: Template/AddressTypes/view.ctp:83 +#: Template/AdminErrors/edit.ctp:11 +#: Template/AdminErrors/index.ctp:45 +#: Template/OperatorTypes/edit.ctp:11 +#: Template/OperatorTypes/index.ctp:35 +#: Template/OperatorTypes/view.ctp:54 +#: Template/Operators/edit.ctp:11 +#: Template/Operators/index.ctp:40 +#: Template/ServerUsers/edit.ctp:11 +#: Template/ServerUsers/index.ctp:43 +#: Template/StateBalances/edit.ctp:11 +#: Template/StateBalances/index.ctp:37 +#: Template/StateCreated/edit.ctp:11 +#: Template/StateCreated/index.ctp:45 +#: Template/StateErrors/edit.ctp:11 +#: Template/StateErrors/index.ctp:39 +#: Template/StateErrors/show_for_user.ctp:43 +#: Template/StateGroupAddresses/edit.ctp:11 +#: Template/StateGroupAddresses/index.ctp:37 +#: Template/StateGroupRelationships/edit.ctp:11 +#: Template/StateGroupRelationships/index.ctp:35 +#: Template/StateGroups/edit.ctp:11 +#: Template/StateGroups/index.ctp:41 +#: Template/StateGroups/view.ctp:60 +#: Template/StateGroups/view.ctp:87 +#: Template/StateGroups/view.ctp:116 +#: Template/StateGroups/view.ctp:145 +#: Template/StateRelationshipTypes/edit.ctp:11 +#: Template/StateRelationshipTypes/index.ctp:33 +#: Template/StateUsers/edit.ctp:11 +#: Template/StateUsers/index.ctp:49 +#: Template/StateUsers/view.ctp:62 +#: Template/StateUsers/view.ctp:95 +#: Template/StateUsers/view.ctp:124 +#: Template/StateUsers/view.ctp:157 +#: Template/TransactionCreations/edit.ctp:11 +#: Template/TransactionCreations/index.ctp:41 +#: Template/TransactionGroupAddaddress/edit.ctp:11 +#: Template/TransactionGroupAddaddress/index.ctp:37 +#: Template/TransactionGroupAllowtrades/edit.ctp:11 +#: Template/TransactionGroupAllowtrades/index.ctp:37 +#: Template/TransactionGroupCreates/edit.ctp:11 +#: Template/TransactionGroupCreates/index.ctp:39 +#: Template/TransactionSendCoins/edit.ctp:11 +#: Template/TransactionSendCoins/index.ctp:41 +#: Template/TransactionSignatures/edit.ctp:11 +#: Template/TransactionSignatures/index.ctp:33 +#: Template/TransactionTypes/edit.ctp:11 +#: Template/TransactionTypes/index.ctp:35 +#: Template/TransactionTypes/view.ctp:56 +#: Template/Transactions/edit.ctp:11 +#: Template/Transactions/view.ctp:80 +#: Template/Transactions/view.ctp:109 +#: Template/Transactions/view.ctp:136 +#: Template/Transactions/view.ctp:163 +#: Template/Transactions/view.ctp:192 +#: Template/Transactions/view.ctp:225 +#: Template/Transactions/view.ctp:252 +msgid "Delete" +msgstr "" + +#: Template/AddressTypes/edit.ctp:13 +#: Template/AddressTypes/index.ctp:37 +#: Template/AddressTypes/view.ctp:11 +#: Template/AddressTypes/view.ctp:56 +#: Template/AddressTypes/view.ctp:83 +#: Template/AdminErrors/edit.ctp:13 +#: Template/AdminErrors/index.ctp:45 +#: Template/AdminErrors/view.ctp:11 +#: Template/OperatorTypes/edit.ctp:13 +#: Template/OperatorTypes/index.ctp:35 +#: Template/OperatorTypes/view.ctp:11 +#: Template/OperatorTypes/view.ctp:54 +#: Template/Operators/edit.ctp:13 +#: Template/Operators/index.ctp:40 +#: Template/Operators/view.ctp:11 +#: Template/ServerUsers/edit.ctp:13 +#: Template/ServerUsers/index.ctp:43 +#: Template/ServerUsers/view.ctp:11 +#: Template/StateBalances/edit.ctp:13 +#: Template/StateBalances/index.ctp:37 +#: Template/StateBalances/view.ctp:11 +#: Template/StateCreated/edit.ctp:13 +#: Template/StateCreated/index.ctp:45 +#: Template/StateCreated/view.ctp:11 +#: Template/StateErrors/edit.ctp:13 +#: Template/StateErrors/index.ctp:39 +#: Template/StateErrors/view.ctp:11 +#: Template/StateGroupAddresses/edit.ctp:13 +#: Template/StateGroupAddresses/index.ctp:37 +#: Template/StateGroupAddresses/view.ctp:11 +#: Template/StateGroupRelationships/edit.ctp:13 +#: Template/StateGroupRelationships/index.ctp:35 +#: Template/StateGroupRelationships/view.ctp:11 +#: Template/StateGroups/edit.ctp:13 +#: Template/StateGroups/index.ctp:41 +#: Template/StateGroups/view.ctp:11 +#: Template/StateGroups/view.ctp:60 +#: Template/StateGroups/view.ctp:87 +#: Template/StateGroups/view.ctp:116 +#: Template/StateGroups/view.ctp:145 +#: Template/StateRelationshipTypes/edit.ctp:13 +#: Template/StateRelationshipTypes/index.ctp:33 +#: Template/StateRelationshipTypes/view.ctp:11 +#: Template/StateUsers/edit.ctp:13 +#: Template/StateUsers/index.ctp:49 +#: Template/StateUsers/view.ctp:11 +#: Template/StateUsers/view.ctp:62 +#: Template/StateUsers/view.ctp:95 +#: Template/StateUsers/view.ctp:124 +#: Template/StateUsers/view.ctp:157 +#: Template/TransactionCreations/edit.ctp:13 +#: Template/TransactionCreations/index.ctp:41 +#: Template/TransactionCreations/view.ctp:11 +#: Template/TransactionGroupAddaddress/edit.ctp:13 +#: Template/TransactionGroupAddaddress/index.ctp:37 +#: Template/TransactionGroupAddaddress/view.ctp:11 +#: Template/TransactionGroupAllowtrades/edit.ctp:13 +#: Template/TransactionGroupAllowtrades/index.ctp:37 +#: Template/TransactionGroupAllowtrades/view.ctp:11 +#: Template/TransactionGroupCreates/edit.ctp:13 +#: Template/TransactionGroupCreates/index.ctp:39 +#: Template/TransactionGroupCreates/view.ctp:11 +#: Template/TransactionSendCoins/edit.ctp:13 +#: Template/TransactionSendCoins/index.ctp:41 +#: Template/TransactionSendCoins/view.ctp:11 +#: Template/TransactionSignatures/edit.ctp:13 +#: Template/TransactionSignatures/index.ctp:33 +#: Template/TransactionSignatures/view.ctp:11 +#: Template/TransactionTypes/edit.ctp:13 +#: Template/TransactionTypes/index.ctp:35 +#: Template/TransactionTypes/view.ctp:11 +#: Template/TransactionTypes/view.ctp:56 +#: Template/Transactions/edit.ctp:13 +#: Template/Transactions/view.ctp:11 +#: Template/Transactions/view.ctp:80 +#: Template/Transactions/view.ctp:109 +#: Template/Transactions/view.ctp:136 +#: Template/Transactions/view.ctp:163 +#: Template/Transactions/view.ctp:192 +#: Template/Transactions/view.ctp:225 +#: Template/Transactions/view.ctp:252 +msgid "Are you sure you want to delete # {0}?" +msgstr "" + +#: Template/AddressTypes/edit.ctp:26 +#: Template/AddressTypes/view.ctp:10 +msgid "Edit Address Type" +msgstr "" + +#: Template/AddressTypes/index.ctp:10 +#: Template/AddressTypes/view.ctp:13 +#: Template/StateGroupAddresses/add.ctp:14 +#: Template/StateGroupAddresses/edit.ctp:20 +#: Template/StateGroupAddresses/index.ctp:14 +#: Template/StateGroupAddresses/view.ctp:17 +#: Template/TransactionGroupAddaddress/add.ctp:14 +#: Template/TransactionGroupAddaddress/edit.ctp:20 +#: Template/TransactionGroupAddaddress/index.ctp:14 +#: Template/TransactionGroupAddaddress/view.ctp:17 +msgid "New Address Type" +msgstr "" + +#: Template/AddressTypes/index.ctp:18 +msgid "Address Types" +msgstr "" + +#: Template/AddressTypes/index.ctp:35 +#: Template/AddressTypes/view.ctp:54 +#: Template/AddressTypes/view.ctp:81 +#: Template/AdminErrors/index.ctp:43 +#: Template/OperatorTypes/index.ctp:33 +#: Template/OperatorTypes/view.ctp:52 +#: Template/Operators/index.ctp:38 +#: Template/ServerUsers/index.ctp:41 +#: Template/StateBalances/index.ctp:35 +#: Template/StateCreated/index.ctp:43 +#: Template/StateErrors/index.ctp:37 +#: Template/StateGroupAddresses/index.ctp:35 +#: Template/StateGroupRelationships/index.ctp:33 +#: Template/StateGroups/index.ctp:39 +#: Template/StateGroups/view.ctp:58 +#: Template/StateGroups/view.ctp:85 +#: Template/StateGroups/view.ctp:114 +#: Template/StateGroups/view.ctp:143 +#: Template/StateRelationshipTypes/index.ctp:31 +#: Template/StateUsers/index.ctp:47 +#: Template/StateUsers/view.ctp:60 +#: Template/StateUsers/view.ctp:93 +#: Template/StateUsers/view.ctp:122 +#: Template/StateUsers/view.ctp:155 +#: Template/TransactionCreations/index.ctp:39 +#: Template/TransactionGroupAddaddress/index.ctp:35 +#: Template/TransactionGroupAllowtrades/index.ctp:35 +#: Template/TransactionGroupCreates/index.ctp:37 +#: Template/TransactionSendCoins/index.ctp:39 +#: Template/TransactionSignatures/index.ctp:31 +#: Template/TransactionTypes/index.ctp:33 +#: Template/TransactionTypes/view.ctp:54 +#: Template/Transactions/view.ctp:78 +#: Template/Transactions/view.ctp:107 +#: Template/Transactions/view.ctp:134 +#: Template/Transactions/view.ctp:161 +#: Template/Transactions/view.ctp:190 +#: Template/Transactions/view.ctp:223 +#: Template/Transactions/view.ctp:250 +msgid "View" +msgstr "" + +#: Template/AddressTypes/index.ctp:36 +#: Template/AddressTypes/view.ctp:55 +#: Template/AddressTypes/view.ctp:82 +#: Template/AdminErrors/index.ctp:44 +#: Template/OperatorTypes/index.ctp:34 +#: Template/OperatorTypes/view.ctp:53 +#: Template/Operators/index.ctp:39 +#: Template/ServerUsers/index.ctp:42 +#: Template/StateBalances/index.ctp:36 +#: Template/StateCreated/index.ctp:44 +#: Template/StateErrors/index.ctp:38 +#: Template/StateGroupAddresses/index.ctp:36 +#: Template/StateGroupRelationships/index.ctp:34 +#: Template/StateGroups/index.ctp:40 +#: Template/StateGroups/view.ctp:59 +#: Template/StateGroups/view.ctp:86 +#: Template/StateGroups/view.ctp:115 +#: Template/StateGroups/view.ctp:144 +#: Template/StateRelationshipTypes/index.ctp:32 +#: Template/StateUsers/index.ctp:48 +#: Template/StateUsers/view.ctp:61 +#: Template/StateUsers/view.ctp:94 +#: Template/StateUsers/view.ctp:123 +#: Template/StateUsers/view.ctp:156 +#: Template/TransactionCreations/index.ctp:40 +#: Template/TransactionGroupAddaddress/index.ctp:36 +#: Template/TransactionGroupAllowtrades/index.ctp:36 +#: Template/TransactionGroupCreates/index.ctp:38 +#: Template/TransactionSendCoins/index.ctp:40 +#: Template/TransactionSignatures/index.ctp:32 +#: Template/TransactionTypes/index.ctp:34 +#: Template/TransactionTypes/view.ctp:55 +#: Template/Transactions/view.ctp:79 +#: Template/Transactions/view.ctp:108 +#: Template/Transactions/view.ctp:135 +#: Template/Transactions/view.ctp:162 +#: Template/Transactions/view.ctp:191 +#: Template/Transactions/view.ctp:224 +#: Template/Transactions/view.ctp:251 +msgid "Edit" +msgstr "" + +#: Template/AddressTypes/index.ctp:45 +#: Template/AdminErrors/index.ctp:53 +#: Template/OperatorTypes/index.ctp:43 +#: Template/Operators/index.ctp:48 +#: Template/ServerUsers/index.ctp:51 +#: Template/StateBalances/index.ctp:45 +#: Template/StateCreated/index.ctp:53 +#: Template/StateErrors/index.ctp:47 +#: Template/StateGroupAddresses/index.ctp:45 +#: Template/StateGroupRelationships/index.ctp:43 +#: Template/StateGroups/index.ctp:49 +#: Template/StateRelationshipTypes/index.ctp:41 +#: Template/StateUsers/index.ctp:57 +#: Template/TransactionCreations/index.ctp:49 +#: Template/TransactionGroupAddaddress/index.ctp:45 +#: Template/TransactionGroupAllowtrades/index.ctp:45 +#: Template/TransactionGroupCreates/index.ctp:47 +#: Template/TransactionSendCoins/index.ctp:49 +#: Template/TransactionSignatures/index.ctp:41 +#: Template/TransactionTypes/index.ctp:43 +#: Template/Transactions/index.ctp:56 +msgid "first" +msgstr "" + +#: Template/AddressTypes/index.ctp:46 +#: Template/AdminErrors/index.ctp:54 +#: Template/OperatorTypes/index.ctp:44 +#: Template/Operators/index.ctp:49 +#: Template/ServerUsers/index.ctp:52 +#: Template/StateBalances/index.ctp:46 +#: Template/StateCreated/index.ctp:54 +#: Template/StateErrors/index.ctp:48 +#: Template/StateGroupAddresses/index.ctp:46 +#: Template/StateGroupRelationships/index.ctp:44 +#: Template/StateGroups/index.ctp:50 +#: Template/StateRelationshipTypes/index.ctp:42 +#: Template/StateUsers/index.ctp:58 +#: Template/TransactionCreations/index.ctp:50 +#: Template/TransactionGroupAddaddress/index.ctp:46 +#: Template/TransactionGroupAllowtrades/index.ctp:46 +#: Template/TransactionGroupCreates/index.ctp:48 +#: Template/TransactionSendCoins/index.ctp:50 +#: Template/TransactionSignatures/index.ctp:42 +#: Template/TransactionTypes/index.ctp:44 +#: Template/Transactions/index.ctp:57 +msgid "previous" +msgstr "" + +#: Template/AddressTypes/index.ctp:48 +#: Template/AdminErrors/index.ctp:56 +#: Template/OperatorTypes/index.ctp:46 +#: Template/Operators/index.ctp:51 +#: Template/ServerUsers/index.ctp:54 +#: Template/StateBalances/index.ctp:48 +#: Template/StateCreated/index.ctp:56 +#: Template/StateErrors/index.ctp:50 +#: Template/StateGroupAddresses/index.ctp:48 +#: Template/StateGroupRelationships/index.ctp:46 +#: Template/StateGroups/index.ctp:52 +#: Template/StateRelationshipTypes/index.ctp:44 +#: Template/StateUsers/index.ctp:60 +#: Template/TransactionCreations/index.ctp:52 +#: Template/TransactionGroupAddaddress/index.ctp:48 +#: Template/TransactionGroupAllowtrades/index.ctp:48 +#: Template/TransactionGroupCreates/index.ctp:50 +#: Template/TransactionSendCoins/index.ctp:52 +#: Template/TransactionSignatures/index.ctp:44 +#: Template/TransactionTypes/index.ctp:46 +#: Template/Transactions/index.ctp:59 +msgid "next" +msgstr "" + +#: Template/AddressTypes/index.ctp:49 +#: Template/AdminErrors/index.ctp:57 +#: Template/OperatorTypes/index.ctp:47 +#: Template/Operators/index.ctp:52 +#: Template/ServerUsers/index.ctp:55 +#: Template/StateBalances/index.ctp:49 +#: Template/StateCreated/index.ctp:57 +#: Template/StateErrors/index.ctp:51 +#: Template/StateGroupAddresses/index.ctp:49 +#: Template/StateGroupRelationships/index.ctp:47 +#: Template/StateGroups/index.ctp:53 +#: Template/StateRelationshipTypes/index.ctp:45 +#: Template/StateUsers/index.ctp:61 +#: Template/TransactionCreations/index.ctp:53 +#: Template/TransactionGroupAddaddress/index.ctp:49 +#: Template/TransactionGroupAllowtrades/index.ctp:49 +#: Template/TransactionGroupCreates/index.ctp:51 +#: Template/TransactionSendCoins/index.ctp:53 +#: Template/TransactionSignatures/index.ctp:45 +#: Template/TransactionTypes/index.ctp:47 +#: Template/Transactions/index.ctp:60 +msgid "last" +msgstr "" + +#: Template/AddressTypes/index.ctp:51 +#: Template/AdminErrors/index.ctp:59 +#: Template/OperatorTypes/index.ctp:49 +#: Template/Operators/index.ctp:54 +#: Template/ServerUsers/index.ctp:57 +#: Template/StateBalances/index.ctp:51 +#: Template/StateCreated/index.ctp:59 +#: Template/StateErrors/index.ctp:53 +#: Template/StateGroupAddresses/index.ctp:51 +#: Template/StateGroupRelationships/index.ctp:49 +#: Template/StateGroups/index.ctp:55 +#: Template/StateRelationshipTypes/index.ctp:47 +#: Template/StateUsers/index.ctp:63 +#: Template/TransactionCreations/index.ctp:55 +#: Template/TransactionGroupAddaddress/index.ctp:51 +#: Template/TransactionGroupAllowtrades/index.ctp:51 +#: Template/TransactionGroupCreates/index.ctp:53 +#: Template/TransactionSendCoins/index.ctp:55 +#: Template/TransactionSignatures/index.ctp:47 +#: Template/TransactionTypes/index.ctp:49 +#: Template/Transactions/index.ctp:62 +msgid "Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total" +msgstr "" + +#: Template/AddressTypes/view.ctp:11 +msgid "Delete Address Type" +msgstr "" + +#: Template/AddressTypes/view.ctp:24 +#: Template/OperatorTypes/view.ctp:22 +#: Template/StateGroups/view.ctp:28 +#: Template/StateGroups/view.ctp:103 +#: Template/StateRelationshipTypes/view.ctp:20 +#: Template/TransactionGroupCreates/view.ctp:32 +#: Template/TransactionTypes/view.ctp:22 +#: Template/Transactions/view.ctp:179 +msgid "Name" +msgstr "" + +#: Template/AddressTypes/view.ctp:28 +#: Template/OperatorTypes/view.ctp:26 +#: Template/StateRelationshipTypes/view.ctp:24 +#: Template/TransactionTypes/view.ctp:26 +msgid "Text" +msgstr "" + +#: Template/AddressTypes/view.ctp:32 +#: Template/AddressTypes/view.ctp:41 +#: Template/AddressTypes/view.ctp:68 +#: Template/AdminErrors/view.ctp:46 +#: Template/OperatorTypes/view.ctp:30 +#: Template/OperatorTypes/view.ctp:39 +#: Template/Operators/view.ctp:32 +#: Template/ServerUsers/view.ctp:36 +#: Template/StateBalances/view.ctp:26 +#: Template/StateCreated/view.ctp:32 +#: Template/StateErrors/view.ctp:32 +#: Template/StateGroupAddresses/view.ctp:32 +#: Template/StateGroupRelationships/view.ctp:20 +#: Template/StateGroups/view.ctp:32 +#: Template/StateGroups/view.ctp:45 +#: Template/StateGroups/view.ctp:72 +#: Template/StateGroups/view.ctp:99 +#: Template/StateGroups/view.ctp:128 +#: Template/StateRelationshipTypes/view.ctp:28 +#: Template/StateUsers/view.ctp:34 +#: Template/StateUsers/view.ctp:47 +#: Template/StateUsers/view.ctp:74 +#: Template/StateUsers/view.ctp:107 +#: Template/StateUsers/view.ctp:136 +#: Template/TransactionCreations/view.ctp:32 +#: Template/TransactionGroupAddaddress/view.ctp:32 +#: Template/TransactionGroupAllowtrades/view.ctp:26 +#: Template/TransactionGroupCreates/view.ctp:36 +#: Template/TransactionSendCoins/view.ctp:32 +#: Template/TransactionSignatures/view.ctp:26 +#: Template/TransactionTypes/view.ctp:30 +#: Template/TransactionTypes/view.ctp:39 +#: Template/Transactions/view.ctp:46 +#: Template/Transactions/view.ctp:59 +#: Template/Transactions/view.ctp:92 +#: Template/Transactions/view.ctp:121 +#: Template/Transactions/view.ctp:148 +#: Template/Transactions/view.ctp:175 +#: Template/Transactions/view.ctp:204 +#: Template/Transactions/view.ctp:237 +msgid "Id" +msgstr "" + +#: Template/AddressTypes/view.ctp:37 +#: Template/StateGroups/view.ctp:41 +msgid "Related State Group Addresses" +msgstr "" + +#: Template/AddressTypes/view.ctp:42 +#: Template/StateGroups/view.ctp:46 +#: Template/StateGroups/view.ctp:74 +#: Template/StateGroups/view.ctp:102 +#: Template/StateGroups/view.ctp:129 +#: Template/TransactionTypes/view.ctp:40 +#: Template/Transactions/view.ctp:178 +msgid "State Group Id" +msgstr "" + +#: Template/AddressTypes/view.ctp:43 +#: Template/AddressTypes/view.ctp:71 +#: Template/StateGroups/view.ctp:47 +#: Template/StateGroups/view.ctp:75 +#: Template/Transactions/view.ctp:124 +msgid "Public Key" +msgstr "" + +#: Template/AddressTypes/view.ctp:44 +#: Template/AddressTypes/view.ctp:70 +#: Template/StateGroups/view.ctp:48 +#: Template/Transactions/view.ctp:123 +msgid "Address Type Id" +msgstr "" + +#: Template/AddressTypes/view.ctp:64 +#: Template/Transactions/view.ctp:117 +msgid "Related Transaction Group Addaddress" +msgstr "" + +#: Template/AddressTypes/view.ctp:69 +#: Template/StateGroups/view.ctp:100 +#: Template/StateUsers/view.ctp:75 +#: Template/StateUsers/view.ctp:108 +#: Template/StateUsers/view.ctp:137 +#: Template/Transactions/view.ctp:60 +#: Template/Transactions/view.ctp:93 +#: Template/Transactions/view.ctp:122 +#: Template/Transactions/view.ctp:149 +#: Template/Transactions/view.ctp:176 +#: Template/Transactions/view.ctp:205 +#: Template/Transactions/view.ctp:238 +msgid "Transaction Id" +msgstr "" + +#: Template/AdminErrors/add.ctp:10 +#: Template/AdminErrors/edit.ctp:16 +#: Template/AdminErrors/view.ctp:12 +msgid "List Admin Errors" +msgstr "" + +#: Template/AdminErrors/add.ctp:11 +#: Template/AdminErrors/edit.ctp:17 +#: Template/AdminErrors/index.ctp:11 +#: Template/AdminErrors/view.ctp:14 +#: Template/StateBalances/add.ctp:11 +#: Template/StateBalances/edit.ctp:17 +#: Template/StateBalances/index.ctp:11 +#: Template/StateBalances/view.ctp:14 +#: Template/StateCreated/add.ctp:13 +#: Template/StateCreated/edit.ctp:19 +#: Template/StateCreated/index.ctp:13 +#: Template/StateCreated/view.ctp:16 +#: Template/StateErrors/add.ctp:11 +#: Template/StateErrors/edit.ctp:17 +#: Template/StateErrors/index.ctp:11 +#: Template/StateErrors/view.ctp:14 +#: Template/StateGroups/add.ctp:13 +#: Template/StateGroups/edit.ctp:19 +#: Template/StateGroups/index.ctp:13 +#: Template/StateGroups/view.ctp:16 +#: Template/StateUsers/add.ctp:10 +#: Template/StateUsers/edit.ctp:16 +#: Template/StateUsers/view.ctp:12 +#: Template/TransactionCreations/add.ctp:13 +#: Template/TransactionCreations/edit.ctp:19 +#: Template/TransactionCreations/index.ctp:13 +#: Template/TransactionCreations/view.ctp:16 +#: Template/TransactionSendCoins/add.ctp:13 +#: Template/TransactionSendCoins/edit.ctp:19 +#: Template/TransactionSendCoins/index.ctp:13 +#: Template/TransactionSendCoins/view.ctp:16 +msgid "List State Users" +msgstr "" + +#: Template/AdminErrors/add.ctp:12 +#: Template/AdminErrors/edit.ctp:18 +#: Template/AdminErrors/index.ctp:12 +#: Template/AdminErrors/view.ctp:15 +#: Template/StateBalances/add.ctp:12 +#: Template/StateBalances/edit.ctp:18 +#: Template/StateBalances/index.ctp:12 +#: Template/StateBalances/view.ctp:15 +#: Template/StateCreated/add.ctp:14 +#: Template/StateCreated/edit.ctp:20 +#: Template/StateCreated/index.ctp:14 +#: Template/StateCreated/view.ctp:17 +#: Template/StateErrors/add.ctp:12 +#: Template/StateErrors/edit.ctp:18 +#: Template/StateErrors/index.ctp:12 +#: Template/StateErrors/view.ctp:15 +#: Template/StateGroups/add.ctp:14 +#: Template/StateGroups/edit.ctp:20 +#: Template/StateGroups/index.ctp:14 +#: Template/StateGroups/view.ctp:17 +#: Template/StateUsers/index.ctp:10 +#: Template/StateUsers/view.ctp:13 +#: Template/TransactionCreations/add.ctp:14 +#: Template/TransactionCreations/edit.ctp:20 +#: Template/TransactionCreations/index.ctp:14 +#: Template/TransactionCreations/view.ctp:17 +#: Template/TransactionSendCoins/add.ctp:14 +#: Template/TransactionSendCoins/edit.ctp:20 +#: Template/TransactionSendCoins/index.ctp:14 +#: Template/TransactionSendCoins/view.ctp:17 +msgid "New State User" +msgstr "" + +#: Template/AdminErrors/add.ctp:18 +msgid "Add Admin Error" +msgstr "" + +#: Template/AdminErrors/edit.ctp:24 +#: Template/AdminErrors/view.ctp:10 +msgid "Edit Admin Error" +msgstr "" + +#: Template/AdminErrors/index.ctp:10 +#: Template/AdminErrors/view.ctp:13 +msgid "New Admin Error" +msgstr "" + +#: Template/AdminErrors/index.ctp:16 +msgid "Admin Errors" +msgstr "" + +#: Template/AdminErrors/view.ctp:11 +msgid "Delete Admin Error" +msgstr "" + +#: Template/AdminErrors/view.ctp:22 +#: Template/StateBalances/view.ctp:22 +#: Template/StateCreated/view.ctp:28 +#: Template/StateErrors/view.ctp:24 +#: Template/TransactionCreations/view.ctp:28 +#: Template/TransactionSendCoins/view.ctp:28 +msgid "State User" +msgstr "" + +#: Template/AdminErrors/view.ctp:26 +msgid "Controller" +msgstr "" + +#: Template/AdminErrors/view.ctp:30 +msgid "Action" +msgstr "" + +#: Template/AdminErrors/view.ctp:34 +msgid "State" +msgstr "" + +#: Template/AdminErrors/view.ctp:38 +msgid "Msg" +msgstr "" + +#: Template/AdminErrors/view.ctp:42 +msgid "Details" +msgstr "" + +#: Template/AdminErrors/view.ctp:50 +#: Template/ServerUsers/view.ctp:44 +#: Template/StateCreated/view.ctp:48 +#: Template/StateErrors/view.ctp:36 +#: Template/StateUsers/view.ctp:79 +#: Template/Transactions/view.ctp:64 +msgid "Created" +msgstr "" + +#: Template/Dashboard/error_http_request.ctp:9 +msgid "Error, Please try again" +msgstr "" + +#: Template/Dashboard/error_http_request.ctp:13 +#: Template/Layout/error.ctp:43 +msgid "Back" +msgstr "" + +#: Template/Dashboard/index.ctp:12 +#: Template/Dashboard/server_index.ctp:9 +msgid "Willkommen" +msgstr "" + +#: Template/Dashboard/index.ctp:22 +msgid "übersicht" +msgstr "" + +#: Template/Dashboard/index.ctp:27 +msgid "überweisen" +msgstr "" + +#: Template/Dashboard/index.ctp:34 +msgid "löschen" +msgstr "" + +#: Template/Dashboard/index.ctp:40 +#: Template/Dashboard/server_index.ctp:16 +msgid "einzeln schöpfen" +msgstr "" + +#: Template/Dashboard/index.ctp:45 +#: Template/Dashboard/server_index.ctp:21 +msgid "viele schöpfen" +msgstr "" + +#: Template/Dashboard/index.ctp:51 +#: Template/Dashboard/server_index.ctp:27 +#: Template/Element/navi_header.ctp:33 +msgid "Fehler" +msgstr "" + +#: Template/Dashboard/index.ctp:59 +#: Template/StateUsers/search.ctp:9 +msgid "Benutzer suchen" +msgstr "" + +#: Template/Dashboard/index.ctp:64 +msgid "Benutzer hinzufügen" +msgstr "" + +#: Template/Element/navi.ctp:25 +#: Template/StateBalances/overview.ctp:8 +msgid "Kontoübersicht" +msgstr "" + +#: Template/Element/navi.ctp:35 +#: Template/Layout/frontend.ctp:69 +#: Template/Layout/frontend_ripple.ctp:105 +msgid "Startseite" +msgstr "" + +#: Template/Element/navi.ctp:36 +#: Template/TransactionSendCoins/create.ctp:9 +msgid "Überweisung" +msgstr "" + +#: Template/Element/navi.ctp:44 +msgid "Abmelden" +msgstr "" + +#: Template/Element/navi_header.ctp:38 +msgid "Transaktionen sind noch zu unterzeichnen" +msgstr "" + +#: Template/Element/Flash/success.ctp:9 +msgid "Info:" +msgstr "" + +#: Template/Email/text/notification_creation.ctp:8 +msgid "Gradido Schöpfung" +msgstr "" + +#: Template/Email/text/notification_creation.ctp:9 +#: Template/Email/text/notification_transfer.ctp:11 +msgid "Hallo" +msgstr "" + +#: Template/Email/text/notification_creation.ctp:11 +msgid "Für dich wurden soeben {0} geschöpft." +msgstr "" + +#: Template/Email/text/notification_creation.ctp:16 +msgid "Bitte antworte nicht auf diese E-Mail!" +msgstr "" + +#: Template/Email/text/notification_creation.ctp:18 +#: Template/Email/text/notification_transfer.ctp:20 +msgid "Mit freundlichen Grüßen" +msgstr "" + +#: Template/Email/text/notification_transfer.ctp:8 +msgid "Gradido Überweisung" +msgstr "" + +#: Template/Email/text/notification_transfer.ctp:13 +msgid "Du hast soeben {0} von {1} erhalten." +msgstr "" + +#: Template/Email/text/notification_transfer.ctp:14 +msgid "{0} schreibt:" +msgstr "" + +#: Template/Email/text/notification_transfer.ctp:18 +msgid "Du kannst {0} eine Nachricht schreiben, indem du auf diese E-Mail antwortest" +msgstr "" + +#: Template/Layout/default.ctp:45 +#: Template/Layout/frontend.ctp:78 +msgid "Logout" +msgstr "" + +#: Template/Layout/error.ctp:35 +msgid "Error" +msgstr "" + +#: Template/Layout/frontend.ctp:60 +msgid "Fehler " +msgstr "" + +#: Template/Layout/frontend.ctp:70 +msgid "Kontostand" +msgstr "" + +#: Template/Layout/frontend.ctp:74 +msgid "Transaktionen unterzeichnen" +msgstr "" + +#: Template/Layout/frontend_ripple.ctp:44 +msgid "Community Server in Entwicklung" +msgstr "" + +#: Template/Layout/frontend_ripple.ctp:121 +msgid "Datenschutzerklärung" +msgstr "" + +#: Template/Layout/frontend_ripple.ctp:122 +msgid "Impressum" +msgstr "" + +#: Template/OperatorTypes/add.ctp:10 +#: Template/OperatorTypes/edit.ctp:16 +#: Template/OperatorTypes/view.ctp:12 +msgid "List Operator Types" +msgstr "" + +#: Template/OperatorTypes/add.ctp:11 +#: Template/OperatorTypes/edit.ctp:17 +#: Template/OperatorTypes/index.ctp:11 +#: Template/OperatorTypes/view.ctp:14 +#: Template/Operators/add.ctp:10 +#: Template/Operators/edit.ctp:16 +#: Template/Operators/view.ctp:12 +msgid "List Operators" +msgstr "" + +#: Template/OperatorTypes/add.ctp:12 +#: Template/OperatorTypes/edit.ctp:18 +#: Template/OperatorTypes/index.ctp:12 +#: Template/OperatorTypes/view.ctp:15 +#: Template/Operators/index.ctp:10 +#: Template/Operators/view.ctp:13 +msgid "New Operator" +msgstr "" + +#: Template/OperatorTypes/add.ctp:18 +msgid "Add Operator Type" +msgstr "" + +#: Template/OperatorTypes/edit.ctp:24 +#: Template/OperatorTypes/view.ctp:10 +msgid "Edit Operator Type" +msgstr "" + +#: Template/OperatorTypes/index.ctp:10 +#: Template/OperatorTypes/view.ctp:13 +msgid "New Operator Type" +msgstr "" + +#: Template/OperatorTypes/index.ctp:16 +msgid "Operator Types" +msgstr "" + +#: Template/OperatorTypes/view.ctp:11 +msgid "Delete Operator Type" +msgstr "" + +#: Template/OperatorTypes/view.ctp:35 +msgid "Related Operators" +msgstr "" + +#: Template/OperatorTypes/view.ctp:40 +#: Template/Operators/view.ctp:20 +#: Template/ServerUsers/view.ctp:20 +msgid "Username" +msgstr "" + +#: Template/OperatorTypes/view.ctp:41 +#: Template/Operators/view.ctp:36 +msgid "Operator Type Id" +msgstr "" + +#: Template/OperatorTypes/view.ctp:42 +#: Template/Operators/view.ctp:28 +msgid "Data Base64" +msgstr "" + +#: Template/Operators/add.ctp:16 +msgid "Add Operator" +msgstr "" + +#: Template/Operators/edit.ctp:22 +#: Template/Operators/view.ctp:10 +msgid "Edit Operator" +msgstr "" + +#: Template/Operators/index.ctp:14 +msgid "Operators" +msgstr "" + +#: Template/Operators/view.ctp:11 +msgid "Delete Operator" +msgstr "" + +#: Template/Operators/view.ctp:24 +msgid "User Pubkey" +msgstr "" + +#: Template/ServerUsers/add.ctp:10 +#: Template/ServerUsers/edit.ctp:16 +#: Template/ServerUsers/view.ctp:12 +msgid "List Server Users" +msgstr "" + +#: Template/ServerUsers/add.ctp:16 +msgid "Add Server User" +msgstr "" + +#: Template/ServerUsers/edit.ctp:22 +#: Template/ServerUsers/view.ctp:10 +msgid "Edit Server User" +msgstr "" + +#: Template/ServerUsers/index.ctp:10 +#: Template/ServerUsers/view.ctp:13 +msgid "New Server User" +msgstr "" + +#: Template/ServerUsers/index.ctp:14 +msgid "Server Users" +msgstr "" + +#: Template/ServerUsers/login.ctp:13 +msgid "Please enter your username and password" +msgstr "" + +#: Template/ServerUsers/login.ctp:17 +msgid "Login" +msgstr "" + +#: Template/ServerUsers/view.ctp:11 +msgid "Delete Server User" +msgstr "" + +#: Template/ServerUsers/view.ctp:24 +msgid "Password" +msgstr "" + +#: Template/ServerUsers/view.ctp:28 +msgid "Email" +msgstr "" + +#: Template/ServerUsers/view.ctp:32 +msgid "Role" +msgstr "" + +#: Template/ServerUsers/view.ctp:40 +msgid "Last Login" +msgstr "" + +#: Template/ServerUsers/view.ctp:48 +#: Template/StateBalances/view.ctp:34 +#: Template/StateUsers/view.ctp:49 +msgid "Modified" +msgstr "" + +#: Template/ServerUsers/view.ctp:52 +msgid "Activated" +msgstr "" + +#: Template/ServerUsers/view.ctp:53 +#: Template/TransactionGroupAllowtrades/view.ctp:35 +msgid "Yes" +msgstr "" + +#: Template/ServerUsers/view.ctp:53 +#: Template/TransactionGroupAllowtrades/view.ctp:35 +msgid "No" +msgstr "" + +#: Template/StateBalances/add.ctp:10 +#: Template/StateBalances/edit.ctp:16 +#: Template/StateBalances/view.ctp:12 +#: Template/StateUsers/add.ctp:13 +#: Template/StateUsers/edit.ctp:19 +#: Template/StateUsers/index.ctp:13 +#: Template/StateUsers/view.ctp:16 +msgid "List State Balances" +msgstr "" + +#: Template/StateBalances/add.ctp:18 +msgid "Add State Balance" +msgstr "" + +#: Template/StateBalances/edit.ctp:24 +#: Template/StateBalances/view.ctp:10 +msgid "Edit State Balance" +msgstr "" + +#: Template/StateBalances/index.ctp:10 +#: Template/StateBalances/view.ctp:13 +#: Template/StateUsers/add.ctp:14 +#: Template/StateUsers/edit.ctp:20 +#: Template/StateUsers/index.ctp:14 +#: Template/StateUsers/view.ctp:17 +msgid "New State Balance" +msgstr "" + +#: Template/StateBalances/index.ctp:16 +msgid "State Balances" +msgstr "" + +#: Template/StateBalances/overview.ctp:15 +msgid "Aktueller Kontostand: " +msgstr "" + +#: Template/StateBalances/overview.ctp:42 +msgid "Absender" +msgstr "" + +#: Template/StateBalances/overview.ctp:43 +#: Template/TransactionSendCoins/create.ctp:30 +msgid "Verwendungszweck" +msgstr "" + +#: Template/StateBalances/overview.ctp:44 +msgid "Datum" +msgstr "" + +#: Template/StateBalances/overview.ctp:45 +msgid "Betrag" +msgstr "" + +#: Template/StateBalances/overview.ctp:46 +msgid "Transaktions Nr." +msgstr "" + +#: Template/StateBalances/overview.ctp:46 +msgid "Nr" +msgstr "" + +#: Template/StateBalances/overview.ctp:79 +msgid "Geschöpft" +msgstr "" + +#: Template/StateBalances/overview.ctp:81 +msgid "Gesendet" +msgstr "" + +#: Template/StateBalances/overview.ctp:83 +msgid "Empfangen" +msgstr "" + +#: Template/StateBalances/overview.ctp:118 +#: Template/TransactionCreations/create_multi.ctp:167 +msgid "Laufende Transaktion" +msgstr "" + +#: Template/StateBalances/overview.ctp:120 +#: Template/TransactionCreations/create_multi.ctp:169 +msgid "Laufende Transaktionen" +msgstr "" + +#: Template/StateBalances/view.ctp:11 +msgid "Delete State Balance" +msgstr "" + +#: Template/StateBalances/view.ctp:30 +#: Template/StateUsers/view.ctp:50 +#: Template/StateUsers/view.ctp:110 +#: Template/StateUsers/view.ctp:141 +#: Template/TransactionCreations/view.ctp:36 +#: Template/TransactionSendCoins/view.ctp:36 +#: Template/Transactions/view.ctp:95 +#: Template/Transactions/view.ctp:209 +msgid "Amount" +msgstr "" + +#: Template/StateCreated/add.ctp:10 +#: Template/StateCreated/edit.ctp:16 +#: Template/StateCreated/view.ctp:12 +#: Template/StateUsers/add.ctp:15 +#: Template/StateUsers/edit.ctp:21 +#: Template/StateUsers/index.ctp:15 +#: Template/StateUsers/view.ctp:18 +#: Template/Transactions/add.ctp:15 +#: Template/Transactions/edit.ctp:21 +#: Template/Transactions/index.ctp:15 +#: Template/Transactions/view.ctp:18 +msgid "List State Created" +msgstr "" + +#: Template/StateCreated/add.ctp:11 +#: Template/StateCreated/edit.ctp:17 +#: Template/StateCreated/index.ctp:11 +#: Template/StateCreated/view.ctp:14 +#: Template/StateGroups/add.ctp:17 +#: Template/StateGroups/edit.ctp:23 +#: Template/StateGroups/index.ctp:17 +#: Template/StateGroups/view.ctp:20 +#: Template/TransactionCreations/add.ctp:11 +#: Template/TransactionCreations/edit.ctp:17 +#: Template/TransactionCreations/index.ctp:11 +#: Template/TransactionCreations/view.ctp:14 +#: Template/TransactionGroupAddaddress/add.ctp:11 +#: Template/TransactionGroupAddaddress/edit.ctp:17 +#: Template/TransactionGroupAddaddress/index.ctp:11 +#: Template/TransactionGroupAddaddress/view.ctp:14 +#: Template/TransactionGroupAllowtrades/add.ctp:11 +#: Template/TransactionGroupAllowtrades/edit.ctp:17 +#: Template/TransactionGroupAllowtrades/index.ctp:11 +#: Template/TransactionGroupAllowtrades/view.ctp:14 +#: Template/TransactionGroupCreates/add.ctp:11 +#: Template/TransactionGroupCreates/edit.ctp:17 +#: Template/TransactionGroupCreates/index.ctp:11 +#: Template/TransactionGroupCreates/view.ctp:14 +#: Template/TransactionSendCoins/add.ctp:11 +#: Template/TransactionSendCoins/edit.ctp:17 +#: Template/TransactionSendCoins/index.ctp:11 +#: Template/TransactionSendCoins/view.ctp:14 +#: Template/TransactionSignatures/add.ctp:11 +#: Template/TransactionSignatures/edit.ctp:17 +#: Template/TransactionSignatures/index.ctp:11 +#: Template/TransactionSignatures/view.ctp:14 +#: Template/TransactionTypes/add.ctp:11 +#: Template/TransactionTypes/edit.ctp:17 +#: Template/TransactionTypes/index.ctp:11 +#: Template/TransactionTypes/view.ctp:14 +#: Template/Transactions/add.ctp:10 +#: Template/Transactions/edit.ctp:16 +#: Template/Transactions/view.ctp:12 +msgid "List Transactions" +msgstr "" + +#: Template/StateCreated/add.ctp:12 +#: Template/StateCreated/edit.ctp:18 +#: Template/StateCreated/index.ctp:12 +#: Template/StateCreated/view.ctp:15 +#: Template/StateGroups/add.ctp:18 +#: Template/StateGroups/edit.ctp:24 +#: Template/StateGroups/index.ctp:18 +#: Template/StateGroups/view.ctp:21 +#: Template/TransactionCreations/add.ctp:12 +#: Template/TransactionCreations/edit.ctp:18 +#: Template/TransactionCreations/index.ctp:12 +#: Template/TransactionCreations/view.ctp:15 +#: Template/TransactionGroupAddaddress/add.ctp:12 +#: Template/TransactionGroupAddaddress/edit.ctp:18 +#: Template/TransactionGroupAddaddress/index.ctp:12 +#: Template/TransactionGroupAddaddress/view.ctp:15 +#: Template/TransactionGroupAllowtrades/add.ctp:12 +#: Template/TransactionGroupAllowtrades/edit.ctp:18 +#: Template/TransactionGroupAllowtrades/index.ctp:12 +#: Template/TransactionGroupAllowtrades/view.ctp:15 +#: Template/TransactionGroupCreates/add.ctp:12 +#: Template/TransactionGroupCreates/edit.ctp:18 +#: Template/TransactionGroupCreates/index.ctp:12 +#: Template/TransactionGroupCreates/view.ctp:15 +#: Template/TransactionSendCoins/add.ctp:12 +#: Template/TransactionSendCoins/edit.ctp:18 +#: Template/TransactionSendCoins/index.ctp:12 +#: Template/TransactionSendCoins/view.ctp:15 +#: Template/TransactionSignatures/add.ctp:12 +#: Template/TransactionSignatures/edit.ctp:18 +#: Template/TransactionSignatures/index.ctp:12 +#: Template/TransactionSignatures/view.ctp:15 +#: Template/TransactionTypes/add.ctp:12 +#: Template/TransactionTypes/edit.ctp:18 +#: Template/TransactionTypes/index.ctp:12 +#: Template/TransactionTypes/view.ctp:15 +#: Template/Transactions/index.ctp:10 +#: Template/Transactions/view.ctp:13 +msgid "New Transaction" +msgstr "" + +#: Template/StateCreated/add.ctp:20 +msgid "Add State Created" +msgstr "" + +#: Template/StateCreated/edit.ctp:26 +#: Template/StateCreated/view.ctp:10 +msgid "Edit State Created" +msgstr "" + +#: Template/StateCreated/index.ctp:10 +#: Template/StateCreated/view.ctp:13 +#: Template/StateUsers/add.ctp:16 +#: Template/StateUsers/edit.ctp:22 +#: Template/StateUsers/index.ctp:16 +#: Template/StateUsers/view.ctp:19 +#: Template/Transactions/add.ctp:16 +#: Template/Transactions/edit.ctp:22 +#: Template/Transactions/index.ctp:16 +#: Template/Transactions/view.ctp:19 +msgid "New State Created" +msgstr "" + +#: Template/StateCreated/index.ctp:18 +msgid "State Created" +msgstr "" + +#: Template/StateCreated/view.ctp:11 +msgid "Delete State Created" +msgstr "" + +#: Template/StateCreated/view.ctp:24 +#: Template/TransactionCreations/view.ctp:24 +#: Template/TransactionGroupAddaddress/view.ctp:24 +#: Template/TransactionGroupAllowtrades/view.ctp:22 +#: Template/TransactionGroupCreates/view.ctp:24 +#: Template/TransactionSendCoins/view.ctp:24 +#: Template/TransactionSignatures/view.ctp:22 +msgid "Transaction" +msgstr "" + +#: Template/StateCreated/view.ctp:36 +#: Template/StateUsers/view.ctp:76 +#: Template/Transactions/view.ctp:61 +msgid "Month" +msgstr "" + +#: Template/StateCreated/view.ctp:40 +#: Template/StateUsers/view.ctp:77 +#: Template/Transactions/view.ctp:62 +msgid "Year" +msgstr "" + +#: Template/StateCreated/view.ctp:44 +#: Template/StateUsers/view.ctp:80 +#: Template/Transactions/view.ctp:65 +msgid "Short Ident Hash" +msgstr "" + +#: Template/StateErrors/add.ctp:10 +#: Template/StateErrors/edit.ctp:16 +#: Template/StateErrors/view.ctp:12 +msgid "List State Errors" +msgstr "" + +#: Template/StateErrors/add.ctp:13 +#: Template/StateErrors/edit.ctp:19 +#: Template/StateErrors/index.ctp:13 +#: Template/StateErrors/view.ctp:16 +#: Template/TransactionTypes/add.ctp:10 +#: Template/TransactionTypes/edit.ctp:16 +#: Template/TransactionTypes/view.ctp:12 +#: Template/Transactions/add.ctp:13 +#: Template/Transactions/edit.ctp:19 +#: Template/Transactions/index.ctp:13 +#: Template/Transactions/view.ctp:16 +msgid "List Transaction Types" +msgstr "" + +#: Template/StateErrors/add.ctp:14 +#: Template/StateErrors/edit.ctp:20 +#: Template/StateErrors/index.ctp:14 +#: Template/StateErrors/view.ctp:17 +#: Template/TransactionTypes/index.ctp:10 +#: Template/TransactionTypes/view.ctp:13 +#: Template/Transactions/add.ctp:14 +#: Template/Transactions/edit.ctp:20 +#: Template/Transactions/index.ctp:14 +#: Template/Transactions/view.ctp:17 +msgid "New Transaction Type" +msgstr "" + +#: Template/StateErrors/add.ctp:20 +msgid "Add State Error" +msgstr "" + +#: Template/StateErrors/edit.ctp:26 +#: Template/StateErrors/view.ctp:10 +msgid "Edit State Error" +msgstr "" + +#: Template/StateErrors/index.ctp:10 +#: Template/StateErrors/view.ctp:13 +msgid "New State Error" +msgstr "" + +#: Template/StateErrors/index.ctp:18 +msgid "State Errors" +msgstr "" + +#: Template/StateErrors/show_for_user.ctp:9 +msgid "Fehlermeldungen" +msgstr "" + +#: Template/StateErrors/view.ctp:11 +msgid "Delete State Error" +msgstr "" + +#: Template/StateErrors/view.ctp:28 +#: Template/Transactions/view.ctp:42 +msgid "Transaction Type" +msgstr "" + +#: Template/StateErrors/view.ctp:41 +msgid "Message Json" +msgstr "" + +#: Template/StateGroupAddresses/add.ctp:11 +#: Template/StateGroupAddresses/edit.ctp:17 +#: Template/StateGroupAddresses/index.ctp:11 +#: Template/StateGroupAddresses/view.ctp:14 +#: Template/StateGroups/add.ctp:10 +#: Template/StateGroups/edit.ctp:16 +#: Template/StateGroups/view.ctp:12 +#: Template/StateUsers/add.ctp:11 +#: Template/StateUsers/edit.ctp:17 +#: Template/StateUsers/index.ctp:11 +#: Template/StateUsers/view.ctp:14 +#: Template/TransactionGroupCreates/add.ctp:13 +#: Template/TransactionGroupCreates/edit.ctp:19 +#: Template/TransactionGroupCreates/index.ctp:13 +#: Template/TransactionGroupCreates/view.ctp:16 +#: Template/Transactions/add.ctp:11 +#: Template/Transactions/edit.ctp:17 +#: Template/Transactions/index.ctp:11 +#: Template/Transactions/view.ctp:14 +msgid "List State Groups" +msgstr "" + +#: Template/StateGroupAddresses/add.ctp:12 +#: Template/StateGroupAddresses/edit.ctp:18 +#: Template/StateGroupAddresses/index.ctp:12 +#: Template/StateGroupAddresses/view.ctp:15 +#: Template/StateGroups/index.ctp:10 +#: Template/StateGroups/view.ctp:13 +#: Template/StateUsers/add.ctp:12 +#: Template/StateUsers/edit.ctp:18 +#: Template/StateUsers/index.ctp:12 +#: Template/StateUsers/view.ctp:15 +#: Template/TransactionGroupCreates/add.ctp:14 +#: Template/TransactionGroupCreates/edit.ctp:20 +#: Template/TransactionGroupCreates/index.ctp:14 +#: Template/TransactionGroupCreates/view.ctp:17 +#: Template/Transactions/add.ctp:12 +#: Template/Transactions/edit.ctp:18 +#: Template/Transactions/index.ctp:12 +#: Template/Transactions/view.ctp:15 +msgid "New State Group" +msgstr "" + +#: Template/StateGroupAddresses/add.ctp:20 +msgid "Add State Group Address" +msgstr "" + +#: Template/StateGroupAddresses/edit.ctp:26 +#: Template/StateGroupAddresses/view.ctp:10 +msgid "Edit State Group Address" +msgstr "" + +#: Template/StateGroupAddresses/index.ctp:18 +msgid "State Group Addresses" +msgstr "" + +#: Template/StateGroupAddresses/view.ctp:11 +msgid "Delete State Group Address" +msgstr "" + +#: Template/StateGroupAddresses/view.ctp:24 +#: Template/StateUsers/view.ctp:30 +#: Template/TransactionGroupCreates/view.ctp:28 +#: Template/Transactions/view.ctp:38 +msgid "State Group" +msgstr "" + +#: Template/StateGroupAddresses/view.ctp:28 +#: Template/TransactionGroupAddaddress/view.ctp:28 +msgid "Address Type" +msgstr "" + +#: Template/StateGroupRelationships/add.ctp:10 +#: Template/StateGroupRelationships/edit.ctp:16 +#: Template/StateGroupRelationships/view.ctp:12 +msgid "List State Group Relationships" +msgstr "" + +#: Template/StateGroupRelationships/add.ctp:16 +msgid "Add State Group Relationship" +msgstr "" + +#: Template/StateGroupRelationships/edit.ctp:22 +#: Template/StateGroupRelationships/view.ctp:10 +msgid "Edit State Group Relationship" +msgstr "" + +#: Template/StateGroupRelationships/index.ctp:10 +#: Template/StateGroupRelationships/view.ctp:13 +msgid "New State Group Relationship" +msgstr "" + +#: Template/StateGroupRelationships/index.ctp:14 +msgid "State Group Relationships" +msgstr "" + +#: Template/StateGroupRelationships/view.ctp:11 +msgid "Delete State Group Relationship" +msgstr "" + +#: Template/StateGroupRelationships/view.ctp:24 +msgid "State Group1 Id" +msgstr "" + +#: Template/StateGroupRelationships/view.ctp:28 +msgid "State Group2 Id" +msgstr "" + +#: Template/StateGroupRelationships/view.ctp:32 +msgid "State Relationship Id" +msgstr "" + +#: Template/StateGroups/add.ctp:15 +#: Template/StateGroups/edit.ctp:21 +#: Template/StateGroups/index.ctp:15 +#: Template/StateGroups/view.ctp:18 +#: Template/TransactionGroupCreates/add.ctp:10 +#: Template/TransactionGroupCreates/edit.ctp:16 +#: Template/TransactionGroupCreates/view.ctp:12 +#: Template/Transactions/add.ctp:23 +#: Template/Transactions/edit.ctp:29 +#: Template/Transactions/index.ctp:23 +#: Template/Transactions/view.ctp:26 +msgid "List Transaction Group Creates" +msgstr "" + +#: Template/StateGroups/add.ctp:16 +#: Template/StateGroups/edit.ctp:22 +#: Template/StateGroups/index.ctp:16 +#: Template/StateGroups/view.ctp:19 +#: Template/TransactionGroupCreates/index.ctp:10 +#: Template/TransactionGroupCreates/view.ctp:13 +#: Template/Transactions/add.ctp:24 +#: Template/Transactions/edit.ctp:30 +#: Template/Transactions/index.ctp:24 +#: Template/Transactions/view.ctp:27 +msgid "New Transaction Group Create" +msgstr "" + +#: Template/StateGroups/add.ctp:24 +msgid "Add State Group" +msgstr "" + +#: Template/StateGroups/edit.ctp:30 +#: Template/StateGroups/view.ctp:10 +msgid "Edit State Group" +msgstr "" + +#: Template/StateGroups/index.ctp:22 +msgid "State Groups" +msgstr "" + +#: Template/StateGroups/view.ctp:11 +msgid "Delete State Group" +msgstr "" + +#: Template/StateGroups/view.ctp:36 +msgid "User Count" +msgstr "" + +#: Template/StateGroups/view.ctp:68 +msgid "Related State Users" +msgstr "" + +#: Template/StateGroups/view.ctp:73 +#: Template/StateUsers/view.ctp:38 +msgid "Index Id" +msgstr "" + +#: Template/StateGroups/view.ctp:95 +#: Template/Transactions/view.ctp:171 +msgid "Related Transaction Group Creates" +msgstr "" + +#: Template/StateGroups/view.ctp:101 +#: Template/Transactions/view.ctp:177 +msgid "Group Public Key" +msgstr "" + +#: Template/StateGroups/view.ctp:124 +#: Template/TransactionTypes/view.ctp:35 +msgid "Related Transactions" +msgstr "" + +#: Template/StateGroups/view.ctp:130 +#: Template/TransactionTypes/view.ctp:41 +msgid "Transaction Type Id" +msgstr "" + +#: Template/StateGroups/view.ctp:131 +#: Template/TransactionTypes/view.ctp:42 +msgid "Tx Hash" +msgstr "" + +#: Template/StateGroups/view.ctp:132 +#: Template/TransactionTypes/view.ctp:43 +#: Template/Transactions/view.ctp:50 +msgid "Received" +msgstr "" + +#: Template/StateRelationshipTypes/add.ctp:10 +#: Template/StateRelationshipTypes/edit.ctp:16 +#: Template/StateRelationshipTypes/view.ctp:12 +msgid "List State Relationship Types" +msgstr "" + +#: Template/StateRelationshipTypes/add.ctp:16 +msgid "Add State Relationship Type" +msgstr "" + +#: Template/StateRelationshipTypes/edit.ctp:22 +#: Template/StateRelationshipTypes/view.ctp:10 +msgid "Edit State Relationship Type" +msgstr "" + +#: Template/StateRelationshipTypes/index.ctp:10 +#: Template/StateRelationshipTypes/view.ctp:13 +msgid "New State Relationship Type" +msgstr "" + +#: Template/StateRelationshipTypes/index.ctp:14 +msgid "State Relationship Types" +msgstr "" + +#: Template/StateRelationshipTypes/view.ctp:11 +msgid "Delete State Relationship Type" +msgstr "" + +#: Template/StateUsers/add.ctp:17 +#: Template/StateUsers/edit.ctp:23 +#: Template/StateUsers/index.ctp:17 +#: Template/StateUsers/view.ctp:20 +#: Template/TransactionCreations/add.ctp:10 +#: Template/TransactionCreations/edit.ctp:16 +#: Template/TransactionCreations/view.ctp:12 +#: Template/Transactions/add.ctp:17 +#: Template/Transactions/edit.ctp:23 +#: Template/Transactions/index.ctp:17 +#: Template/Transactions/view.ctp:20 +msgid "List Transaction Creations" +msgstr "" + +#: Template/StateUsers/add.ctp:18 +#: Template/StateUsers/edit.ctp:24 +#: Template/StateUsers/index.ctp:18 +#: Template/StateUsers/view.ctp:21 +#: Template/TransactionCreations/index.ctp:10 +#: Template/TransactionCreations/view.ctp:13 +#: Template/Transactions/add.ctp:18 +#: Template/Transactions/edit.ctp:24 +#: Template/Transactions/index.ctp:18 +#: Template/Transactions/view.ctp:21 +msgid "New Transaction Creation" +msgstr "" + +#: Template/StateUsers/add.ctp:19 +#: Template/StateUsers/edit.ctp:25 +#: Template/StateUsers/index.ctp:19 +#: Template/StateUsers/view.ctp:22 +#: Template/TransactionSendCoins/add.ctp:10 +#: Template/TransactionSendCoins/edit.ctp:16 +#: Template/TransactionSendCoins/view.ctp:12 +#: Template/Transactions/add.ctp:25 +#: Template/Transactions/edit.ctp:31 +#: Template/Transactions/index.ctp:25 +#: Template/Transactions/view.ctp:28 +msgid "List Transaction Send Coins" +msgstr "" + +#: Template/StateUsers/add.ctp:20 +#: Template/StateUsers/edit.ctp:26 +#: Template/StateUsers/index.ctp:20 +#: Template/StateUsers/view.ctp:23 +#: Template/TransactionSendCoins/index.ctp:10 +#: Template/TransactionSendCoins/view.ctp:13 +#: Template/Transactions/add.ctp:26 +#: Template/Transactions/edit.ctp:32 +#: Template/Transactions/index.ctp:26 +#: Template/Transactions/view.ctp:29 +msgid "New Transaction Send Coin" +msgstr "" + +#: Template/StateUsers/add.ctp:26 +msgid "Add State User" +msgstr "" + +#: Template/StateUsers/edit.ctp:32 +#: Template/StateUsers/view.ctp:10 +msgid "Edit State User" +msgstr "" + +#: Template/StateUsers/index.ctp:24 +msgid "State Users" +msgstr "" + +#: Template/StateUsers/search.ctp:44 +msgid "Vorname oder Nachname oder E-Mail" +msgstr "" + +#: Template/StateUsers/search.ctp:45 +msgid "Datenbank durchsuchen" +msgstr "" + +#: Template/StateUsers/view.ctp:11 +msgid "Delete State User" +msgstr "" + +#: Template/StateUsers/view.ctp:43 +msgid "Related State Balances" +msgstr "" + +#: Template/StateUsers/view.ctp:48 +#: Template/StateUsers/view.ctp:78 +#: Template/StateUsers/view.ctp:109 +#: Template/StateUsers/view.ctp:138 +#: Template/Transactions/view.ctp:63 +#: Template/Transactions/view.ctp:94 +#: Template/Transactions/view.ctp:206 +msgid "State User Id" +msgstr "" + +#: Template/StateUsers/view.ctp:70 +#: Template/Transactions/view.ctp:55 +msgid "Related State Created" +msgstr "" + +#: Template/StateUsers/view.ctp:103 +#: Template/Transactions/view.ctp:88 +msgid "Related Transaction Creations" +msgstr "" + +#: Template/StateUsers/view.ctp:111 +#: Template/Transactions/view.ctp:96 +msgid "Ident Hash" +msgstr "" + +#: Template/StateUsers/view.ctp:132 +#: Template/Transactions/view.ctp:200 +msgid "Related Transaction Send Coins" +msgstr "" + +#: Template/StateUsers/view.ctp:139 +#: Template/Transactions/view.ctp:207 +msgid "Receiver Public Key" +msgstr "" + +#: Template/StateUsers/view.ctp:140 +#: Template/Transactions/view.ctp:208 +msgid "Receiver User Id" +msgstr "" + +#: Template/StateUsers/view.ctp:142 +#: Template/TransactionSendCoins/view.ctp:40 +#: Template/Transactions/view.ctp:210 +msgid "Sender Final Balance" +msgstr "" + +#: Template/TransactionCreations/add.ctp:20 +msgid "Add Transaction Creation" +msgstr "" + +#: Template/TransactionCreations/create.ctp:17 +#: Template/TransactionCreations/create_multi.ctp:17 +msgid "Schöpfungstransaktion" +msgstr "" + +#: Template/TransactionCreations/create.ctp:28 +#: Template/TransactionCreations/create_multi.ctp:107 +msgid "Transaktion(n) abschließen" +msgstr "" + +#: Template/TransactionCreations/create.ctp:29 +#: Template/TransactionCreations/create_multi.ctp:108 +#: Template/TransactionSendCoins/create.ctp:33 +msgid "Weitere Transaktion erstellen" +msgstr "" + +#: Template/TransactionCreations/create_multi.ctp:85 +msgid "Für benutzerdefinierten Betrag" +msgstr "" + +#: Template/TransactionCreations/create_multi.ctp:172 +msgid "Alle Transaktionen abgeschlossen!" +msgstr "" + +#: Template/TransactionCreations/edit.ctp:26 +#: Template/TransactionCreations/view.ctp:10 +msgid "Edit Transaction Creation" +msgstr "" + +#: Template/TransactionCreations/index.ctp:18 +msgid "Transaction Creations" +msgstr "" + +#: Template/TransactionCreations/view.ctp:11 +msgid "Delete Transaction Creation" +msgstr "" + +#: Template/TransactionGroupAddaddress/add.ctp:20 +msgid "Add Transaction Group Addaddres" +msgstr "" + +#: Template/TransactionGroupAddaddress/edit.ctp:26 +#: Template/TransactionGroupAddaddress/view.ctp:10 +msgid "Edit Transaction Group Addaddres" +msgstr "" + +#: Template/TransactionGroupAddaddress/index.ctp:18 +msgid "Transaction Group Addaddress" +msgstr "" + +#: Template/TransactionGroupAddaddress/view.ctp:11 +msgid "Delete Transaction Group Addaddres" +msgstr "" + +#: Template/TransactionGroupAllowtrades/add.ctp:10 +#: Template/TransactionGroupAllowtrades/edit.ctp:16 +#: Template/TransactionGroupAllowtrades/view.ctp:12 +#: Template/Transactions/add.ctp:21 +#: Template/Transactions/edit.ctp:27 +#: Template/Transactions/index.ctp:21 +#: Template/Transactions/view.ctp:24 +msgid "List Transaction Group Allowtrades" +msgstr "" + +#: Template/TransactionGroupAllowtrades/add.ctp:18 +msgid "Add Transaction Group Allowtrade" +msgstr "" + +#: Template/TransactionGroupAllowtrades/edit.ctp:24 +#: Template/TransactionGroupAllowtrades/view.ctp:10 +msgid "Edit Transaction Group Allowtrade" +msgstr "" + +#: Template/TransactionGroupAllowtrades/index.ctp:10 +#: Template/TransactionGroupAllowtrades/view.ctp:13 +#: Template/Transactions/add.ctp:22 +#: Template/Transactions/edit.ctp:28 +#: Template/Transactions/index.ctp:22 +#: Template/Transactions/view.ctp:25 +msgid "New Transaction Group Allowtrade" +msgstr "" + +#: Template/TransactionGroupAllowtrades/index.ctp:16 +msgid "Transaction Group Allowtrades" +msgstr "" + +#: Template/TransactionGroupAllowtrades/view.ctp:11 +msgid "Delete Transaction Group Allowtrade" +msgstr "" + +#: Template/TransactionGroupAllowtrades/view.ctp:30 +#: Template/Transactions/view.ctp:150 +msgid "Group Id" +msgstr "" + +#: Template/TransactionGroupAllowtrades/view.ctp:34 +#: Template/Transactions/view.ctp:151 +msgid "Allow" +msgstr "" + +#: Template/TransactionGroupCreates/add.ctp:20 +msgid "Add Transaction Group Create" +msgstr "" + +#: Template/TransactionGroupCreates/edit.ctp:26 +#: Template/TransactionGroupCreates/view.ctp:10 +msgid "Edit Transaction Group Create" +msgstr "" + +#: Template/TransactionGroupCreates/index.ctp:18 +msgid "Transaction Group Creates" +msgstr "" + +#: Template/TransactionGroupCreates/view.ctp:11 +msgid "Delete Transaction Group Create" +msgstr "" + +#: Template/TransactionSendCoins/add.ctp:20 +msgid "Add Transaction Send Coin" +msgstr "" + +#: Template/TransactionSendCoins/create.ctp:29 +msgid "Empfänger" +msgstr "" + +#: Template/TransactionSendCoins/create.ctp:31 +msgid "Betrag in GDD" +msgstr "" + +#: Template/TransactionSendCoins/create.ctp:32 +msgid "Transaktion abschließen" +msgstr "" + +#: Template/TransactionSendCoins/edit.ctp:26 +#: Template/TransactionSendCoins/view.ctp:10 +msgid "Edit Transaction Send Coin" +msgstr "" + +#: Template/TransactionSendCoins/index.ctp:18 +msgid "Transaction Send Coins" +msgstr "" + +#: Template/TransactionSendCoins/view.ctp:11 +msgid "Delete Transaction Send Coin" +msgstr "" + +#: Template/TransactionSignatures/add.ctp:10 +#: Template/TransactionSignatures/edit.ctp:16 +#: Template/TransactionSignatures/view.ctp:12 +#: Template/Transactions/add.ctp:27 +#: Template/Transactions/edit.ctp:33 +#: Template/Transactions/index.ctp:27 +#: Template/Transactions/view.ctp:30 +msgid "List Transaction Signatures" +msgstr "" + +#: Template/TransactionSignatures/add.ctp:18 +msgid "Add Transaction Signature" +msgstr "" + +#: Template/TransactionSignatures/edit.ctp:24 +#: Template/TransactionSignatures/view.ctp:10 +msgid "Edit Transaction Signature" +msgstr "" + +#: Template/TransactionSignatures/index.ctp:10 +#: Template/TransactionSignatures/view.ctp:13 +#: Template/Transactions/add.ctp:28 +#: Template/Transactions/edit.ctp:34 +#: Template/Transactions/index.ctp:28 +#: Template/Transactions/view.ctp:31 +msgid "New Transaction Signature" +msgstr "" + +#: Template/TransactionSignatures/index.ctp:16 +msgid "Transaction Signatures" +msgstr "" + +#: Template/TransactionSignatures/view.ctp:11 +msgid "Delete Transaction Signature" +msgstr "" + +#: Template/TransactionTypes/add.ctp:18 +msgid "Add Transaction Type" +msgstr "" + +#: Template/TransactionTypes/edit.ctp:24 +#: Template/TransactionTypes/view.ctp:10 +msgid "Edit Transaction Type" +msgstr "" + +#: Template/TransactionTypes/index.ctp:16 +msgid "Transaction Types" +msgstr "" + +#: Template/TransactionTypes/view.ctp:11 +msgid "Delete Transaction Type" +msgstr "" + +#: Template/Transactions/add.ctp:34 +msgid "Add Transaction" +msgstr "" + +#: Template/Transactions/edit.ctp:40 +#: Template/Transactions/view.ctp:10 +msgid "Edit Transaction" +msgstr "" + +#: Template/Transactions/index.ctp:32 +msgid "Transactions" +msgstr "" + +#: Template/Transactions/send_to_node.ctp:8 +msgid "Transaktionen an Gradido-Node senden" +msgstr "" + +#: Template/Transactions/view.ctp:11 +msgid "Delete Transaction" +msgstr "" + +#: Template/Transactions/view.ctp:144 +msgid "Related Transaction Group Allowtrades" +msgstr "" + +#: Template/Transactions/view.ctp:233 +msgid "Related Transaction Signatures" +msgstr "" + +#: Template/Transactions/view.ctp:239 +msgid "Signature" +msgstr "" + +#: Template/Transactions/view.ctp:240 +msgid "Pubkey" +msgstr "" + diff --git a/community_server/src/Model/Behavior/empty b/community_server/src/Model/Behavior/empty new file mode 100644 index 000000000..e69de29bb diff --git a/community_server/src/Model/Entity/AddressType.php b/community_server/src/Model/Entity/AddressType.php new file mode 100644 index 000000000..08dbba281 --- /dev/null +++ b/community_server/src/Model/Entity/AddressType.php @@ -0,0 +1,33 @@ + true, + 'text' => true, + 'state_group_addresses' => true, + 'transaction_group_addaddress' => true + ]; +} diff --git a/community_server/src/Model/Entity/AdminError.php b/community_server/src/Model/Entity/AdminError.php new file mode 100644 index 000000000..23c60fd4a --- /dev/null +++ b/community_server/src/Model/Entity/AdminError.php @@ -0,0 +1,41 @@ + true, + 'controller' => true, + 'action' => true, + 'state' => true, + 'msg' => true, + 'details' => true, + 'created' => true, + 'state_user' => true + ]; +} diff --git a/community_server/src/Model/Entity/CommunityProfile.php b/community_server/src/Model/Entity/CommunityProfile.php new file mode 100644 index 000000000..367fe713c --- /dev/null +++ b/community_server/src/Model/Entity/CommunityProfile.php @@ -0,0 +1,30 @@ + true, + 'profile_img' => true, + 'profile_desc' => true, + ]; +} diff --git a/community_server/src/Model/Entity/ElopageBuy.php b/community_server/src/Model/Entity/ElopageBuy.php new file mode 100644 index 000000000..eca2f760b --- /dev/null +++ b/community_server/src/Model/Entity/ElopageBuy.php @@ -0,0 +1,57 @@ + true, + 'affiliate_program_id' => true, + 'publisher_id' => true, + 'order_id' => true, + 'product_id' => true, + 'product_price' => true, + 'payer_email' => true, + 'publisher_email' => true, + 'payed' => true, + 'success_date' => true, + 'event' => true, + 'elopage_user' => true, + 'affiliate_program' => true, + 'publisher' => true, + 'order' => true, + 'product' => true, + ]; +} diff --git a/community_server/src/Model/Entity/Operator.php b/community_server/src/Model/Entity/Operator.php new file mode 100644 index 000000000..9d5ddd3ca --- /dev/null +++ b/community_server/src/Model/Entity/Operator.php @@ -0,0 +1,32 @@ + true, + 'user_pubkey' => true, + 'operator_type_id' => true, + 'data_base64' => true, + 'modified' => true + ]; +} diff --git a/community_server/src/Model/Entity/OperatorType.php b/community_server/src/Model/Entity/OperatorType.php new file mode 100644 index 000000000..0ca968f47 --- /dev/null +++ b/community_server/src/Model/Entity/OperatorType.php @@ -0,0 +1,31 @@ + true, + 'text' => true, + 'operators' => true + ]; +} diff --git a/community_server/src/Model/Entity/ServerUser.php b/community_server/src/Model/Entity/ServerUser.php new file mode 100644 index 000000000..f1d47fd34 --- /dev/null +++ b/community_server/src/Model/Entity/ServerUser.php @@ -0,0 +1,57 @@ + true, + 'password' => true, + 'email' => true, + 'role' => true, + 'activated' => true, + 'last_login' => true, + 'created' => true, + 'modified' => true + ]; + + /** + * Fields that are excluded from JSON versions of the entity. + * + * @var array + */ + protected $_hidden = [ + 'password' + ]; + + protected function _setPassword($password) + { + if (strlen($password) > 0) { + return (new DefaultPasswordHasher)->hash($password); + } + } +} diff --git a/community_server/src/Model/Entity/StateBalance.php b/community_server/src/Model/Entity/StateBalance.php new file mode 100644 index 000000000..30d0d091f --- /dev/null +++ b/community_server/src/Model/Entity/StateBalance.php @@ -0,0 +1,33 @@ + true, + 'modified' => true, + 'amount' => true, + 'state_user' => true + ]; +} diff --git a/community_server/src/Model/Entity/StateCreated.php b/community_server/src/Model/Entity/StateCreated.php new file mode 100644 index 000000000..99c783e6c --- /dev/null +++ b/community_server/src/Model/Entity/StateCreated.php @@ -0,0 +1,41 @@ + true, + 'month' => true, + 'year' => true, + 'state_user_id' => true, + 'created' => true, + 'short_ident_hash' => true, + 'transaction' => true, + 'state_user' => true + ]; +} diff --git a/community_server/src/Model/Entity/StateError.php b/community_server/src/Model/Entity/StateError.php new file mode 100644 index 000000000..448e9ccb3 --- /dev/null +++ b/community_server/src/Model/Entity/StateError.php @@ -0,0 +1,37 @@ + true, + 'transaction_type_id' => true, + 'created' => true, + 'message_json' => true, + 'state_user' => true, + 'transaction_type' => true + ]; +} diff --git a/community_server/src/Model/Entity/StateGroup.php b/community_server/src/Model/Entity/StateGroup.php new file mode 100644 index 000000000..c2bdc75fc --- /dev/null +++ b/community_server/src/Model/Entity/StateGroup.php @@ -0,0 +1,43 @@ + true, + 'name' => true, + 'root_public_key' => true, + 'user_count' => true, + 'index' => true, + 'state_group_addresses' => true, + 'state_users' => true, + 'transaction_group_creates' => true, + 'transactions' => true + ]; +} diff --git a/community_server/src/Model/Entity/StateGroupAddress.php b/community_server/src/Model/Entity/StateGroupAddress.php new file mode 100644 index 000000000..e5ce71681 --- /dev/null +++ b/community_server/src/Model/Entity/StateGroupAddress.php @@ -0,0 +1,35 @@ + true, + 'public_key' => true, + 'address_type_id' => true, + 'state_group' => true, + 'address_type' => true + ]; +} diff --git a/community_server/src/Model/Entity/StateGroupRelationship.php b/community_server/src/Model/Entity/StateGroupRelationship.php new file mode 100644 index 000000000..974b1375d --- /dev/null +++ b/community_server/src/Model/Entity/StateGroupRelationship.php @@ -0,0 +1,37 @@ + true, + 'state_group2_id' => true, + 'state_relationship_id' => true, + 'state_group1' => true, + 'state_group2' => true, + 'state_relationship' => true + ]; +} diff --git a/community_server/src/Model/Entity/StateRelationshipType.php b/community_server/src/Model/Entity/StateRelationshipType.php new file mode 100644 index 000000000..f3c70d31e --- /dev/null +++ b/community_server/src/Model/Entity/StateRelationshipType.php @@ -0,0 +1,28 @@ + true, + 'text' => true + ]; +} diff --git a/community_server/src/Model/Entity/StateUser.php b/community_server/src/Model/Entity/StateUser.php new file mode 100644 index 000000000..5fac7cda7 --- /dev/null +++ b/community_server/src/Model/Entity/StateUser.php @@ -0,0 +1,58 @@ + true, + 'state_group_id' => true, + 'public_key' => true, + 'email' => true, + 'first_name' => true, + 'last_name' => true, + 'disabled' => true, + 'username' => true, + 'index' => true, + 'state_group' => true, + 'state_balances' => true, + 'state_created' => true, + 'transaction_creations' => true, + 'transaction_send_coins' => true + ]; + + public function getEmailWithName() + { + return $this->first_name . ' ' . $this->last_name . ' <' . $this->email . '>'; + } + + public function getNames() + { + return $this->first_name . ' ' . $this->last_name; + } +} diff --git a/community_server/src/Model/Entity/Transaction.php b/community_server/src/Model/Entity/Transaction.php new file mode 100644 index 000000000..d4ebf68c4 --- /dev/null +++ b/community_server/src/Model/Entity/Transaction.php @@ -0,0 +1,52 @@ + true, + 'transaction_type_id' => true, + 'tx_hash' => true, + 'memo' => true, + 'received' => true, + 'state_group' => true, + 'transaction_type' => true, + 'state_created' => true, + 'transaction_creations' => true, + 'transaction_group_addaddress' => true, + 'transaction_group_allowtrades' => true, + 'transaction_group_creates' => true, + 'transaction_send_coins' => true, + 'transaction_signatures' => true + ]; +} diff --git a/community_server/src/Model/Entity/TransactionCreation.php b/community_server/src/Model/Entity/TransactionCreation.php new file mode 100644 index 000000000..36aa7ac2d --- /dev/null +++ b/community_server/src/Model/Entity/TransactionCreation.php @@ -0,0 +1,39 @@ + true, + 'state_user_id' => true, + 'amount' => true, + 'ident_hash' => true, + 'transaction' => true, + 'state_user' => true, + 'target_date' => true + ]; +} diff --git a/community_server/src/Model/Entity/TransactionGroupAddaddres.php b/community_server/src/Model/Entity/TransactionGroupAddaddres.php new file mode 100644 index 000000000..3cb73b9ee --- /dev/null +++ b/community_server/src/Model/Entity/TransactionGroupAddaddres.php @@ -0,0 +1,35 @@ + true, + 'address_type_id' => true, + 'public_key' => true, + 'transaction' => true, + 'address_type' => true + ]; +} diff --git a/community_server/src/Model/Entity/TransactionGroupAllowtrade.php b/community_server/src/Model/Entity/TransactionGroupAllowtrade.php new file mode 100644 index 000000000..d097c643f --- /dev/null +++ b/community_server/src/Model/Entity/TransactionGroupAllowtrade.php @@ -0,0 +1,35 @@ + true, + 'group_id' => true, + 'allow' => true, + 'transaction' => true, + 'group' => true + ]; +} diff --git a/community_server/src/Model/Entity/TransactionGroupCreate.php b/community_server/src/Model/Entity/TransactionGroupCreate.php new file mode 100644 index 000000000..26fab510b --- /dev/null +++ b/community_server/src/Model/Entity/TransactionGroupCreate.php @@ -0,0 +1,37 @@ + true, + 'group_public_key' => true, + 'state_group_id' => true, + 'name' => true, + 'transaction' => true, + 'state_group' => true + ]; +} diff --git a/community_server/src/Model/Entity/TransactionSendCoin.php b/community_server/src/Model/Entity/TransactionSendCoin.php new file mode 100644 index 000000000..4d774501e --- /dev/null +++ b/community_server/src/Model/Entity/TransactionSendCoin.php @@ -0,0 +1,43 @@ + true, + 'state_user_id' => true, + 'receiver_public_key' => true, + 'receiver_user_id' => true, + 'amount' => true, + 'sender_final_balance' => true, + 'transaction' => true, + 'state_user' => true, + 'receiver_user' => true + ]; +} diff --git a/community_server/src/Model/Entity/TransactionSignature.php b/community_server/src/Model/Entity/TransactionSignature.php new file mode 100644 index 000000000..16bce8b00 --- /dev/null +++ b/community_server/src/Model/Entity/TransactionSignature.php @@ -0,0 +1,33 @@ + true, + 'signature' => true, + 'pubkey' => true, + 'transaction' => true + ]; +} diff --git a/community_server/src/Model/Entity/TransactionType.php b/community_server/src/Model/Entity/TransactionType.php new file mode 100644 index 000000000..b8f13e474 --- /dev/null +++ b/community_server/src/Model/Entity/TransactionType.php @@ -0,0 +1,31 @@ + true, + 'text' => true, + 'transactions' => true + ]; +} diff --git a/community_server/src/Model/Entity/User.php b/community_server/src/Model/Entity/User.php new file mode 100644 index 000000000..352371471 --- /dev/null +++ b/community_server/src/Model/Entity/User.php @@ -0,0 +1,58 @@ + true, + 'first_name' => true, + 'last_name' => true, + 'password' => true, + 'pubkey' => true, + 'privkey' => true, + 'created' => true, + 'email_checked' => true, + 'language' => true, + 'email_opt_in' => true, + 'user_backups' => true, + 'user_roles' => true, + ]; + + /** + * Fields that are excluded from JSON versions of the entity. + * + * @var array + */ + protected $_hidden = [ + 'password', + ]; +} diff --git a/community_server/src/Model/Messages/GPBMetadata/BasicTypes.php b/community_server/src/Model/Messages/GPBMetadata/BasicTypes.php new file mode 100644 index 000000000..113202053 --- /dev/null +++ b/community_server/src/Model/Messages/GPBMetadata/BasicTypes.php @@ -0,0 +1,40 @@ +internalAddGeneratedFile(hex2bin( + "0ae0030a10426173696354797065732e70726f746f12076772616469646f" . + "22380a034b657912110a076564323535313918022001280c480012170a0d" . + "656432353531395f726566313018032001280c480042050a036b65792258" . + "0a0d5369676e617475726550616972120e0a067075624b65791801200128" . + "0c12110a076564323535313918022001280c480012170a0d656432353531" . + "395f726566313018032001280c4800420b0a097369676e61747572652237" . + "0a0c5369676e61747572654d617012270a07736967506169721801200328" . + "0b32162e6772616469646f2e5369676e617475726550616972222b0a0954" . + "696d657374616d70120f0a077365636f6e6473180120012803120d0a056e" . + "616e6f7318022001280522230a1054696d657374616d705365636f6e6473" . + "120f0a077365636f6e647318012001280322590a0c53656e646572416d6f" . + "756e74121d0a15656432353531395f73656e6465725f7075626b65791801" . + "2001280c120e0a06616d6f756e74180220012812121a0a1273656e646572" . + "46696e616c42616c616e636518032001281222410a0e5265636569766572" . + "416d6f756e74121f0a17656432353531395f72656365697665725f707562" . + "6b657918012001280c120e0a06616d6f756e74180220012812620670726f" . + "746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/community_server/src/Model/Messages/GPBMetadata/StateCreateGroup.php b/community_server/src/Model/Messages/GPBMetadata/StateCreateGroup.php new file mode 100644 index 000000000..24ef6b2a7 --- /dev/null +++ b/community_server/src/Model/Messages/GPBMetadata/StateCreateGroup.php @@ -0,0 +1,31 @@ +internalAddGeneratedFile(hex2bin( + "0ab7010a16537461746543726561746547726f75702e70726f746f120767" . + "72616469646f228b010a10537461746543726561746547726f7570120c0a" . + "046e616d6518012001280912240a0e67726f75705075626c69634b657918" . + "022001280b320c2e6772616469646f2e4b6579122a0a14706172656e7447" . + "726f75705075626c69634b657918032001280b320c2e6772616469646f2e" . + "4b65794a04080410055211686564657261436f6e73656e73757349646206" . + "70726f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/community_server/src/Model/Messages/GPBMetadata/StateGroupChangeParent.php b/community_server/src/Model/Messages/GPBMetadata/StateGroupChangeParent.php new file mode 100644 index 000000000..8f9111842 --- /dev/null +++ b/community_server/src/Model/Messages/GPBMetadata/StateGroupChangeParent.php @@ -0,0 +1,31 @@ +internalAddGeneratedFile(hex2bin( + "0ace010a1c537461746547726f75704368616e6765506172656e742e7072" . + "6f746f12076772616469646f229c010a16537461746547726f7570436861" . + "6e6765506172656e7412240a0e67726f75705075626c69634b6579180120" . + "01280b320c2e6772616469646f2e4b6579122d0a176e6577506172656e74" . + "47726f75705075626c69634b657918022001280b320c2e6772616469646f" . + "2e4b6579122d0a176f6c64506172656e7447726f75705075626c69634b65" . + "7918032001280b320c2e6772616469646f2e4b6579620670726f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/community_server/src/Model/Messages/GPBMetadata/Transaction.php b/community_server/src/Model/Messages/GPBMetadata/Transaction.php new file mode 100644 index 000000000..9f1d8ff23 --- /dev/null +++ b/community_server/src/Model/Messages/GPBMetadata/Transaction.php @@ -0,0 +1,31 @@ +internalAddGeneratedFile(hex2bin( + "0ab7010a115472616e73616374696f6e2e70726f746f1207677261646964" . + "6f2290010a0b5472616e73616374696f6e120a0a02696418012001280412" . + "2b0a08726563656976656418022001280b32192e6772616469646f2e5469" . + "6d657374616d705365636f6e647312250a067369674d617018032001280b" . + "32152e6772616469646f2e5369676e61747572654d6170120e0a06747848" . + "61736818042001280c12110a09626f6479427974657318052001280c6206" . + "70726f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/community_server/src/Model/Messages/GPBMetadata/TransactionBody.php b/community_server/src/Model/Messages/GPBMetadata/TransactionBody.php new file mode 100644 index 000000000..d225389b6 --- /dev/null +++ b/community_server/src/Model/Messages/GPBMetadata/TransactionBody.php @@ -0,0 +1,40 @@ +internalAddGeneratedFile(hex2bin( + "0aec020a155472616e73616374696f6e426f64792e70726f746f12076772" . + "616469646f1a16537461746543726561746547726f75702e70726f746f1a" . + "1c537461746547726f75704368616e6765506172656e742e70726f746f1a" . + "195472616e73616374696f6e4372656174696f6e2e70726f746f22f0010a" . + "0f5472616e73616374696f6e426f6479120c0a046d656d6f180120012809" . + "12300a0b63726561746547726f757018022001280b32192e677261646964" . + "6f2e537461746543726561746547726f75704800123c0a1167726f757043" . + "68616e6765506172656e7418032001280b321f2e6772616469646f2e5374" . + "61746547726f75704368616e6765506172656e74480012250a087472616e" . + "7366657218042001280b32112e6772616469646f2e5472616e7366657248" . + "0012300a086372656174696f6e18052001280b321c2e6772616469646f2e" . + "5472616e73616374696f6e4372656174696f6e480042060a046461746162" . + "0670726f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/community_server/src/Model/Messages/GPBMetadata/TransactionCreation.php b/community_server/src/Model/Messages/GPBMetadata/TransactionCreation.php new file mode 100644 index 000000000..c8984298c --- /dev/null +++ b/community_server/src/Model/Messages/GPBMetadata/TransactionCreation.php @@ -0,0 +1,29 @@ +internalAddGeneratedFile(hex2bin( + "0a88010a195472616e73616374696f6e4372656174696f6e2e70726f746f" . + "12076772616469646f225a0a135472616e73616374696f6e437265617469" . + "6f6e122f0a0e7265636569766572416d6f756e7418012001280b32172e67" . + "72616469646f2e5265636569766572416d6f756e7412120a0a6964656e74" . + "5f68617368180220012811620670726f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/community_server/src/Model/Messages/GPBMetadata/Transfer.php b/community_server/src/Model/Messages/GPBMetadata/Transfer.php new file mode 100644 index 000000000..f5236ee43 --- /dev/null +++ b/community_server/src/Model/Messages/GPBMetadata/Transfer.php @@ -0,0 +1,29 @@ +internalAddGeneratedFile(hex2bin( + "0a8d010a0e5472616e736665722e70726f746f12076772616469646f226a" . + "0a085472616e73666572122c0a0d73656e646572416d6f756e7473180120" . + "03280b32152e6772616469646f2e53656e646572416d6f756e7412300a0f" . + "7265636569766572416d6f756e747318022003280b32172e677261646964" . + "6f2e5265636569766572416d6f756e74620670726f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/community_server/src/Model/Messages/Gradido/Key.php b/community_server/src/Model/Messages/Gradido/Key.php new file mode 100644 index 000000000..ace440729 --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/Key.php @@ -0,0 +1,96 @@ +model.messages.gradido.Key + */ +class Key extends \Google\Protobuf\Internal\Message +{ + protected $key; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $ed25519 + * ed25519 signature (libsodium default) + * @type string $ed25519_ref10 + * ed25519 ref10 signature + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\BasicTypes::initOnce(); + parent::__construct($data); + } + + /** + * ed25519 signature (libsodium default) + * + * Generated from protobuf field bytes ed25519 = 2; + * @return string + */ + public function getEd25519() + { + return $this->readOneof(2); + } + + /** + * ed25519 signature (libsodium default) + * + * Generated from protobuf field bytes ed25519 = 2; + * @param string $var + * @return $this + */ + public function setEd25519($var) + { + GPBUtil::checkString($var, False); + $this->writeOneof(2, $var); + + return $this; + } + + /** + * ed25519 ref10 signature + * + * Generated from protobuf field bytes ed25519_ref10 = 3; + * @return string + */ + public function getEd25519Ref10() + { + return $this->readOneof(3); + } + + /** + * ed25519 ref10 signature + * + * Generated from protobuf field bytes ed25519_ref10 = 3; + * @param string $var + * @return $this + */ + public function setEd25519Ref10($var) + { + GPBUtil::checkString($var, False); + $this->writeOneof(3, $var); + + return $this; + } + + /** + * @return string + */ + public function getKey() + { + return $this->whichOneof("key"); + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/ReceiverAmount.php b/community_server/src/Model/Messages/Gradido/ReceiverAmount.php new file mode 100644 index 000000000..240c5a6fe --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/ReceiverAmount.php @@ -0,0 +1,85 @@ +model.messages.gradido.ReceiverAmount + */ +class ReceiverAmount extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field bytes ed25519_receiver_pubkey = 1; + */ + private $ed25519_receiver_pubkey = ''; + /** + * Generated from protobuf field sint64 amount = 2; + */ + private $amount = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $ed25519_receiver_pubkey + * @type int|string $amount + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\BasicTypes::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field bytes ed25519_receiver_pubkey = 1; + * @return string + */ + public function getEd25519ReceiverPubkey() + { + return $this->ed25519_receiver_pubkey; + } + + /** + * Generated from protobuf field bytes ed25519_receiver_pubkey = 1; + * @param string $var + * @return $this + */ + public function setEd25519ReceiverPubkey($var) + { + GPBUtil::checkString($var, False); + $this->ed25519_receiver_pubkey = $var; + + return $this; + } + + /** + * Generated from protobuf field sint64 amount = 2; + * @return int|string + */ + public function getAmount() + { + return $this->amount; + } + + /** + * Generated from protobuf field sint64 amount = 2; + * @param int|string $var + * @return $this + */ + public function setAmount($var) + { + GPBUtil::checkInt64($var); + $this->amount = $var; + + return $this; + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/SenderAmount.php b/community_server/src/Model/Messages/Gradido/SenderAmount.php new file mode 100644 index 000000000..9b423947e --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/SenderAmount.php @@ -0,0 +1,119 @@ +model.messages.gradido.SenderAmount + */ +class SenderAmount extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field bytes ed25519_sender_pubkey = 1; + */ + private $ed25519_sender_pubkey = ''; + /** + * Generated from protobuf field sint64 amount = 2; + */ + private $amount = 0; + /** + * sender balance after transaction, including perishability + * + * Generated from protobuf field sint64 senderFinalBalance = 3; + */ + private $senderFinalBalance = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $ed25519_sender_pubkey + * @type int|string $amount + * @type int|string $senderFinalBalance + * sender balance after transaction, including perishability + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\BasicTypes::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field bytes ed25519_sender_pubkey = 1; + * @return string + */ + public function getEd25519SenderPubkey() + { + return $this->ed25519_sender_pubkey; + } + + /** + * Generated from protobuf field bytes ed25519_sender_pubkey = 1; + * @param string $var + * @return $this + */ + public function setEd25519SenderPubkey($var) + { + GPBUtil::checkString($var, False); + $this->ed25519_sender_pubkey = $var; + + return $this; + } + + /** + * Generated from protobuf field sint64 amount = 2; + * @return int|string + */ + public function getAmount() + { + return $this->amount; + } + + /** + * Generated from protobuf field sint64 amount = 2; + * @param int|string $var + * @return $this + */ + public function setAmount($var) + { + GPBUtil::checkInt64($var); + $this->amount = $var; + + return $this; + } + + /** + * sender balance after transaction, including perishability + * + * Generated from protobuf field sint64 senderFinalBalance = 3; + * @return int|string + */ + public function getSenderFinalBalance() + { + return $this->senderFinalBalance; + } + + /** + * sender balance after transaction, including perishability + * + * Generated from protobuf field sint64 senderFinalBalance = 3; + * @param int|string $var + * @return $this + */ + public function setSenderFinalBalance($var) + { + GPBUtil::checkInt64($var); + $this->senderFinalBalance = $var; + + return $this; + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/SignatureMap.php b/community_server/src/Model/Messages/Gradido/SignatureMap.php new file mode 100644 index 000000000..ea6f16150 --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/SignatureMap.php @@ -0,0 +1,65 @@ +model.messages.gradido.SignatureMap + */ +class SignatureMap extends \Google\Protobuf\Internal\Message +{ + /** + * Each signature pair corresponds to a unique Key required to sign the transaction. + * + * Generated from protobuf field repeated .model.messages.gradido.SignaturePair sigPair = 1; + */ + private $sigPair; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Model\Messages\Gradido\SignaturePair[]|\Google\Protobuf\Internal\RepeatedField $sigPair + * Each signature pair corresponds to a unique Key required to sign the transaction. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\BasicTypes::initOnce(); + parent::__construct($data); + } + + /** + * Each signature pair corresponds to a unique Key required to sign the transaction. + * + * Generated from protobuf field repeated .model.messages.gradido.SignaturePair sigPair = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getSigPair() + { + return $this->sigPair; + } + + /** + * Each signature pair corresponds to a unique Key required to sign the transaction. + * + * Generated from protobuf field repeated .model.messages.gradido.SignaturePair sigPair = 1; + * @param \Model\Messages\Gradido\SignaturePair[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setSigPair($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Model\Messages\Gradido\SignaturePair::class); + $this->sigPair = $arr; + + return $this; + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/SignaturePair.php b/community_server/src/Model/Messages/Gradido/SignaturePair.php new file mode 100644 index 000000000..4575a7d38 --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/SignaturePair.php @@ -0,0 +1,123 @@ +model.messages.gradido.SignaturePair + */ +class SignaturePair extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field bytes pubKey = 1; + */ + private $pubKey = ''; + protected $signature; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $pubKey + * @type string $ed25519 + * ed25519 signature (libsodium default) + * @type string $ed25519_ref10 + * ed25519 ref10 signature + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\BasicTypes::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field bytes pubKey = 1; + * @return string + */ + public function getPubKey() + { + return $this->pubKey; + } + + /** + * Generated from protobuf field bytes pubKey = 1; + * @param string $var + * @return $this + */ + public function setPubKey($var) + { + GPBUtil::checkString($var, False); + $this->pubKey = $var; + + return $this; + } + + /** + * ed25519 signature (libsodium default) + * + * Generated from protobuf field bytes ed25519 = 2; + * @return string + */ + public function getEd25519() + { + return $this->readOneof(2); + } + + /** + * ed25519 signature (libsodium default) + * + * Generated from protobuf field bytes ed25519 = 2; + * @param string $var + * @return $this + */ + public function setEd25519($var) + { + GPBUtil::checkString($var, False); + $this->writeOneof(2, $var); + + return $this; + } + + /** + * ed25519 ref10 signature + * + * Generated from protobuf field bytes ed25519_ref10 = 3; + * @return string + */ + public function getEd25519Ref10() + { + return $this->readOneof(3); + } + + /** + * ed25519 ref10 signature + * + * Generated from protobuf field bytes ed25519_ref10 = 3; + * @param string $var + * @return $this + */ + public function setEd25519Ref10($var) + { + GPBUtil::checkString($var, False); + $this->writeOneof(3, $var); + + return $this; + } + + /** + * @return string + */ + public function getSignature() + { + return $this->whichOneof("signature"); + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/StateCreateGroup.php b/community_server/src/Model/Messages/Gradido/StateCreateGroup.php new file mode 100644 index 000000000..dad246745 --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/StateCreateGroup.php @@ -0,0 +1,114 @@ +model.messages.gradido.StateCreateGroup + */ +class StateCreateGroup extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field string name = 1; + */ + private $name = ''; + /** + * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 2; + */ + private $groupPublicKey = null; + /** + * Generated from protobuf field .model.messages.gradido.Key parentGroupPublicKey = 3; + */ + private $parentGroupPublicKey = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * @type \Model\Messages\Gradido\Key $groupPublicKey + * @type \Model\Messages\Gradido\Key $parentGroupPublicKey + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\StateCreateGroup::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 2; + * @return \Model\Messages\Gradido\Key + */ + public function getGroupPublicKey() + { + return $this->groupPublicKey; + } + + /** + * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 2; + * @param \Model\Messages\Gradido\Key $var + * @return $this + */ + public function setGroupPublicKey($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class); + $this->groupPublicKey = $var; + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.Key parentGroupPublicKey = 3; + * @return \Model\Messages\Gradido\Key + */ + public function getParentGroupPublicKey() + { + return $this->parentGroupPublicKey; + } + + /** + * Generated from protobuf field .model.messages.gradido.Key parentGroupPublicKey = 3; + * @param \Model\Messages\Gradido\Key $var + * @return $this + */ + public function setParentGroupPublicKey($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class); + $this->parentGroupPublicKey = $var; + + return $this; + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/StateGroupChangeParent.php b/community_server/src/Model/Messages/Gradido/StateGroupChangeParent.php new file mode 100644 index 000000000..9cd15175a --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/StateGroupChangeParent.php @@ -0,0 +1,114 @@ +model.messages.gradido.StateGroupChangeParent + */ +class StateGroupChangeParent extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 1; + */ + private $groupPublicKey = null; + /** + * Generated from protobuf field .model.messages.gradido.Key newParentGroupPublicKey = 2; + */ + private $newParentGroupPublicKey = null; + /** + * Generated from protobuf field .model.messages.gradido.Key oldParentGroupPublicKey = 3; + */ + private $oldParentGroupPublicKey = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Model\Messages\Gradido\Key $groupPublicKey + * @type \Model\Messages\Gradido\Key $newParentGroupPublicKey + * @type \Model\Messages\Gradido\Key $oldParentGroupPublicKey + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\StateGroupChangeParent::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 1; + * @return \Model\Messages\Gradido\Key + */ + public function getGroupPublicKey() + { + return $this->groupPublicKey; + } + + /** + * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 1; + * @param \Model\Messages\Gradido\Key $var + * @return $this + */ + public function setGroupPublicKey($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class); + $this->groupPublicKey = $var; + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.Key newParentGroupPublicKey = 2; + * @return \Model\Messages\Gradido\Key + */ + public function getNewParentGroupPublicKey() + { + return $this->newParentGroupPublicKey; + } + + /** + * Generated from protobuf field .model.messages.gradido.Key newParentGroupPublicKey = 2; + * @param \Model\Messages\Gradido\Key $var + * @return $this + */ + public function setNewParentGroupPublicKey($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class); + $this->newParentGroupPublicKey = $var; + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.Key oldParentGroupPublicKey = 3; + * @return \Model\Messages\Gradido\Key + */ + public function getOldParentGroupPublicKey() + { + return $this->oldParentGroupPublicKey; + } + + /** + * Generated from protobuf field .model.messages.gradido.Key oldParentGroupPublicKey = 3; + * @param \Model\Messages\Gradido\Key $var + * @return $this + */ + public function setOldParentGroupPublicKey($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class); + $this->oldParentGroupPublicKey = $var; + + return $this; + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/Timestamp.php b/community_server/src/Model/Messages/Gradido/Timestamp.php new file mode 100644 index 000000000..7b2316720 --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/Timestamp.php @@ -0,0 +1,101 @@ +model.messages.gradido.Timestamp + */ +class Timestamp extends \Google\Protobuf\Internal\Message +{ + /** + * Number of complete seconds since the start of the epoch + * + * Generated from protobuf field int64 seconds = 1; + */ + private $seconds = 0; + /** + * Number of nanoseconds since the start of the last second + * + * Generated from protobuf field int32 nanos = 2; + */ + private $nanos = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $seconds + * Number of complete seconds since the start of the epoch + * @type int $nanos + * Number of nanoseconds since the start of the last second + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\BasicTypes::initOnce(); + parent::__construct($data); + } + + /** + * Number of complete seconds since the start of the epoch + * + * Generated from protobuf field int64 seconds = 1; + * @return int|string + */ + public function getSeconds() + { + return $this->seconds; + } + + /** + * Number of complete seconds since the start of the epoch + * + * Generated from protobuf field int64 seconds = 1; + * @param int|string $var + * @return $this + */ + public function setSeconds($var) + { + GPBUtil::checkInt64($var); + $this->seconds = $var; + + return $this; + } + + /** + * Number of nanoseconds since the start of the last second + * + * Generated from protobuf field int32 nanos = 2; + * @return int + */ + public function getNanos() + { + return $this->nanos; + } + + /** + * Number of nanoseconds since the start of the last second + * + * Generated from protobuf field int32 nanos = 2; + * @param int $var + * @return $this + */ + public function setNanos($var) + { + GPBUtil::checkInt32($var); + $this->nanos = $var; + + return $this; + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/TimestampSeconds.php b/community_server/src/Model/Messages/Gradido/TimestampSeconds.php new file mode 100644 index 000000000..2646a06c9 --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/TimestampSeconds.php @@ -0,0 +1,67 @@ +model.messages.gradido.TimestampSeconds + */ +class TimestampSeconds extends \Google\Protobuf\Internal\Message +{ + /** + * Number of complete seconds since the start of the epoch + * + * Generated from protobuf field int64 seconds = 1; + */ + private $seconds = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $seconds + * Number of complete seconds since the start of the epoch + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\BasicTypes::initOnce(); + parent::__construct($data); + } + + /** + * Number of complete seconds since the start of the epoch + * + * Generated from protobuf field int64 seconds = 1; + * @return int|string + */ + public function getSeconds() + { + return $this->seconds; + } + + /** + * Number of complete seconds since the start of the epoch + * + * Generated from protobuf field int64 seconds = 1; + * @param int|string $var + * @return $this + */ + public function setSeconds($var) + { + GPBUtil::checkInt64($var); + $this->seconds = $var; + + return $this; + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/Transaction.php b/community_server/src/Model/Messages/Gradido/Transaction.php new file mode 100644 index 000000000..065cd80bb --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/Transaction.php @@ -0,0 +1,166 @@ +model.messages.gradido.Transaction + */ +class Transaction extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field uint64 id = 1; + */ + private $id = 0; + /** + * Generated from protobuf field .model.messages.gradido.TimestampSeconds received = 2; + */ + private $received = null; + /** + * Generated from protobuf field .model.messages.gradido.SignatureMap sigMap = 3; + */ + private $sigMap = null; + /** + * Generated from protobuf field bytes txHash = 4; + */ + private $txHash = ''; + /** + * Generated from protobuf field bytes bodyBytes = 5; + */ + private $bodyBytes = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $id + * @type \Model\Messages\Gradido\TimestampSeconds $received + * @type \Model\Messages\Gradido\SignatureMap $sigMap + * @type string $txHash + * @type string $bodyBytes + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Transaction::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field uint64 id = 1; + * @return int|string + */ + public function getId() + { + return $this->id; + } + + /** + * Generated from protobuf field uint64 id = 1; + * @param int|string $var + * @return $this + */ + public function setId($var) + { + GPBUtil::checkUint64($var); + $this->id = $var; + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.TimestampSeconds received = 2; + * @return \Model\Messages\Gradido\TimestampSeconds + */ + public function getReceived() + { + return $this->received; + } + + /** + * Generated from protobuf field .model.messages.gradido.TimestampSeconds received = 2; + * @param \Model\Messages\Gradido\TimestampSeconds $var + * @return $this + */ + public function setReceived($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\TimestampSeconds::class); + $this->received = $var; + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.SignatureMap sigMap = 3; + * @return \Model\Messages\Gradido\SignatureMap + */ + public function getSigMap() + { + return $this->sigMap; + } + + /** + * Generated from protobuf field .model.messages.gradido.SignatureMap sigMap = 3; + * @param \Model\Messages\Gradido\SignatureMap $var + * @return $this + */ + public function setSigMap($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\SignatureMap::class); + $this->sigMap = $var; + + return $this; + } + + /** + * Generated from protobuf field bytes txHash = 4; + * @return string + */ + public function getTxHash() + { + return $this->txHash; + } + + /** + * Generated from protobuf field bytes txHash = 4; + * @param string $var + * @return $this + */ + public function setTxHash($var) + { + GPBUtil::checkString($var, False); + $this->txHash = $var; + + return $this; + } + + /** + * Generated from protobuf field bytes bodyBytes = 5; + * @return string + */ + public function getBodyBytes() + { + return $this->bodyBytes; + } + + /** + * Generated from protobuf field bytes bodyBytes = 5; + * @param string $var + * @return $this + */ + public function setBodyBytes($var) + { + GPBUtil::checkString($var, False); + $this->bodyBytes = $var; + + return $this; + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/TransactionBody.php b/community_server/src/Model/Messages/Gradido/TransactionBody.php new file mode 100644 index 000000000..3452d4251 --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/TransactionBody.php @@ -0,0 +1,193 @@ +model.messages.gradido.TransactionBody + */ +class TransactionBody extends \Google\Protobuf\Internal\Message +{ + /** + * max 150 chars + * + * Generated from protobuf field string memo = 1; + */ + private $memo = ''; + /** + * Generated from protobuf field .model.messages.gradido.TimestampSeconds created = 2; + */ + private $created = null; + protected $data; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $memo + * max 150 chars + * @type \Model\Messages\Gradido\TimestampSeconds $created + * @type \Model\Messages\Gradido\StateCreateGroup $createGroup + * @type \Model\Messages\Gradido\StateGroupChangeParent $groupChangeParent + * @type \Model\Messages\Gradido\Transfer $transfer + * @type \Model\Messages\Gradido\TransactionCreation $creation + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\TransactionBody::initOnce(); + parent::__construct($data); + } + + /** + * max 150 chars + * + * Generated from protobuf field string memo = 1; + * @return string + */ + public function getMemo() + { + return $this->memo; + } + + /** + * max 150 chars + * + * Generated from protobuf field string memo = 1; + * @param string $var + * @return $this + */ + public function setMemo($var) + { + GPBUtil::checkString($var, True); + $this->memo = $var; + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.TimestampSeconds created = 2; + * @return \Model\Messages\Gradido\TimestampSeconds + */ + public function getCreated() + { + return $this->created; + } + + /** + * Generated from protobuf field .model.messages.gradido.TimestampSeconds created = 2; + * @param \Model\Messages\Gradido\TimestampSeconds $var + * @return $this + */ + public function setCreated($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\TimestampSeconds::class); + $this->created = $var; + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.StateCreateGroup createGroup = 6; + * @return \Model\Messages\Gradido\StateCreateGroup + */ + public function getCreateGroup() + { + return $this->readOneof(6); + } + + /** + * Generated from protobuf field .model.messages.gradido.StateCreateGroup createGroup = 6; + * @param \Model\Messages\Gradido\StateCreateGroup $var + * @return $this + */ + public function setCreateGroup($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\StateCreateGroup::class); + $this->writeOneof(6, $var); + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.StateGroupChangeParent groupChangeParent = 7; + * @return \Model\Messages\Gradido\StateGroupChangeParent + */ + public function getGroupChangeParent() + { + return $this->readOneof(7); + } + + /** + * Generated from protobuf field .model.messages.gradido.StateGroupChangeParent groupChangeParent = 7; + * @param \Model\Messages\Gradido\StateGroupChangeParent $var + * @return $this + */ + public function setGroupChangeParent($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\StateGroupChangeParent::class); + $this->writeOneof(7, $var); + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.Transfer transfer = 8; + * @return \Model\Messages\Gradido\Transfer + */ + public function getTransfer() + { + return $this->readOneof(8); + } + + /** + * Generated from protobuf field .model.messages.gradido.Transfer transfer = 8; + * @param \Model\Messages\Gradido\Transfer $var + * @return $this + */ + public function setTransfer($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\Transfer::class); + $this->writeOneof(8, $var); + + return $this; + } + + /** + * Generated from protobuf field .model.messages.gradido.TransactionCreation creation = 9; + * @return \Model\Messages\Gradido\TransactionCreation + */ + public function getCreation() + { + return $this->readOneof(9); + } + + /** + * Generated from protobuf field .model.messages.gradido.TransactionCreation creation = 9; + * @param \Model\Messages\Gradido\TransactionCreation $var + * @return $this + */ + public function setCreation($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\TransactionCreation::class); + $this->writeOneof(9, $var); + + return $this; + } + + /** + * @return string + */ + public function getData() + { + return $this->whichOneof("data"); + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/TransactionCreation.php b/community_server/src/Model/Messages/Gradido/TransactionCreation.php new file mode 100644 index 000000000..1c8f33dba --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/TransactionCreation.php @@ -0,0 +1,136 @@ +model.messages.gradido.TransactionCreation + */ +class TransactionCreation extends \Google\Protobuf\Internal\Message +{ + /** + * 40 Byte + * + * Generated from protobuf field .model.messages.gradido.ReceiverAmount receiverAmount = 1; + */ + private $receiverAmount = null; + /** + * 4 Byte + * + * Generated from protobuf field sint32 ident_hash = 2; + */ + private $ident_hash = 0; + /** + * 8 Byte + * + * Generated from protobuf field .model.messages.gradido.TimestampSeconds target_date = 3; + */ + private $target_date = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Model\Messages\Gradido\ReceiverAmount $receiverAmount + * 40 Byte + * @type int $ident_hash + * 4 Byte + * @type \Model\Messages\Gradido\TimestampSeconds $target_date + * 8 Byte + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\TransactionCreation::initOnce(); + parent::__construct($data); + } + + /** + * 40 Byte + * + * Generated from protobuf field .model.messages.gradido.ReceiverAmount receiverAmount = 1; + * @return \Model\Messages\Gradido\ReceiverAmount + */ + public function getReceiverAmount() + { + return $this->receiverAmount; + } + + /** + * 40 Byte + * + * Generated from protobuf field .model.messages.gradido.ReceiverAmount receiverAmount = 1; + * @param \Model\Messages\Gradido\ReceiverAmount $var + * @return $this + */ + public function setReceiverAmount($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\ReceiverAmount::class); + $this->receiverAmount = $var; + + return $this; + } + + /** + * 4 Byte + * + * Generated from protobuf field sint32 ident_hash = 2; + * @return int + */ + public function getIdentHash() + { + return $this->ident_hash; + } + + /** + * 4 Byte + * + * Generated from protobuf field sint32 ident_hash = 2; + * @param int $var + * @return $this + */ + public function setIdentHash($var) + { + GPBUtil::checkInt32($var); + $this->ident_hash = $var; + + return $this; + } + + /** + * 8 Byte + * + * Generated from protobuf field .model.messages.gradido.TimestampSeconds target_date = 3; + * @return \Model\Messages\Gradido\TimestampSeconds + */ + public function getTargetDate() + { + return $this->target_date; + } + + /** + * 8 Byte + * + * Generated from protobuf field .model.messages.gradido.TimestampSeconds target_date = 3; + * @param \Model\Messages\Gradido\TimestampSeconds $var + * @return $this + */ + public function setTargetDate($var) + { + GPBUtil::checkMessage($var, \Model\Messages\Gradido\TimestampSeconds::class); + $this->target_date = $var; + + return $this; + } + +} + diff --git a/community_server/src/Model/Messages/Gradido/Transfer.php b/community_server/src/Model/Messages/Gradido/Transfer.php new file mode 100644 index 000000000..2c031d02b --- /dev/null +++ b/community_server/src/Model/Messages/Gradido/Transfer.php @@ -0,0 +1,85 @@ +model.messages.gradido.Transfer + */ +class Transfer extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field repeated .model.messages.gradido.SenderAmount senderAmounts = 1; + */ + private $senderAmounts; + /** + * Generated from protobuf field repeated .model.messages.gradido.ReceiverAmount receiverAmounts = 2; + */ + private $receiverAmounts; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Model\Messages\Gradido\SenderAmount[]|\Google\Protobuf\Internal\RepeatedField $senderAmounts + * @type \Model\Messages\Gradido\ReceiverAmount[]|\Google\Protobuf\Internal\RepeatedField $receiverAmounts + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Transfer::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field repeated .model.messages.gradido.SenderAmount senderAmounts = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getSenderAmounts() + { + return $this->senderAmounts; + } + + /** + * Generated from protobuf field repeated .model.messages.gradido.SenderAmount senderAmounts = 1; + * @param \Model\Messages\Gradido\SenderAmount[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setSenderAmounts($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Model\Messages\Gradido\SenderAmount::class); + $this->senderAmounts = $arr; + + return $this; + } + + /** + * Generated from protobuf field repeated .model.messages.gradido.ReceiverAmount receiverAmounts = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getReceiverAmounts() + { + return $this->receiverAmounts; + } + + /** + * Generated from protobuf field repeated .model.messages.gradido.ReceiverAmount receiverAmounts = 2; + * @param \Model\Messages\Gradido\ReceiverAmount[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setReceiverAmounts($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Model\Messages\Gradido\ReceiverAmount::class); + $this->receiverAmounts = $arr; + + return $this; + } + +} + diff --git a/community_server/src/Model/Navigation/NaviBreakLine.php b/community_server/src/Model/Navigation/NaviBreakLine.php new file mode 100644 index 000000000..79917db8c --- /dev/null +++ b/community_server/src/Model/Navigation/NaviBreakLine.php @@ -0,0 +1,16 @@ +
    "; + } +} \ No newline at end of file diff --git a/community_server/src/Model/Navigation/NaviEntry.php b/community_server/src/Model/Navigation/NaviEntry.php new file mode 100644 index 000000000..2b02db9a8 --- /dev/null +++ b/community_server/src/Model/Navigation/NaviEntry.php @@ -0,0 +1,89 @@ +controller = $controller; + $this->action = $action; + $this->param = $param; + $this->iconClass = $iconClass; + if($active != null) { + $this->active = $active; + } else { + $this->active = ($GLOBALS["side"] == $controller && + $GLOBALS["subside"] == $action && + $GLOBALS["passed"] == $param); + } + $this->title = $title; + return $this; + } + + public function setIconColor($iconColorClass) { + $this->iconColor = $iconColorClass; + return $this; + } + public function setBGColor($bgColorClass) { + $this->bgColorClass = $bgColorClass; + return $this; + } + private function isActive() { + return $this->active; + } + + + + private function link() { + $self = $GLOBALS["self"]; + if($this->hasChilds()) { + return $self->Html->link( + $this->title.'', + ['controller' => $this->controller, "action" => $this->action, $this->param], + ['escape' => false] + ); + } else { + return $self->Html->Link( + ''. $this->iconClass .'' + .'' . $this->title . '', + ['controller' => $this->controller, 'action' => $this->action, $this->param], + ['class' => $this->bgColorClass, 'escape' => false]); + } + } + + public function __toString() { + $str = ""; + $str .= "hasChilds()) { $class .= "dropdown";} + if($this->isActive()) { $class .= " selected"; } + if(strlen($class) > 0 ) $str .= " class='$class'"; + $str .= ">"; + + $str .= $this->link(); + if($this->hasChilds()) { + $str .= ""; + } + $str .= ""; + return $str; + } +} \ No newline at end of file diff --git a/community_server/src/Model/Navigation/NaviEntryAbsoluteLink.php b/community_server/src/Model/Navigation/NaviEntryAbsoluteLink.php new file mode 100644 index 000000000..7d467ed69 --- /dev/null +++ b/community_server/src/Model/Navigation/NaviEntryAbsoluteLink.php @@ -0,0 +1,92 @@ +link = $link; + $this->iconClass = $iconClass; + if ($active != null) { + $this->active = $active; + } + $this->title = $title; + return $this; + } + + public function setIconColor($iconColorClass) + { + $this->iconColor = $iconColorClass; + return $this; + } + + public function setBGColor($bgColorClass) + { + $this->bgColorClass = $bgColorClass; + return $this; + } + + private function isActive() + { + return $this->active; + } + + protected function link() + { + $self = $GLOBALS["self"]; + if ($this->hasChilds()) { + return $self->Html->link( + $this->title.'', + ['controller' => $this->controller, "action" => $this->action, $this->param], + ['escape' => false] + ); + } else { + return '' + .''. $this->iconClass .'' + . '' . $this->title . '' + . ''; + } + } + + public function __toString() + { + $str = ""; + $str .= "hasChilds()) { + $class .= "dropdown"; + } + if ($this->isActive()) { + $class .= " selected"; + } + if (strlen($class) > 0) { + $str .= " class='$class'"; + } + $str .= ">"; + + $str .= $this->link(); + if ($this->hasChilds()) { + $str .= ""; + } + $str .= ""; + return $str; + } +} diff --git a/community_server/src/Model/Navigation/NaviEntryBase.php b/community_server/src/Model/Navigation/NaviEntryBase.php new file mode 100644 index 000000000..ebb4e122f --- /dev/null +++ b/community_server/src/Model/Navigation/NaviEntryBase.php @@ -0,0 +1,31 @@ +title = $title; + return $this; + } + + public function add($child) { + $child->isChild = true; + array_push($this->childs, $child); + return $this; + } + + protected function hasChilds() { + return count($this->childs) > 0; + } + +} diff --git a/community_server/src/Model/Navigation/NaviEntryExternLink.php b/community_server/src/Model/Navigation/NaviEntryExternLink.php new file mode 100644 index 000000000..8ace7fb4c --- /dev/null +++ b/community_server/src/Model/Navigation/NaviEntryExternLink.php @@ -0,0 +1,26 @@ +link.'" class="' .$this->bgColorClass .'" target="_blank">' + .''. $this->iconClass .'' + . '' . $this->title . '' + . ''; + } +} diff --git a/community_server/src/Model/Navigation/NaviEntrySub.php b/community_server/src/Model/Navigation/NaviEntrySub.php new file mode 100644 index 000000000..ae79aa433 --- /dev/null +++ b/community_server/src/Model/Navigation/NaviEntrySub.php @@ -0,0 +1,105 @@ +controller = $controller; + $this->action = $action; + $this->param = $param; + $this->iconClass = $iconClass; + if ($active != null) { + $this->active = $active; + } else { + $this->active = ($GLOBALS["side"] == $controller && + $GLOBALS["subside"] == $action && + $GLOBALS["passed"] == $param); + } + $this->title = $title; + $this->subtitle = $subtitle; + return $this; + } + + public function setIconColor($iconColorClass) + { + $this->iconColor = $iconColorClass; + return $this; + } + public function setBGColor($bgColorClass) + { + $this->bgColorClass = $bgColorClass; + return $this; + } + private function isActive() + { + return $this->active; + } + + private function link() + { + $self = $GLOBALS["self"]; + if ($this->hasChilds()) { + return $self->Html->link( + $this->title.'', + ['controller' => $this->controller, "action" => $this->action, $this->param], + ['escape' => false] + ); + } else { + return $self->Html->Link( + '' + .'' . $this->title . '' + .''. $this->iconClass .'', + ['controller' => $this->controller, 'action' => $this->action, $this->param], + ['class' => $this->bgColorClass, 'escape' => false] + ); + } + } + + public function __toString() + { + $str = ""; + $str .= "hasChilds()) { + $class .= "dropdown"; + } + if ($this->isActive()) { + $class .= " selected"; + } + if (strlen($class) > 0) { + $str .= " class='$class'"; + } + $str .= ">"; + + $str .= ''. $this->subtitle .''; + $str .= $this->link(); + + if ($this->hasChilds()) { + $str .= ""; + } + $str .= ""; + return $str; + } +} diff --git a/community_server/src/Model/Navigation/NaviHierarchy.php b/community_server/src/Model/Navigation/NaviHierarchy.php new file mode 100644 index 000000000..5017f8678 --- /dev/null +++ b/community_server/src/Model/Navigation/NaviHierarchy.php @@ -0,0 +1,49 @@ + +*/ +class NaviHierarchy implements \Countable +{ + private $hierarchy = []; + + public function add($entry) + { + array_push($this->hierarchy, $entry); + return $this; + } + public function getHierarchy() + { + return $this->hierarchy; + } + public function count() + { + return count($this->hierarchy); + } + public function __toString() + { + $html = ""; + return $html; + } +} diff --git a/community_server/src/Model/Navigation/NaviHierarchyEntry.php b/community_server/src/Model/Navigation/NaviHierarchyEntry.php new file mode 100644 index 000000000..5256518df --- /dev/null +++ b/community_server/src/Model/Navigation/NaviHierarchyEntry.php @@ -0,0 +1,53 @@ + +*/ +class NaviHierarchyEntry +{ + private $name; + private $controller; + private $action; + public function __construct($name, $controller, $action, $isLast) + { + $this->name = $name; + $this->controller = $controller; + $this->action = $action; + $this->isLast = $isLast; + return $this; + } + private function link() + { + $self = $GLOBALS["self"]; + return $self->Html->Link( + '' . $this->name . '', + ['controller' => $this->controller, 'action' => $this->action], + ['class' => "", 'escape' => false] + ); + } + + public function __toString() + { + $str = "isLast){ + $str .= " class='selected'"; + } + $str .= ">"; + $str .= $this->link(); + $str .= ""; + return $str; + } +} diff --git a/community_server/src/Model/Navigation/TitleOnly.php b/community_server/src/Model/Navigation/TitleOnly.php new file mode 100644 index 000000000..39d7ac616 --- /dev/null +++ b/community_server/src/Model/Navigation/TitleOnly.php @@ -0,0 +1,37 @@ +title = $title; + } + + public function __toString() { + $str = ""; + $str .= "hasChilds()) { $class .= " dropdown";} + if(strlen($class) > 0 ) $str .= " class='$class'"; + $str .= ">"; + $hNumber = 1; + if($this->isChild) $hNumber = 3; + $str .= "" . $this->title . ""; + if($this->hasChilds()) { + $str .= ""; + } + $str .= ""; + return $str; + } +} diff --git a/community_server/src/Model/Table/AddressTypesTable.php b/community_server/src/Model/Table/AddressTypesTable.php new file mode 100644 index 000000000..ea0c86d6e --- /dev/null +++ b/community_server/src/Model/Table/AddressTypesTable.php @@ -0,0 +1,73 @@ +setTable('address_types'); + $this->setDisplayField('name'); + $this->setPrimaryKey('id'); + + $this->hasMany('StateGroupAddresses', [ + 'foreignKey' => 'address_type_id' + ]); + $this->hasMany('TransactionGroupAddaddress', [ + 'foreignKey' => 'address_type_id' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->scalar('name') + ->maxLength('name', 25) + ->requirePresence('name', 'create') + ->notEmptyString('name'); + + $validator + ->scalar('text') + ->maxLength('text', 255) + ->allowEmptyString('text'); + + return $validator; + } +} diff --git a/community_server/src/Model/Table/AdminErrorsTable.php b/community_server/src/Model/Table/AdminErrorsTable.php new file mode 100644 index 000000000..e6263d8ff --- /dev/null +++ b/community_server/src/Model/Table/AdminErrorsTable.php @@ -0,0 +1,107 @@ +setTable('admin_errors'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->addBehavior('Timestamp'); + + $this->belongsTo('StateUsers', [ + 'foreignKey' => 'state_user_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->scalar('controller') + ->maxLength('controller', 255) + ->requirePresence('controller', 'create') + ->notEmptyString('controller'); + + $validator + ->scalar('action') + ->maxLength('action', 255) + ->requirePresence('action', 'create') + ->notEmptyString('action'); + + $validator + ->scalar('state') + ->maxLength('state', 255) + ->requirePresence('state', 'create') + ->notEmptyString('state'); + + $validator + ->scalar('msg') + ->maxLength('msg', 255) + ->requirePresence('msg', 'create') + ->notEmptyString('msg'); + + $validator + ->scalar('details') + ->maxLength('details', 255) + ->requirePresence('details', 'create') + ->notEmptyString('details'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/CommunityProfilesTable.php b/community_server/src/Model/Table/CommunityProfilesTable.php new file mode 100644 index 000000000..bbe862092 --- /dev/null +++ b/community_server/src/Model/Table/CommunityProfilesTable.php @@ -0,0 +1,81 @@ +setTable('community_profiles'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->belongsTo('StateUsers', [ + 'foreignKey' => 'state_user_id', + 'joinType' => 'INNER', + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->allowEmptyFile('profile_img'); + + $validator + ->scalar('profile_desc') + ->maxLength('profile_desc', 2000) + ->allowEmptyFile('profile_desc'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/ElopageBuysTable.php b/community_server/src/Model/Table/ElopageBuysTable.php new file mode 100644 index 000000000..a5279d920 --- /dev/null +++ b/community_server/src/Model/Table/ElopageBuysTable.php @@ -0,0 +1,116 @@ +setTable('elopage_buys'); + $this->setDisplayField('payer_email'); + $this->setPrimaryKey('id'); + + } + + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->integer('product_price') + ->requirePresence('product_price', 'create') + ->notEmptyString('product_price'); + + $validator + ->scalar('payer_email') + ->maxLength('payer_email', 255) + ->requirePresence('payer_email', 'create') + ->notEmptyString('payer_email'); + + $validator + ->scalar('publisher_email') + ->maxLength('publisher_email', 255) + ->requirePresence('publisher_email', 'create') + ->notEmptyString('publisher_email'); + + $validator + ->boolean('payed') + ->requirePresence('payed', 'create') + ->notEmptyString('payed'); + + $validator + ->dateTime('success_date') + ->requirePresence('success_date', 'create') + ->notEmptyDateTime('success_date'); + + $validator + ->scalar('event') + ->maxLength('event', 255) + ->requirePresence('event', 'create') + ->notEmptyString('event'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + + return $rules; + } + + /** + * Returns the database connection name to use by default. + * + * @return string + */ + public static function defaultConnectionName() + { + return 'loginServer'; + } +} diff --git a/community_server/src/Model/Table/OperatorTypesTable.php b/community_server/src/Model/Table/OperatorTypesTable.php new file mode 100644 index 000000000..8a3ce608c --- /dev/null +++ b/community_server/src/Model/Table/OperatorTypesTable.php @@ -0,0 +1,70 @@ +setTable('operator_types'); + $this->setDisplayField('name'); + $this->setPrimaryKey('id'); + + $this->hasMany('Operators', [ + 'foreignKey' => 'operator_type_id' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->scalar('name') + ->maxLength('name', 25) + ->requirePresence('name', 'create') + ->notEmptyString('name'); + + $validator + ->scalar('text') + ->maxLength('text', 255) + ->requirePresence('text', 'create') + ->notEmptyString('text'); + + return $validator; + } +} diff --git a/community_server/src/Model/Table/OperatorsTable.php b/community_server/src/Model/Table/OperatorsTable.php new file mode 100644 index 000000000..7ae272767 --- /dev/null +++ b/community_server/src/Model/Table/OperatorsTable.php @@ -0,0 +1,93 @@ +setTable('operators'); + $this->setDisplayField('name'); + $this->setPrimaryKey('id'); + + $this->belongsTo('OperatorTypes', [ + 'foreignKey' => 'operator_type_id', + 'joinType' => 'INNER' + ]); + + $this->addBehavior('Timestamp'); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->scalar('username') + ->maxLength('username', 50) + ->requirePresence('username', 'create') + ->notEmptyString('username'); + //->add('usernamePasswordHash', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); + + $validator + ->requirePresence('user_pubkey', 'create') + ->notEmptyString('user_pubkey'); + + $validator + ->scalar('data_base64') + ->maxLength('data_base64', 255) + ->requirePresence('data_base64', 'create') + ->notEmptyString('data_base64'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + //$rules->add($rules->isUnique(['usernamePasswordHash'])); + $rules->add($rules->existsIn(['operator_type_id'], 'OperatorTypes')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/ServerUsersTable.php b/community_server/src/Model/Table/ServerUsersTable.php new file mode 100644 index 000000000..0ad1fbacb --- /dev/null +++ b/community_server/src/Model/Table/ServerUsersTable.php @@ -0,0 +1,101 @@ +setTable('server_users'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->addBehavior('Timestamp'); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->scalar('username') + ->maxLength('username', 50) + ->requirePresence('username', 'create') + ->notEmptyString('username', __('Please give a username')); + + $validator + ->scalar('password') + ->maxLength('password', 255) + ->requirePresence('password', 'create') + ->notEmptyString('password', __('Please give a password')); + + $validator + ->email('email') + ->requirePresence('email', 'create') + ->notEmptyString('email', __('Please give a email')); + + $validator + ->scalar('role') + ->maxLength('role', 20) + ->notEmptyString('role'); + + $validator + ->boolean('activated') + ->notEmptyString('activated'); + + $validator + ->dateTime('last_login') + ->allowEmptyDateTime('last_login'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->isUnique(['username'])); + $rules->add($rules->isUnique(['email'])); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/StateBalancesTable.php b/community_server/src/Model/Table/StateBalancesTable.php new file mode 100644 index 000000000..85b2f7837 --- /dev/null +++ b/community_server/src/Model/Table/StateBalancesTable.php @@ -0,0 +1,81 @@ +setTable('state_balances'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->addBehavior('Timestamp'); + + $this->belongsTo('StateUsers', [ + 'foreignKey' => 'state_user_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->requirePresence('amount', 'create') + ->notEmptyString('amount'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/StateCreatedTable.php b/community_server/src/Model/Table/StateCreatedTable.php new file mode 100644 index 000000000..c97851f28 --- /dev/null +++ b/community_server/src/Model/Table/StateCreatedTable.php @@ -0,0 +1,96 @@ +setTable('state_created'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->addBehavior('Timestamp'); + + $this->belongsTo('Transactions', [ + 'foreignKey' => 'transaction_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('StateUsers', [ + 'foreignKey' => 'state_user_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->requirePresence('month', 'create') + ->notEmptyString('month'); + + $validator + ->requirePresence('year', 'create') + ->notEmptyString('year'); + + $validator + ->integer('short_ident_hash') + ->requirePresence('short_ident_hash', 'create') + ->notEmptyString('short_ident_hash'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); + $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/StateErrorsTable.php b/community_server/src/Model/Table/StateErrorsTable.php new file mode 100644 index 000000000..62893b7bf --- /dev/null +++ b/community_server/src/Model/Table/StateErrorsTable.php @@ -0,0 +1,88 @@ +setTable('state_errors'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->addBehavior('Timestamp'); + + $this->belongsTo('StateUsers', [ + 'foreignKey' => 'state_user_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('TransactionTypes', [ + 'foreignKey' => 'transaction_type_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->scalar('message_json') + ->requirePresence('message_json', 'create') + ->notEmptyString('message_json'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); + $rules->add($rules->existsIn(['transaction_type_id'], 'TransactionTypes')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/StateGroupAddressesTable.php b/community_server/src/Model/Table/StateGroupAddressesTable.php new file mode 100644 index 000000000..62fcf9470 --- /dev/null +++ b/community_server/src/Model/Table/StateGroupAddressesTable.php @@ -0,0 +1,83 @@ +setTable('state_group_addresses'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->belongsTo('StateGroups', [ + 'foreignKey' => 'state_group_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('AddressTypes', [ + 'foreignKey' => 'address_type_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->requirePresence('public_key', 'create') + ->notEmptyString('public_key'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['state_group_id'], 'StateGroups')); + $rules->add($rules->existsIn(['address_type_id'], 'AddressTypes')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/StateGroupRelationshipsTable.php b/community_server/src/Model/Table/StateGroupRelationshipsTable.php new file mode 100644 index 000000000..449561583 --- /dev/null +++ b/community_server/src/Model/Table/StateGroupRelationshipsTable.php @@ -0,0 +1,85 @@ +setTable('state_group_relationships'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->belongsTo('StateGroup1s', [ + 'foreignKey' => 'state_group1_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('StateGroup2s', [ + 'foreignKey' => 'state_group2_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('StateRelationships', [ + 'foreignKey' => 'state_relationship_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['state_group1_id'], 'StateGroup1s')); + $rules->add($rules->existsIn(['state_group2_id'], 'StateGroup2s')); + $rules->add($rules->existsIn(['state_relationship_id'], 'StateRelationships')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/StateGroupsTable.php b/community_server/src/Model/Table/StateGroupsTable.php new file mode 100644 index 000000000..49911d495 --- /dev/null +++ b/community_server/src/Model/Table/StateGroupsTable.php @@ -0,0 +1,102 @@ +setTable('state_groups'); + $this->setDisplayField('name'); + $this->setPrimaryKey('id'); + + $this->belongsTo('Indices', [ + 'foreignKey' => 'index_id', + 'joinType' => 'INNER' + ]); + $this->hasMany('StateGroupAddresses', [ + 'foreignKey' => 'state_group_id' + ]); + $this->hasMany('StateUsers', [ + 'foreignKey' => 'state_group_id' + ]); + $this->hasMany('TransactionGroupCreates', [ + 'foreignKey' => 'state_group_id' + ]); + $this->hasMany('Transactions', [ + 'foreignKey' => 'state_group_id' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->scalar('name') + ->maxLength('name', 50) + ->requirePresence('name', 'create') + ->notEmptyString('name'); + + $validator + ->requirePresence('root_public_key', 'create') + ->notEmptyString('root_public_key'); + + $validator + ->notEmptyString('user_count'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['index_id'], 'Indices')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/StateRelationshipTypesTable.php b/community_server/src/Model/Table/StateRelationshipTypesTable.php new file mode 100644 index 000000000..a18e7ce51 --- /dev/null +++ b/community_server/src/Model/Table/StateRelationshipTypesTable.php @@ -0,0 +1,63 @@ +setTable('state_relationship_types'); + $this->setDisplayField('name'); + $this->setPrimaryKey('id'); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->scalar('name') + ->maxLength('name', 25) + ->requirePresence('name', 'create') + ->notEmptyString('name'); + + $validator + ->scalar('text') + ->maxLength('text', 255) + ->allowEmptyString('text'); + + return $validator; + } +} diff --git a/community_server/src/Model/Table/StateUsersTable.php b/community_server/src/Model/Table/StateUsersTable.php new file mode 100644 index 000000000..77f026d0a --- /dev/null +++ b/community_server/src/Model/Table/StateUsersTable.php @@ -0,0 +1,118 @@ +setTable('state_users'); + $this->setDisplayField('email'); + $this->setPrimaryKey('id'); + + /*$this->belongsTo('Indices', [ + 'foreignKey' => 'index_id', + 'joinType' => 'INNER' + ]);*/ + $this->belongsTo('StateGroups', [ + 'foreignKey' => 'state_group_id', + 'joinType' => 'INNER' + ]); + $this->hasMany('StateBalances', [ + 'foreignKey' => 'state_user_id' + ]); + $this->hasMany('StateCreated', [ + 'foreignKey' => 'state_user_id' + ]); + $this->hasMany('TransactionCreations', [ + 'foreignKey' => 'state_user_id' + ]); + $this->hasMany('TransactionSendCoins', [ + 'foreignKey' => 'state_user_id' + ]); + $this->hasMany('TransactionReceivedCoins', [ + 'className' => 'TransactionSendCoins', + 'foreignKey' => 'receiver_user_id' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->requirePresence('public_key', 'create') + ->notEmptyString('public_key'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + // $rules->add($rules->existsIn(['index_id'], 'Indices')); + //$rules->add($rules->existsIn(['state_group_id'], 'StateGroups')); + + return $rules; + } + + public function getReceiverProposal() { + $stateUsers = $this->find('all'); + $receiverProposal = []; + foreach($stateUsers as $stateUser) { + $name = $stateUser->email; + $keyHex = bin2hex(stream_get_contents($stateUser->public_key)); + if($name === NULL) { + $name = $stateUser->first_name . ' ' . $stateUser->last_name; + } + array_push($receiverProposal, ['name' => $name, 'key' => $keyHex]); + //$stateUser->public_key + } + return $receiverProposal; + } +} diff --git a/community_server/src/Model/Table/TransactionCreationsTable.php b/community_server/src/Model/Table/TransactionCreationsTable.php new file mode 100644 index 000000000..bc9592ccf --- /dev/null +++ b/community_server/src/Model/Table/TransactionCreationsTable.php @@ -0,0 +1,89 @@ +setTable('transaction_creations'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->belongsTo('Transactions', [ + 'foreignKey' => 'transaction_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('StateUsers', [ + 'foreignKey' => 'state_user_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->requirePresence('amount', 'create') + ->notEmptyString('amount'); + + $validator + //->requirePresence('ident_hash', 'create') + //->notEmptyString('ident_hash'); + ->allowEmptyString('ident_hash', null, 'create'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); + $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); + $rules->add($rules->existsIn(['receiver_user_id'], 'StateUsers')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/TransactionGroupAddaddressTable.php b/community_server/src/Model/Table/TransactionGroupAddaddressTable.php new file mode 100644 index 000000000..3fd03f32a --- /dev/null +++ b/community_server/src/Model/Table/TransactionGroupAddaddressTable.php @@ -0,0 +1,83 @@ +setTable('transaction_group_addaddress'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->belongsTo('Transactions', [ + 'foreignKey' => 'transaction_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('AddressTypes', [ + 'foreignKey' => 'address_type_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->requirePresence('public_key', 'create') + ->notEmptyString('public_key'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); + $rules->add($rules->existsIn(['address_type_id'], 'AddressTypes')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/TransactionGroupAllowtradesTable.php b/community_server/src/Model/Table/TransactionGroupAllowtradesTable.php new file mode 100644 index 000000000..463d1af8e --- /dev/null +++ b/community_server/src/Model/Table/TransactionGroupAllowtradesTable.php @@ -0,0 +1,83 @@ +setTable('transaction_group_allowtrades'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->belongsTo('Transactions', [ + 'foreignKey' => 'transaction_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('Groups', [ + 'foreignKey' => 'group_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->boolean('allow') + ->notEmptyString('allow'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); + $rules->add($rules->existsIn(['group_id'], 'Groups')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/TransactionGroupCreatesTable.php b/community_server/src/Model/Table/TransactionGroupCreatesTable.php new file mode 100644 index 000000000..263182b8e --- /dev/null +++ b/community_server/src/Model/Table/TransactionGroupCreatesTable.php @@ -0,0 +1,89 @@ +setTable('transaction_group_creates'); + $this->setDisplayField('name'); + $this->setPrimaryKey('id'); + + $this->belongsTo('Transactions', [ + 'foreignKey' => 'transaction_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('StateGroups', [ + 'foreignKey' => 'state_group_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->requirePresence('group_public_key', 'create') + ->notEmptyString('group_public_key'); + + $validator + ->scalar('name') + ->maxLength('name', 64) + ->requirePresence('name', 'create') + ->notEmptyString('name'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); + $rules->add($rules->existsIn(['state_group_id'], 'StateGroups')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/TransactionSendCoinsTable.php b/community_server/src/Model/Table/TransactionSendCoinsTable.php new file mode 100644 index 000000000..87ebb72f4 --- /dev/null +++ b/community_server/src/Model/Table/TransactionSendCoinsTable.php @@ -0,0 +1,98 @@ +setTable('transaction_send_coins'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->belongsTo('Transactions', [ + 'foreignKey' => 'transaction_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('StateUsers', [ + 'foreignKey' => 'state_user_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('ReceiverUsers', [ + 'className' => 'StateUsers', + 'foreignKey' => 'receiver_user_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->requirePresence('receiver_public_key', 'create') + ->notEmptyString('receiver_public_key'); + + $validator + ->requirePresence('amount', 'create') + ->notEmptyString('amount'); + + $validator + ->requirePresence('sender_final_balance', 'create') + ->notEmptyString('sender_final_balance'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); + $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); + $rules->add($rules->existsIn(['receiver_user_id'], 'ReceiverUsers')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/TransactionSignaturesTable.php b/community_server/src/Model/Table/TransactionSignaturesTable.php new file mode 100644 index 000000000..60c1ae99f --- /dev/null +++ b/community_server/src/Model/Table/TransactionSignaturesTable.php @@ -0,0 +1,81 @@ +setTable('transaction_signatures'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->belongsTo('Transactions', [ + 'foreignKey' => 'transaction_id', + 'joinType' => 'INNER' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->requirePresence('signature', 'create') + ->notEmptyString('signature'); + + $validator + ->requirePresence('pubkey', 'create') + ->notEmptyString('pubkey'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/TransactionTypesTable.php b/community_server/src/Model/Table/TransactionTypesTable.php new file mode 100644 index 000000000..5cc842f5e --- /dev/null +++ b/community_server/src/Model/Table/TransactionTypesTable.php @@ -0,0 +1,69 @@ +setTable('transaction_types'); + $this->setDisplayField('name'); + $this->setPrimaryKey('id'); + + $this->hasMany('Transactions', [ + 'foreignKey' => 'transaction_type_id' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->scalar('name') + ->maxLength('name', 24) + ->requirePresence('name', 'create') + ->notEmptyString('name'); + + $validator + ->scalar('text') + ->maxLength('text', 255) + ->allowEmptyString('text'); + + return $validator; + } +} diff --git a/community_server/src/Model/Table/TransactionsTable.php b/community_server/src/Model/Table/TransactionsTable.php new file mode 100644 index 000000000..75659a5b2 --- /dev/null +++ b/community_server/src/Model/Table/TransactionsTable.php @@ -0,0 +1,117 @@ +setTable('transactions'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->belongsTo('StateGroups', [ + 'foreignKey' => 'state_group_id', + 'joinType' => 'INNER' + ]); + $this->belongsTo('TransactionTypes', [ + 'foreignKey' => 'transaction_type_id', + 'joinType' => 'INNER' + ]); + $this->hasMany('StateCreated', [ + 'foreignKey' => 'transaction_id' + ]); + $this->hasMany('TransactionCreations', [ + 'foreignKey' => 'transaction_id' + ]); + $this->hasMany('TransactionGroupAddaddress', [ + 'foreignKey' => 'transaction_id' + ]); + $this->hasMany('TransactionGroupAllowtrades', [ + 'foreignKey' => 'transaction_id' + ]); + $this->hasMany('TransactionGroupCreates', [ + 'foreignKey' => 'transaction_id' + ]); + $this->hasMany('TransactionSendCoins', [ + 'foreignKey' => 'transaction_id' + ]); + $this->hasMany('TransactionSignatures', [ + 'foreignKey' => 'transaction_id' + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->allowEmptyString('id', null, 'create'); + + $validator + //->requirePresence('tx_hash', 'create') + ->allowEmptyString('tx_hash', null, 'create'); + + $validator + ->allowEmptyString('memo', null, 'create'); + + $validator + ->dateTime('received') + ->notEmptyDateTime('received'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->existsIn(['state_group_id'], 'StateGroups')); + $rules->add($rules->existsIn(['transaction_type_id'], 'TransactionTypes')); + + return $rules; + } +} diff --git a/community_server/src/Model/Table/UsersTable.php b/community_server/src/Model/Table/UsersTable.php new file mode 100644 index 000000000..0e99ba521 --- /dev/null +++ b/community_server/src/Model/Table/UsersTable.php @@ -0,0 +1,130 @@ +setTable('users'); + $this->setDisplayField('id'); + $this->setPrimaryKey('id'); + + $this->addBehavior('Timestamp'); + + $this->hasMany('EmailOptIn', [ + 'foreignKey' => 'user_id', + ]); + $this->hasMany('UserBackups', [ + 'foreignKey' => 'user_id', + ]); + $this->hasMany('UserRoles', [ + 'foreignKey' => 'user_id', + ]); + } + + /** + * Default validation rules. + * + * @param \Cake\Validation\Validator $validator Validator instance. + * @return \Cake\Validation\Validator + */ + public function validationDefault(Validator $validator) + { + $validator + ->integer('id') + ->allowEmptyString('id', null, 'create'); + + $validator + ->email('email') + ->requirePresence('email', 'create') + ->notEmptyString('email') + ->add('email', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); + + $validator + ->scalar('first_name') + ->maxLength('first_name', 150) + ->requirePresence('first_name', 'create') + ->notEmptyString('first_name'); + + $validator + ->scalar('last_name') + ->maxLength('last_name', 255) + ->allowEmptyString('last_name'); + + $validator + ->requirePresence('password', 'create') + ->notEmptyString('password'); + + $validator + ->allowEmptyString('pubkey'); + + $validator + ->allowEmptyString('privkey'); + + $validator + ->boolean('email_checked') + ->notEmptyString('email_checked'); + + $validator + ->scalar('language') + ->maxLength('language', 4) + ->notEmptyString('language'); + + return $validator; + } + + /** + * Returns a rules checker object that will be used for validating + * application integrity. + * + * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. + * @return \Cake\ORM\RulesChecker + */ + public function buildRules(RulesChecker $rules) + { + $rules->add($rules->isUnique(['email'])); + + return $rules; + } + + /** + * Returns the database connection name to use by default. + * + * @return string + */ + public static function defaultConnectionName() + { + return 'loginServer'; + } +} diff --git a/community_server/src/Model/Transactions/SignatureMap.php b/community_server/src/Model/Transactions/SignatureMap.php new file mode 100644 index 000000000..d8cf35929 --- /dev/null +++ b/community_server/src/Model/Transactions/SignatureMap.php @@ -0,0 +1,68 @@ +mProtoSigMap = $protoSigMap; + } + + public function getProto() { + return $this->mProtoSigMap; + } + + static public function fromEntity($transactionSignatures) + { + + $protoSigMap = new \Model\Messages\Gradido\SignatureMap(); + $sigPairs = $protoSigMap->getSigPair(); + //echo "sigPairs: "; var_dump($sigPairs); echo "
    "; + //return null; + foreach($transactionSignatures as $signature) { + $sigPair = new \Model\Messages\Gradido\SignaturePair(); + $sigPair->setPubKey(stream_get_contents($signature->pubkey)); + $sigPair->setEd25519(stream_get_contents($signature->signature)); + + $sigPairs[] = $sigPair; + //array_push($sigPairs, $sigPair); + } + return new SignatureMap($protoSigMap); + } + + static public function build($bodyBytes, array $keys) + { + $protoSigMap = new \Model\Messages\Gradido\SignatureMap(); + $sigPairs = $protoSigMap->getSigPair(); + //echo "sigPairs: "; var_dump($sigPairs); echo "
    "; + //return null; + + // sign with keys + foreach($keys as $key) { + $sigPair = new \Model\Messages\Gradido\SignaturePair(); + $sigPair->setPubKey(hex2bin($key['pub'])); + $sigPair->setEd25519(sodium_crypto_sign_detached($bodyBytes, hex2bin($key['priv']))); + + $sigPairs[] = $sigPair; + } + //array_push($sigPairs, $sigPair); + + return new SignatureMap($protoSigMap); + } + + +} \ No newline at end of file diff --git a/community_server/src/Model/Transactions/Transaction.php b/community_server/src/Model/Transactions/Transaction.php new file mode 100644 index 000000000..76353595a --- /dev/null +++ b/community_server/src/Model/Transactions/Transaction.php @@ -0,0 +1,269 @@ +mProtoTransaction = $base64Data; + $this->mTransactionBody = new TransactionBody($this->mProtoTransaction->getBodyBytes()); + return; + } + + try { + $transactionBin = sodium_base642bin($base64Data, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING); + } catch(\SodiumException $e) { + //$this->addError('Transaction', $e->getMessage());// . ' ' . $base64Data); + //return; + $transactionBin = base64_decode($base64Data, true); + if($transactionBin == false) { + $this->addError('Transaction', $e->getMessage());// . ' ' . $base64Data); + return; + } + } + //*/} + + if($transactionBin == false) { + //$this->addError('base64 decode failed'); + $this->addError('Transaction', 'base64 decode error: ' . $base64Data); + } else { + //var_dump($transactionBin); + $this->mProtoTransaction = new \Model\Messages\Gradido\Transaction(); + try { + $this->mProtoTransaction->mergeFromString($transactionBin); + //var_dump($this->mProtoTransaction); + // cannot catch Exception with cakePHP, I don't know why + } catch(\Google\Protobuf\Internal\GPBDecodeException $e) { + //var_dump($e); + $this->addError('Transaction', $e->getMessage()); + return; + }//*/ + + //echo 'serialize to json:
    '; + //echo $this->mProtoTransaction->serializeToJsonString(); + //echo "body bytes:
    "; + //var_dump($this->mProtoTransaction->getBodyBytes()); + //echo "
    end body bytes
    "; + $this->mTransactionBody = new TransactionBody($this->mProtoTransaction->getBodyBytes()); + } + } + + static public function build(\Model\Messages\Gradido\TransactionBody $transactionBody, $senderKeyPair) + { + $protoTransaction = new \Model\Messages\Gradido\Transaction(); + + $recevied = new \Model\Messages\Gradido\TimestampSeconds(); + $recevied->setSeconds(time()); + $protoTransaction->setReceived($recevied); + + $bodyBytes = $transactionBody->serializeToString(); + + $sigMap = SignatureMap::build($bodyBytes, [$senderKeyPair]); + $protoTransaction->setSigMap($sigMap->getProto()); + + $protoTransaction->setBodyBytes($bodyBytes); + + return $protoTransaction; + + } + + public function getTransactionBody() { + return $this->mTransactionBody; + } + + public function getFirstPublic() { + $sigPairs = $this->mProtoTransaction->getSigMap()->getSigPair(); + return $sigPairs[0]->getPubKey(); + } + + public function getId() { + return $this->mProtoTransaction->getId(); + } + + public function validate() { + $sigMap = $this->mProtoTransaction->getSigMap(); + if(!$sigMap) { + $this->addError('Transaction', 'signature map is zero'); + return false; + } + //var_dump($sigMap); + //die(); + $sigPairs = $sigMap->getSigPair(); + $bodyBytes = $this->mProtoTransaction->getBodyBytes(); + + + if(!$sigPairs || count($sigPairs) < 1) { + $this->addError('Transaction::validate', 'no signature found'); + return false; + } + + // check signature(s) + foreach($sigPairs as $sigPair) { + //echo 'sig Pair: '; var_dump($sigPair); echo "
    "; + $pubkey = $sigPair->getPubKey(); + $signature = $sigPair->getEd25519(); + //echo "verify bodybytes:
    " . bin2hex($bodyBytes) . '
    '; + if (!\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) { + $this->addError('Transaction::validate', 'signature for key ' . bin2hex($pubkey) . ' isn\'t valid ' ); + return false; + } + } + + if(!$this->mTransactionBody->validate($sigPairs)) { + $this->addErrors($this->mTransactionBody->getErrors()); + return false; + } + + return true; + } + + public function save() + { + $connection = ConnectionManager::get('default'); + $connection->begin(); + //id transaction_id signature pubkey + + if (!$this->mTransactionBody->save($this->getFirstPublic(), $this->mProtoTransaction->getSigMap())) { + $this->addErrors($this->mTransactionBody->getErrors()); + $connection->rollback(); + return false; + } + + // save transaction signatures + $transactionsSignaturesTable = TableRegistry::getTableLocator()->get('transaction_signatures'); + $transactionId = $this->mTransactionBody->getTransactionID(); + //signature pubkey + + $sigPairs = $this->mProtoTransaction->getSigMap()->getSigPair(); + //echo "sigPairs: "; var_dump($sigPairs); + $signatureEntitys = []; + foreach($sigPairs as $sigPair) { + $signatureEntity = $transactionsSignaturesTable->newEntity(); + $signatureEntity->transaction_id = $transactionId; + $signatureEntity->signature = $sigPair->getEd25519(); + $signatureEntity->pubkey = $sigPair->getPubKey(); + array_push($signatureEntitys, $signatureEntity); + } + //debug($signatureEntitys); + if(!$transactionsSignaturesTable->saveMany($signatureEntitys)) { + foreach($signatureEntitys as $entity) { + $errors = $entity->getErrors(); + if(!$errors && count($errors) > 0) { + $pubkeyHex = bin2hex($entity->pubkey); + $this->addError('Transaction::save', 'error saving signature for pubkey: ' . $pubkeyHex . ', with errors: ' . json_encode($errors) ); + } + } + $connection->rollback(); + return false; + } + + $connection->commit(); + + $this->mTransactionBody->getSpecificTransaction()->sendNotificationEmail($this->mTransactionBody->getMemo()); + + return true; + } + + static public function fromTable($id) + { + $transactionsTable = TableRegistry::getTableLocator()->get('transactions'); + $transactionEntry = $transactionsTable + ->find('all') + ->where(['id' => $id]) + ->contain([ + 'TransactionCreations', + 'TransactionSendCoins', + 'TransactionSignatures']) + ->first(); + //var_dump($transactionEntry->toArray()); + $protoTransaction = new \Model\Messages\Gradido\Transaction(); + + + + $protoTransaction->setId($transactionEntry->id); + + + $recevied = new \Model\Messages\Gradido\TimestampSeconds(); + $recevied->setSeconds($transactionEntry->received->getTimestamp()); + $protoTransaction->setReceived($recevied); + + + $sigMap = SignatureMap::fromEntity($transactionEntry->transaction_signatures); + $protoTransaction->setSigMap($sigMap->getProto()); + + //echo "sig map: check
    "; + $protoTransaction->setTxHash(stream_get_contents($transactionEntry->tx_hash)); + + $body = TransactionBody::fromEntity($transactionEntry->memo, $transactionEntry); + if(is_array($body)) { + return ['state' => 'error', 'msg' => 'error creating body transaction', 'details' => $body]; + } + + // validate signatures + $sigPairs = $sigMap->getProto()->getSigPair(); + + if(!$sigPairs || count($sigPairs) < 1) { + return ['state' => 'error', 'msg' => 'error no signatures found']; + } + + //echo "verify bodybytes:
    " . bin2hex($bodyBytes) . '
    '; + $created = new \Model\Messages\Gradido\TimestampSeconds(); + $created->setSeconds($recevied->getSeconds()); + $body->setCreated($created); + $bodyBytes = $body->serializeToString(); + $createTrys = 0; + $createRight = false; + // check signature(s) and + // try to get created field of TransactionBody right, because it wasn't saved + foreach($sigPairs as $sigPair) { + //echo 'sig Pair: '; var_dump($sigPair); echo "
    "; + $pubkey = $sigPair->getPubKey(); + $signature = $sigPair->getEd25519(); + if(!$createRight) { + while($createTrys < 500) { + if(\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) { + $createRight = true; + break; + } else { + $createTrys++; + $created->setSeconds($created->getSeconds() - 1); + //$body->setCreated($created); + $bodyBytes = $body->serializeToString(); + } + } + } + + if (!\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) { + return ['state' => 'error', 'msg' => 'signature for key ' . bin2hex($pubkey) . ' isn\'t valid ']; + } + } + + $protoTransaction->setBodyBytes($bodyBytes); + + + + return $protoTransaction; + } + +} \ No newline at end of file diff --git a/community_server/src/Model/Transactions/TransactionBase.php b/community_server/src/Model/Transactions/TransactionBase.php new file mode 100644 index 000000000..4198fbaaa --- /dev/null +++ b/community_server/src/Model/Transactions/TransactionBase.php @@ -0,0 +1,93 @@ +errors; + } + + public function addError($functionName, $errorName) { + array_push($this->errors, [$functionName => $errorName]); + } + + public function addErrors($errors) { + $this->errors = array_merge($this->errors, $errors); + } + + public function hasErrors() { + return count($this->errors) > 0; + } + + public static function getStateUsersTable() + { + if(!self::$stateUsersTable) { + self::$stateUsersTable = TableRegistry::getTableLocator()->get('state_users'); + } + return self::$stateUsersTable; + } + + + protected function getStateUserId($publicKey) { + + $stateUsersTable = self::getStateUsersTable(); + $stateUser = $stateUsersTable->find('all')->select(['id'])->where(['public_key' => $publicKey])->first(); + if($stateUser) { + return $stateUser->id; + } + // create new entry + $stateUserEntity = $stateUsersTable->newEntity(); + $stateUserEntity->public_key = $publicKey; + if($stateUsersTable->save($stateUserEntity)) { + return $stateUserEntity->id; + } else { + $this->addError('TransactionBase::getStateUserId', 'error saving new state user with error: ' . json_encode($stateUserEntity->getErrors())); + } + + return NULL; + } + + protected function getStateUser($id) { + $stateUsersTable = self::getStateUsersTable(); + $stateUser = $stateUsersTable->get($id); + if($stateUser) { + return $stateUser; + } + + return NULL; + } + + + protected function updateStateBalance($stateUserId, $addAmountCent) { + $finalBalance = 0; + $stateBalancesTable = TableRegistry::getTableLocator()->get('stateBalances'); + $stateBalanceQuery = $stateBalancesTable + ->find('all') + ->select(['amount', 'id']) + ->contain(false) + ->where(['state_user_id' => $stateUserId]);//->first(); + //debug($stateBalanceQuery); + + if($stateBalanceQuery->count() > 0) { + $stateBalanceEntry = $stateBalanceQuery->first(); + $stateBalanceEntry->amount += $addAmountCent; + } else { + $stateBalanceEntry = $stateBalancesTable->newEntity(); + $stateBalanceEntry->state_user_id = $stateUserId; + $stateBalanceEntry->amount = $addAmountCent; + } + $finalBalance = $stateBalanceEntry->amount; + //echo "\ntry to save: "; var_dump($stateBalanceEntry); echo "\n"; + if(!$stateBalancesTable->save($stateBalanceEntry)) { + $errors = $stateBalanceEntry->getErrors(); + $this->addError('TransactionBase::updateStateBalance', 'error saving state balance with: ' . json_encode($errors)); + return false; + } + return $finalBalance; + } +} \ No newline at end of file diff --git a/community_server/src/Model/Transactions/TransactionBody.php b/community_server/src/Model/Transactions/TransactionBody.php new file mode 100644 index 000000000..0dca15637 --- /dev/null +++ b/community_server/src/Model/Transactions/TransactionBody.php @@ -0,0 +1,191 @@ +mProtoTransactionBody = new \Model\Messages\Gradido\TransactionBody(); + try { + $this->mProtoTransactionBody->mergeFromString($bodyBytes); + // cannot catch Exception with cakePHP, I don't know why + } catch(\Google\Protobuf\Internal\GPBDecodeException $e) { + //var_dump($e); + $this->addError('TransactionBody', $e->getMessage()); + return; + } + + switch($this->mProtoTransactionBody->getData()) { + case 'creation' : $this->mSpecificTransaction = new TransactionCreation($this->mProtoTransactionBody->getCreation()); break; + case 'transfer' : $this->mSpecificTransaction = new TransactionTransfer($this->mProtoTransactionBody->getTransfer()); break; + } + } + + public function validate($sigPairs) { + + // transaction type id + $transactionTypesTable = TableRegistry::getTableLocator()->get('transaction_types'); + + $typeName = $this->getTransactionTypeName(); + $transactionType = $transactionTypesTable->find('all')->where(['name' => $typeName])->select(['id'])->first(); + if($transactionType == NULL) { + $this->addError('TransactionBody::validate', 'zero type id for type: ' . $typeName); + return false; + } + $this->transactionTypeId = $transactionType->id; + + // check if creation time is in the past + if($this->mProtoTransactionBody->getCreated()->getSeconds() > time()) { + $this->addError('TransactionBody::validate', 'Transaction were created in the past!'); + return false; + } + if(!$this->mSpecificTransaction->validate($sigPairs)) { + $this->addErrors($this->mSpecificTransaction->getErrors()); + return false; + } + + + + return true; + } + + public function getSpecificTransaction() { + return $this->mSpecificTransaction; + } + + public function getMemo() { + return $this->mProtoTransactionBody->getMemo(); + } + + public function getTransactionTypeName() + { + return $this->mProtoTransactionBody->getData(); + } + + public function save($firstPublic, $sigMap) { + $transactionsTable = TableRegistry::getTableLocator()->get('transactions'); + $transactionEntity = $transactionsTable->newEntity(); + + + $transactionEntity->transaction_type_id = $this->transactionTypeId; + $transactionEntity->memo = $this->getMemo(); + + if ($transactionsTable->save($transactionEntity)) { + // success + $this->mTransactionID = $transactionEntity->id; + if(!$this->mSpecificTransaction->save($transactionEntity->id, $firstPublic)) { + $this->addErrors($this->mSpecificTransaction->getErrors()); + return false; + } + } else { + $this->addError('TransactionBody::save', 'error saving transaction with: ' . json_encode($transactionEntity->getError())); + return false; + } + $previousTxHash = null; + if($this->mTransactionID > 1) { + try { + $previousTransaction = $transactionsTable + ->find('all', ['contain' => false]) + ->select(['tx_hash']) + ->where(['id' => $this->mTransactionID - 1]) + ->first(); + /*$previousTransaction = $transactionsTable->get($this->mTransactionID - 1, [ + 'contain' => false, + 'fields' => ['tx_hash'] + ]);*/ + } catch(Cake\Datasource\Exception\RecordNotFoundException $ex) { + $this->addError('TransactionBody::save', 'previous transaction (with id ' . ($this->mTransactionID-1) . ' not found'); + return false; + } + if(!$previousTransaction) { + // shouldn't occur + $this->addError('TransactionBody::save', 'previous transaction (with id ' . ($this->mTransactionID-1) . ' not found'); + return false; + } + $previousTxHash = $previousTransaction->tx_hash; + } + try { + //$transactionEntity->received = $transactionsTable->get($transactionEntity->id, ['contain' => false, 'fields' => ['received']])->received; + $transactionEntity->received = $transactionsTable + ->find('all', ['contain' => false]) + ->where(['id' => $transactionEntity->id]) + ->select(['received'])->first()->received; + } catch(Cake\Datasource\Exception\RecordNotFoundException $ex) { + $this->addError('TransactionBody::save', 'current transaction (with id ' . ($transactionEntity->id) . ' not found'); + $this->addError('exception: ', $ex->getMessage()); + return false; + } + + // calculate tx hash + // previous tx hash + id + received + sigMap as string + // Sodium use for the generichash function BLAKE2b today (11.11.2019), mabye change in the future + $state = \Sodium\crypto_generichash_init(); + //echo "prev hash: $previousTxHash\n"; + if($previousTxHash != null) { + \Sodium\crypto_generichash_update($state, stream_get_contents($previousTxHash)); + } + //echo "id: " . $transactionEntity->id . "\n"; + \Sodium\crypto_generichash_update($state, strval($transactionEntity->id)); + //echo "received: " . $transactionEntity->received; + \Sodium\crypto_generichash_update($state, $transactionEntity->received->i18nFormat('yyyy-MM-dd HH:mm:ss')); + \Sodium\crypto_generichash_update($state, $sigMap->serializeToString()); + $transactionEntity->tx_hash = \Sodium\crypto_generichash_final($state); + if ($transactionsTable->save($transactionEntity)) { + return true; + } + $this->addError('TransactionBody::save', 'error saving transaction with: ' . json_encode($transactionEntity->getError())); + return false; + } + + public function getTransactionID() { + return $this->mTransactionID; + } + + public function getTransactionTypeId() { + return $this->transactionTypeId; + } + + static public function fromEntity($memo, $transaction) + { + $protoBody = new \Model\Messages\Gradido\TransactionBody(); + $protoBody->setMemo($memo); + + //$created->setSeconds($var); + //$protoBody->setCreated($created); + if(count($transaction->transaction_creations) == 1) { + //echo "is creation
    "; + $protoBody->setCreation(TransactionCreation::fromEntity($transaction->transaction_creations[0])->getProto()); + } + else if(count($transaction->transaction_send_coins) == 1) { + //echo "is transfer"; + $protoBody->setTransfer(TransactionTransfer::fromEntity($transaction->transaction_send_coins)->getProto()); + } else { + return ['invalid transaction type or count']; + } + + return $protoBody; + } + + static public function build($memo, $specificTransaction) + { + $protoBody = new \Model\Messages\Gradido\TransactionBody(); + $protoBody->setMemo($memo); + + if(is_a($specificTransaction, 'TransactionCreation')) { + $protoBody->setCreation($specificTransaction->getProto()); + } else if(is_a($specificTransaction, 'TransactionTransfer')) { + $protoBody->setTransfer($specificTransaction->getProto()); + } else { + return ['invalid tarnsaction type']; + } + return $protoBody; + + } + +} diff --git a/community_server/src/Model/Transactions/TransactionCreation.php b/community_server/src/Model/Transactions/TransactionCreation.php new file mode 100644 index 000000000..d9caa9f7b --- /dev/null +++ b/community_server/src/Model/Transactions/TransactionCreation.php @@ -0,0 +1,292 @@ +protoTransactionCreation = $protoTransactionCreation; + $this->transactionCreationsTable = TableRegistry::getTableLocator()->get('transaction_creations'); + $this->receiver_pubkey_hex = bin2hex($this->getReceiverPublic()); + } + + public function getProto() { + return $this->protoTransactionCreation; + } + + static public function build($amount, $memo, $receiver_public_hex, $ident_hash, $targetDate = null) + { + $receiver = new \Model\Messages\Gradido\ReceiverAmount(); + $receiver->setAmount($amount); + //$this->receiver_pubkey_hex = $receiver_public_hex; + if(strlen($receiver_public_hex) != 64) { + return ['state' => 'error', 'msg' => 'invalid pubkey']; + } + $pubKeyBin = hex2bin($receiver_public_hex); + $receiver->setEd25519ReceiverPubkey($pubKeyBin); + //var_dump($requestData); + + $creationDate = new \Model\Messages\Gradido\TimestampSeconds(); + $creationDate->setSeconds(time()); + + $transactionBody = new \Model\Messages\Gradido\TransactionBody(); + $transactionBody->setMemo($memo); + $transactionBody->setCreated($creationDate); + + + $transaction = new \Model\Messages\Gradido\TransactionCreation(); + $transaction->setReceiverAmount($receiver); + $transaction->setIdentHash($ident_hash); + //echo "target date: "; + //var_dump($targetDate); + //die('die'); + if($targetDate) { + $targetDateTimestamp = new \Model\Messages\Gradido\TimestampSeconds(); + $targetDateTimestamp->setSeconds($targetDate->getTimestamp()); + //var_dump($targetDateTimestamp); die('target'); + $transaction->setTargetDate($targetDateTimestamp); + } + + $transactionBody->setCreation($transaction); + return ['state' => 'success', 'transactionBody' => $transactionBody]; + } + + static protected function DRHashRotateLeft( $hash, $rotateBy ) + { + return ($hash<<$rotateBy)|($hash>>(32-$rotateBy)); + } + + static public function DRMakeStringHash($str) + { + $ret = 0; + + if( $str ) + { + for ($i=0; $i < strlen($str); $i++) + { + $ret = TransactionCreation::DRHashRotateLeft($ret, 7) + ord($str{$i}); + } + } + return $ret; + } + + public function getAmount() { + return $this->protoTransactionCreation->getReceiverAmount()->getAmount(); + } + + public function getReceiverPublic() { + return $this->protoTransactionCreation->getReceiverAmount()->getEd25519ReceiverPubkey(); + } + + public function getIdentHash() { + return $this->protoTransactionCreation->getIdentHash(); + } + + + public function validate($sigPairs) { + // check if receiver public is not in signature list + $receiverPublic = $this->getReceiverPublic(); + foreach($sigPairs as $sigPair) { + $pubkey = $sigPair->getPubKey(); + if($pubkey == $receiverPublic) { + $this->addError('TransactionCreation::validate', 'receiver aren\'t allowed to sign creation Transaction'); + return false; + } + } + + // check if creation threshold for this month isn't reached + + //$identHashBin = sprintf("%0d", $this->getIdentHash()); + // padding with zero in case hash is smaller than 32 bytes, static length binary field in db + // ident hash isn't collision ressistent, it is for speed up search + $identHashBin = pack('a32', $this->getIdentHash()); + + ////////// old validation not more than 3k GDD for 3 Month /////////////// + /*$existingCreations = $this->transactionCreationsTable + ->find('all') + ->select(['amount', 'state_user_id', 'target_date']) + ->contain(['StateUsers' => ['fields' => ['StateUsers.public_key']]]) + ->where(['target_date' => NULL]); + //$targetDate = $this->protoTransactionCreation->getTargetDate(); + //echo "choose existing transactions
    "; + //$existingCreations->where([$q->func()->extract('YEAR_MONTH', 'target_date') . ' LIKE ' . $q->func()->extract('YEAR_MONTH', $targetDate)]); + // ->where(['EXTRACT(YEAR_MONTH FROM target_date) LIKE EXTRACT(YEAR_MONTH FROM']); + // uncomment because ident hash didn't work at the moment + //->where(['ident_hash' => $identHashBin]); + //$existingCreations->select(['amount_sum' => $existingCreations->func()->sum('amount')]); + + $existingCreations->matching('Transactions', function ($q) { + + return $q->where( + ['OR' => + ['EXTRACT(YEAR_MONTH FROM Transactions.received) LIKE EXTRACT(YEAR_MONTH FROM NOW())', + 'EXTRACT(YEAR_MONTH FROM DATE_ADD(Transactions.received, INTERVAL 2 MONTH)) LIKE EXTRACT(YEAR_MONTH FROM NOW())'] + ])->select('received'); + + + }); + //debug($existingCreations); + //echo "after choose existing transactions
    "; + $newSum = $this->getAmount(); + //var_dump($existingCreations->toArray()); + foreach($existingCreations as $creation) { + $keyHex = bin2hex(stream_get_contents($creation->state_user->public_key)); + //echo "\ncompare \n$keyHex\nwith: \n". $this->receiver_pubkey_hex."\n"; + if($keyHex == $this->receiver_pubkey_hex) { + $newSum += $creation->amount; + } + } + + + if($newSum > 30000000) { + $this->addError('TransactionCreation::validate', 'Creation more than 1.000 GDD per Month (3 Month) not allowed'); + return false; + }//*/ + + /////////////// new validation, not more than 1K GDD per month via target_date /////////////////////////// + $existingCreations2 = $this->transactionCreationsTable + ->find('all') + ->select(['amount', 'state_user_id', 'target_date']) + ->contain(['StateUsers' => ['fields' => ['StateUsers.public_key']]]); + $q = $existingCreations2; + $targetDate = $this->protoTransactionCreation->getTargetDate(); + + $targetDateFrozen = new FrozenDate($targetDate->getSeconds()); + $targetDateMonthYearConcat = $targetDateFrozen->format('Ym'); + + $existingCreations2->where([ + 'target_date IS NOT' => NULL, + 'EXTRACT(YEAR_MONTH FROM target_date) LIKE ' => $targetDateMonthYearConcat, + ]); + + $newSum2 = $this->getAmount(); + $receiverEmail = ''; + foreach($existingCreations2 as $creation) { + $keyHex = bin2hex(stream_get_contents($creation->state_user->public_key)); + //echo "\ncompare \n$keyHex\nwith: \n". $this->receiver_pubkey_hex."\n"; + if($keyHex == $this->receiver_pubkey_hex) { + $newSum2 += $creation->amount; + $receiverEmail = $creation->state_user->email; + } + //$newSum2 += $creation->amount; + } + + /*if(!$existingCreations2->count()) { + if($newSum > 30000000) { + $this->addError('TransactionCreation::validate', 'Creation more than 1.000 GDD per Month (3 Month) not allowed'); + return false; + } + } else {*/ + if($newSum2 > 10000000) { + $this->addError( + 'TransactionCreation::validate', + 'Creation more than 1.000 GDD per Month for '. $receiverEmail .' in target_date not allowed' + ); + return false; + //} + } + + return true; + } + + public function save($transaction_id, $firstPublic) + { + + $transactionCreationEntity = $this->transactionCreationsTable->newEntity(); + $transactionCreationEntity->transaction_id = $transaction_id; + + // state user id + //$state_user_id = $this->getStateUserId($firstPublic); + $receiverUserId = $this->getStateUserId($this->getReceiverPublic()); + if(!$receiverUserId) { + $this->addError('TransactionCreation::save', 'couldn\'t get state user id'); + return false; + } + $transactionCreationEntity->state_user_id = $receiverUserId; + $transactionCreationEntity->amount = $this->getAmount(); + $transactionCreationEntity->ident_hash = $this->getIdentHash(); + $transactionCreationEntity->target_date = $this->protoTransactionCreation->getTargetDate()->getSeconds(); + + if(!$this->transactionCreationsTable->save($transactionCreationEntity)) { + $this->addError('TransactionCreation::save', 'error saving transactionCreation with errors: ' . json_encode($transactionCreationEntity->getErrors())); + return false; + } + + // update state balance + if(false === $this->updateStateBalance($receiverUserId, $this->getAmount())) { + return false; + } + + + return true; + } + + public function sendNotificationEmail($memo) + { + // send notification email + $receiverUserId = $this->getStateUserId($this->getReceiverPublic()); + $receiverUser = $this->getStateUser($receiverUserId); + $noReplyEmail = Configure::read('noReplyEmail'); + + try { + $email = new Email(); + $emailViewBuilder = $email->viewBuilder(); + $emailViewBuilder->setTemplate('notificationCreation') + ->setVars(['user' => $receiverUser, 'gdd_cent' => $this->getAmount(), 'memo' => $memo]); + $receiverNames = $receiverUser->getNames(); + if($receiverNames == '' || $receiverUser->email == '') { + $this->addError('TransactionCreation::sendNotificationEmail', 'to email is empty for user: ' . $receiverUser->id); + return false; + } + $email->setFrom([$noReplyEmail => 'Gradido (nicht antworten)']) + ->setTo([$receiverUser->email => $receiverUser->getNames()]) + ->setSubject(__('Gradido Schöpfung erhalten')) + ->send(); + } catch(Exception $e) { + $this->addError('TransactionCreation::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); + return false; + } + return true; + } + + static public function fromEntity($transactionCreationEntity) + { + $protoCreation = new \Model\Messages\Gradido\TransactionCreation(); + + //var_dump($transactionCreationEntity); + $stateUsersTable = TableRegistry::getTableLocator()->get('state_users'); + //return new TransactionCreation($protoCreation); + $userId = $transactionCreationEntity->state_user_id; + + + $stateUser = $stateUsersTable->get($userId); + + + $receiverAmount = new \Model\Messages\Gradido\ReceiverAmount(); + $receiverAmount->setEd25519ReceiverPubkey(stream_get_contents($stateUser->public_key)); + + $receiverAmount->setAmount($transactionCreationEntity->amount); + + $protoCreation->setReceiverAmount($receiverAmount); + + //echo "receiver amount: check
    "; + //$identHashBytes = stream_get_contents($transactionCreationEntity->ident_hash); + + // intval + //$protoCreation->setIdentHash(intval($identHashBytes)); + $protoCreation->setIdentHash(self::DRMakeStringHash($stateUser->email)); + return new TransactionCreation($protoCreation); + } +} diff --git a/community_server/src/Model/Transactions/TransactionTransfer.php b/community_server/src/Model/Transactions/TransactionTransfer.php new file mode 100644 index 000000000..c89a0f175 --- /dev/null +++ b/community_server/src/Model/Transactions/TransactionTransfer.php @@ -0,0 +1,262 @@ +protoTransactionTransfer = $protoTransactionTransfer; + } + + public function getProto() { + return $this->protoTransactionTransfer; + } + + static public function build($amount, $memo, $receiver_public_hex, $sender_public_hex) + { + // repeated SenderAmount senderAmounts = 1; + // repeated ReceiverAmount receiverAmounts = 2; + $receiver = new \Model\Messages\Gradido\ReceiverAmount(); + $sender = new \Model\Messages\Gradido\SenderAmount(); + $receiver->setAmount($amount); + $sender->setAmount($amount); + + if(strlen($receiver_public_hex) != 64) { + return ['state' => 'error', 'msg' => 'invalid receiver pubkey']; + } + if(strlen($sender_public_hex) != 64) { + return ['state' => 'error', 'msg' => 'invalid sender pubkey']; + } + $receiverPubKeyBin = hex2bin($receiver_public_hex); + $receiver->setEd25519ReceiverPubkey($receiverPubKeyBin); + + $senderPubKeyBin = hex2bin($sender_public_hex); + $sender->setEd25519SenderPubkey($senderPubKeyBin); + //var_dump($requestData); + + $creationDate = new \Model\Messages\Gradido\TimestampSeconds(); + $creationDate->setSeconds(time()); + + $transactionBody = new \Model\Messages\Gradido\TransactionBody(); + $transactionBody->setMemo($memo); + $transactionBody->setCreated($creationDate); + + $transaction = new \Model\Messages\Gradido\Transfer(); + $transaction->setReceiverAmounts([$receiver]); + $transaction->setSenderAmounts([$sender]); + $transactionBody->setTransfer($transaction); + return ['state' => 'success', 'transactionBody' => $transactionBody]; + } + + public function validate($sigPairs) { + //$this->addError('TransactionTransfer::validate', 'not implemented yet'); + //return false; + //$time = microtime(true); + static $functionName = 'TransactionCreation::validate'; + /* + * // check signature(s) + foreach($sigPairs as $sigPair) { + //echo 'sig Pair: '; var_dump($sigPair); echo "
    "; + $pubkey = $sigPair->getPubKey(); + $signature = $sigPair->getEd25519(); + if (!\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) { + $this->addError('Transaction::validate', 'signature for key ' . bin2hex($pubkey) . ' isn\'t valid ' ); + return false; + } + } + */ + $sigPubHexs = []; + foreach($sigPairs as $sigPair) { + //echo 'sig Pair: '; var_dump($sigPair); echo "
    "; + $pubkey = bin2hex($sigPair->getPubKey()); + $hash = TransactionCreation::DRMakeStringHash($pubkey); + if(!isset($sigPubHexs[$hash])) { + $sigPubHexs[$hash] = [$pubkey]; + } else { + array_push($sigPubHexs[$hash], $pubkey); + } + //array_push($sigPubHexs, $pubkey); + } + + $stateUsersTable = TableRegistry::getTableLocator()->get('state_users'); + $senderAmounts = $this->protoTransactionTransfer->getSenderAmounts(); + $senderSum = 0; + $receiverSum = 0; + + $senderPublics = []; + foreach($senderAmounts as $i => $senderAmount) { + $senderPublic = $senderAmount->getEd25519SenderPubkey(); + $senderPublicHex = bin2hex($senderPublic); + array_push($senderPublics, $senderPublic); + + if(strlen($senderPublicHex) != 64) { + $this->addError($functionName, 'invalid sender public key'); + return false; + } + // check if signature exist for sender + $hash = TransactionCreation::DRMakeStringHash($senderPublicHex); + if(!isset($sigPubHexs[$hash]) || in_array($senderPublicHex, $sigPubHexs[$hash]) === FALSE) { + $this->addError($functionName, 'missing signature for sender'); + return false; + } + // check if sender has enough Gradido + $amount = $senderAmount->getAmount(); + $user = $stateUsersTable + ->find('all') + ->select(['id']) + ->where(['public_key' => $senderPublic]) + ->contain(['StateBalances' => ['fields' => ['amount', 'state_user_id']]])->first(); + if(!$user) { + $this->addError($functionName, 'couldn\'t find sender ' . $i .' in db' ); + return false; + } + //var_dump($user); + if(intval($user->state_balances[0]->amount) < intval($amount)) { + $this->addError($functionName, 'sender ' . $i . ' hasn\t enough GDD'); + return false; + } + $senderSum += $amount; + } + $uniqueSenderPublics = array_unique($senderPublics); + if(count($senderPublics) !== count($uniqueSenderPublics)) { + $this->addError($functionName, 'duplicate sender public key'); + return false; + } + + $receiverAmounts = $this->protoTransactionTransfer->getReceiverAmounts(); + $receiverPublics = []; + foreach($receiverAmounts as $reveiverAmount) { + if(strlen($reveiverAmount->getEd25519ReceiverPubkey()) != 32) { + $this->addError($functionName, 'invalid receiver public key'); + return false; + } + array_push($receiverPublics, $reveiverAmount->getEd25519ReceiverPubkey()); + $receiverSum += $reveiverAmount->getAmount(); + } + $uniqueReceiverPublic = array_unique($receiverPublics); + if(count($uniqueReceiverPublic) !== count($receiverPublics)) { + $this->addError($functionName, 'duplicate receiver public key'); + return false; + } + $uniquePublics = array_unique(array_merge($receiverPublics, $senderPublics)); + if(count($uniquePublics) !== count($senderPublics) + count($receiverPublics)) { + // means at least one sender is the same as one receiver + $this->addError($functionName, 'duplicate public in sender and receiver'); + return false; + } + if($senderSum !== $receiverSum) { + $this->addError($functionName, 'sender amount doesn\'t match receiver amount'); + return false; + } + //die("\n"); + return true; + } + + public function save($transaction_id, $firstPublic) { + + static $functionName = 'TransactionCreation::save'; + + if(count($this->protoTransactionTransfer->getSenderAmounts()) !== 1) { + $this->addError($functionName, 'not more than one sender currently supported'); + return false; + } + $senderAmount = $this->protoTransactionTransfer->getSenderAmounts()[0]; + + if(count($this->protoTransactionTransfer->getReceiverAmounts()) !== 1) { + $this->addError($functionName, 'not more than one receiver currently supported'); + return false; + } + $receiverAmount = $this->protoTransactionTransfer->getReceiverAmounts()[0]; + $transactionTransferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins'); + + $senderUserId = $this->getStateUserId($senderAmount->getEd25519SenderPubkey()); + $receiverUserId = $this->getStateUserId($receiverAmount->getEd25519ReceiverPubkey()); + + if($senderUserId === NULL || $receiverUserId === NULL) { + return false; + } + + $finalSenderBalance = $this->updateStateBalance($senderUserId, -$senderAmount->getAmount()); + if(false === $finalSenderBalance) { + return false; + } + if(false === $this->updateStateBalance($receiverUserId, $receiverAmount->getAmount())) { + return false; + } + + $transactionTransferEntity = $transactionTransferTable->newEntity(); + $transactionTransferEntity->transaction_id = $transaction_id; + $transactionTransferEntity->state_user_id = $senderUserId; + $transactionTransferEntity->receiver_public_key = $receiverAmount->getEd25519ReceiverPubkey(); + $transactionTransferEntity->receiver_user_id = $receiverUserId; + $transactionTransferEntity->amount = $senderAmount->getAmount(); + $transactionTransferEntity->sender_final_balance = $finalSenderBalance; + + if(!$transactionTransferTable->save($transactionTransferEntity)) { + $this->addError($functionName, 'error saving transactionSendCoins with errors: ' . json_encode($transactionTransferEntity->getErrors())); + return false; + } + + + + + //$this->addError('TransactionTransfer::save', 'not implemented yet'); + //return false; + return true; + } + + public function sendNotificationEmail($memo) + { + // send notification email + + $senderAmount = $this->protoTransactionTransfer->getSenderAmounts()[0]; + $receiverAmount = $this->protoTransactionTransfer->getReceiverAmounts()[0]; + $senderUserId = $this->getStateUserId($senderAmount->getEd25519SenderPubkey()); + $receiverUserId = $this->getStateUserId($receiverAmount->getEd25519ReceiverPubkey()); + + $receiverUser = $this->getStateUser($receiverUserId); + $senderUser = $this->getStateUser($senderUserId); + $serverAdminEmail = Configure::read('ServerAdminEmail'); + + try { + $email = new Email(); + $emailViewBuilder = $email->viewBuilder(); + $emailViewBuilder->setTemplate('notificationTransfer') + ->setVars(['receiverUser' => $receiverUser, + 'senderUser' => $senderUser, + 'gdd_cent' => $receiverAmount->getAmount(), + 'memo' => $memo]); + $receiverNames = $receiverUser->getNames(); + if($receiverNames == '' || $receiverUser->email == '') { + $this->addError('TransactionCreation::sendNotificationEmail', 'to email is empty for user: ' . $receiverUser->id); + return false; + } + $email->setFrom([$serverAdminEmail => $senderUser->getNames() . ' via Gradido Community']) + ->setTo([$receiverUser->email => $receiverUser->getNames()]) + ->setReplyTo($senderUser->email) + ->setSubject(__('Gradidos erhalten')) + ->send(); + } catch(Exception $e) { + $this->addError('TransactionTransfer::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); + return false; + } + return true; + } + + static public function fromEntity($transactionTransferEntity) + { + $protoTransfer = new \Model\Messages\Gradido\Transfer(); + + $stateUsersTable = TableRegistry::getTableLocator()->get('state_users'); + + + return new TransactionTransfer($protoTransfer); + } +} + diff --git a/community_server/src/Model/Validation/GenericValidation.php b/community_server/src/Model/Validation/GenericValidation.php new file mode 100644 index 000000000..839441454 --- /dev/null +++ b/community_server/src/Model/Validation/GenericValidation.php @@ -0,0 +1,35 @@ +]|>|<|javascript:){1,}/', $value)) { + return false; + } + return true; + } + + public static function email($value, array $context) { + if(preg_match('/^[a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/', $value)) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/community_server/src/Model/Validation/TransactionValidation.php b/community_server/src/Model/Validation/TransactionValidation.php new file mode 100644 index 000000000..9705ef40b --- /dev/null +++ b/community_server/src/Model/Validation/TransactionValidation.php @@ -0,0 +1,49 @@ + 'en_GB']); + $numberparts = preg_split('/\./', $checkFloatVal); + //var_dump($numberparts); + if(isset($numberparts[1]) && strlen($numberparts[1]) > 2) return false; + + $floatVal = floatval(Number::format($value, ['places' => 4, 'locale' => 'en_GB'])); + //echo "floatVal: $floatVal
    "; + return $floatVal >= 0.0; + } + + public static function hexKey64($value, array $context) { + if(strlen($value) != 64) return false; + if(preg_match('/^[[:xdigit:]]*$/', $value)) { + return true; + } + return false; + } + + public static function hexKey128($value, array $context) { + if(strlen($value) != 128) return false; + if(preg_match('/^[[:xdigit:]]*$/', $value)) { + return true; + } + return false; + } + + public static function alphaNumeric($value, array $context) { + //if(preg_match('/^[a-zA-Z0-9äöüÄÖÜß _;:()-]\n\r*$/', $value)) { + if(preg_match('/([<>]|>|<|javascript:){1,}/', $value)) { + return false; + } + return true; + } +} \ No newline at end of file diff --git a/community_server/src/Shell/ConsoleShell.php b/community_server/src/Shell/ConsoleShell.php new file mode 100644 index 000000000..f7bfe8ed4 --- /dev/null +++ b/community_server/src/Shell/ConsoleShell.php @@ -0,0 +1,81 @@ +err('Unable to load Psy\Shell.'); + $this->err(''); + $this->err('Make sure you have installed psysh as a dependency,'); + $this->err('and that Psy\Shell is registered in your autoloader.'); + $this->err(''); + $this->err('If you are using composer run'); + $this->err(''); + $this->err('$ php composer.phar require --dev psy/psysh'); + $this->err(''); + + return self::CODE_ERROR; + } + + $this->out("You can exit with `CTRL-C` or `exit`"); + $this->out(''); + + Log::drop('debug'); + Log::drop('error'); + $this->_io->setLoggers(false); + restore_error_handler(); + restore_exception_handler(); + + $psy = new PsyShell(); + $psy->run(); + } + + /** + * Display help for this console. + * + * @return \Cake\Console\ConsoleOptionParser + */ + public function getOptionParser() + { + $parser = new ConsoleOptionParser('console'); + $parser->setDescription( + 'This shell provides a REPL that you can use to interact with ' . + 'your application in a command line designed to run PHP code. ' . + 'You can use it to run adhoc queries with your models, or ' . + 'explore the features of CakePHP and your application.' . + "\n\n" . + 'You will need to have psysh installed for this Shell to work.' + ); + + return $parser; + } +} diff --git a/community_server/src/Template/AddressTypes/add.ctp b/community_server/src/Template/AddressTypes/add.ctp new file mode 100644 index 000000000..7422b666a --- /dev/null +++ b/community_server/src/Template/AddressTypes/add.ctp @@ -0,0 +1,28 @@ + + +
    + Form->create($addressType) ?> +
    + + Form->control('name'); + echo $this->Form->control('text'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/AddressTypes/edit.ctp b/community_server/src/Template/AddressTypes/edit.ctp new file mode 100644 index 000000000..c43cbaf96 --- /dev/null +++ b/community_server/src/Template/AddressTypes/edit.ctp @@ -0,0 +1,34 @@ + + +
    + Form->create($addressType) ?> +
    + + Form->control('name'); + echo $this->Form->control('text'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/AddressTypes/index.ctp b/community_server/src/Template/AddressTypes/index.ctp new file mode 100644 index 000000000..8460e08a7 --- /dev/null +++ b/community_server/src/Template/AddressTypes/index.ctp @@ -0,0 +1,53 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('text') ?>
    Number->format($addressType->id) ?>name) ?>text) ?> + Html->link(__('View'), ['action' => 'view', $addressType->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $addressType->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $addressType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $addressType->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/AddressTypes/view.ctp b/community_server/src/Template/AddressTypes/view.ctp new file mode 100644 index 000000000..19fa6c81e --- /dev/null +++ b/community_server/src/Template/AddressTypes/view.ctp @@ -0,0 +1,90 @@ + + +
    +

    name) ?>

    + + + + + + + + + + + + + +
    name) ?>
    text) ?>
    Number->format($addressType->id) ?>
    + + +
    diff --git a/community_server/src/Template/AdminErrors/add.ctp b/community_server/src/Template/AdminErrors/add.ctp new file mode 100644 index 000000000..b69f68213 --- /dev/null +++ b/community_server/src/Template/AdminErrors/add.ctp @@ -0,0 +1,30 @@ + + +
    + Form->create($adminError) ?> +
    + + Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('controller'); + echo $this->Form->control('action'); + echo $this->Form->control('state'); + echo $this->Form->control('msg'); + echo $this->Form->control('details'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/AdminErrors/edit.ctp b/community_server/src/Template/AdminErrors/edit.ctp new file mode 100644 index 000000000..dea74b94b --- /dev/null +++ b/community_server/src/Template/AdminErrors/edit.ctp @@ -0,0 +1,36 @@ + + +
    + Form->create($adminError) ?> +
    + + Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('controller'); + echo $this->Form->control('action'); + echo $this->Form->control('state'); + echo $this->Form->control('msg'); + echo $this->Form->control('details'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/AdminErrors/index.ctp b/community_server/src/Template/AdminErrors/index.ctp new file mode 100644 index 000000000..96e077ce1 --- /dev/null +++ b/community_server/src/Template/AdminErrors/index.ctp @@ -0,0 +1,58 @@ + + +
    +
    +
    +
    Paginator->sort('id') ?>
    +
    Paginator->sort('state_user_id') ?>
    +
    Paginator->sort('controller') ?>
    +
    Paginator->sort('action') ?>
    +
    Paginator->sort('state') ?>
    +
    Paginator->sort('msg') ?>
    +
    Paginator->sort('details') ?>
    +
    Paginator->sort('created') ?>
    +
    +
    + +
    +
    Number->format($adminError->id) ?>
    +
    has('state_user') ? $this->Html->link($adminError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $adminError->state_user->id]) : '' ?>
    +
    controller) ?>
    +
    action) ?>
    +
    state) ?>
    +
    msg) ?>
    +
    details) ?>
    +
    created) ?>
    +
    + Html->link(__('View'), ['action' => 'view', $adminError->id]) ?> +   + Html->link(__('Edit'), ['action' => 'edit', $adminError->id]) ?> +   + Form->postLink(__('Delete'), ['action' => 'delete', $adminError->id], ['confirm' => __('Are you sure you want to delete # {0}?', $adminError->id)]) ?> +
    +
    + +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/AdminErrors/view.ctp b/community_server/src/Template/AdminErrors/view.ctp new file mode 100644 index 000000000..0b0bebb64 --- /dev/null +++ b/community_server/src/Template/AdminErrors/view.ctp @@ -0,0 +1,54 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    has('state_user') ? $this->Html->link($adminError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $adminError->state_user->id]) : '' ?>
    controller) ?>
    action) ?>
    state) ?>
    msg) ?>
    details) ?>
    Number->format($adminError->id) ?>
    created) ?>
    +
    diff --git a/community_server/src/Template/Cell/empty b/community_server/src/Template/Cell/empty new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/community_server/src/Template/Cell/empty @@ -0,0 +1 @@ + diff --git a/community_server/src/Template/CommunityProfiles/add.ctp b/community_server/src/Template/CommunityProfiles/add.ctp new file mode 100644 index 000000000..ab7ce0f6b --- /dev/null +++ b/community_server/src/Template/CommunityProfiles/add.ctp @@ -0,0 +1,24 @@ + + +
    + Form->create($communityProfile) ?> +
    + + Form->control('state_user_id'); + echo $this->Form->control('profile_desc'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/CommunityProfiles/edit.ctp b/community_server/src/Template/CommunityProfiles/edit.ctp new file mode 100644 index 000000000..230e3b685 --- /dev/null +++ b/community_server/src/Template/CommunityProfiles/edit.ctp @@ -0,0 +1,30 @@ + + +
    + Form->create($communityProfile) ?> +
    + + Form->control('state_user_id'); + echo $this->Form->control('profile_desc'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/CommunityProfiles/index.ctp b/community_server/src/Template/CommunityProfiles/index.ctp new file mode 100644 index 000000000..12f3c03b1 --- /dev/null +++ b/community_server/src/Template/CommunityProfiles/index.ctp @@ -0,0 +1,49 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('profile_desc') ?>
    Number->format($communityProfile->id) ?>Number->format($communityProfile->state_user_id) ?>profile_desc) ?> + Html->link(__('View'), ['action' => 'view', $communityProfile->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $communityProfile->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $communityProfile->id], ['confirm' => __('Are you sure you want to delete # {0}?', $communityProfile->id)]) ?> +
    +
    +
      + Paginator->first('<< ' . __('first')) ?> + Paginator->prev('< ' . __('previous')) ?> + Paginator->numbers() ?> + Paginator->next(__('next') . ' >') ?> + Paginator->last(__('last') . ' >>') ?> +
    +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/CommunityProfiles/view.ctp b/community_server/src/Template/CommunityProfiles/view.ctp new file mode 100644 index 000000000..1f8aaf0f4 --- /dev/null +++ b/community_server/src/Template/CommunityProfiles/view.ctp @@ -0,0 +1,32 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + +
    profile_desc) ?>
    Number->format($communityProfile->id) ?>
    Number->format($communityProfile->state_user_id) ?>
    +
    diff --git a/community_server/src/Template/Dashboard/error_http_request.ctp b/community_server/src/Template/Dashboard/error_http_request.ctp new file mode 100644 index 000000000..cdbbec19b --- /dev/null +++ b/community_server/src/Template/Dashboard/error_http_request.ctp @@ -0,0 +1,14 @@ +assign('title', __('Error, Please try again')); +?> + +
    + +
    diff --git a/community_server/src/Template/Dashboard/index.ctp b/community_server/src/Template/Dashboard/index.ctp new file mode 100644 index 000000000..3e93e968a --- /dev/null +++ b/community_server/src/Template/Dashboard/index.ctp @@ -0,0 +1,114 @@ +assign( + 'title', + __('Willkommen') . ', ' . $user['first_name'] . ' ' . $user['last_name'] . '!' +); +$this->assign( + 'header', + '

    '.__('Willkommen') . ', ' . $user['first_name'] . ' ' . $user['last_name'] . '!

    ' +); +?> + + ms + +
    +

    Gradido ...

    +
    +
    + account_balance_wallet + Html->link( + __('Kontoübersicht'), + ['controller' => 'StateBalances', 'action' => 'overview'], + ['class' => 'action-button-link'] + );?> +
    +
    + account_balance + Html->link( + __('Überweisung'), + ['controller' => 'TransactionSendCoins', 'action' => 'create'], + ['class' => 'action-button-link'] + ); ?> +
    +
    +
    + + +
    +

    +

    Gradido ...

    +
    +
    + redeem + + Html->link( + __('schöpfen'), + ['controller' => 'TransactionCreations', 'action' => 'createMulti'], + ['class' => 'action-button-link'] + );?> +
    +
    +
    +
    +

    Statistik

    +
    +
    + cached + Html->link( + __('Anmeldungen'), + ['controller' => 'Users', 'action' => 'statistics'], + ['class' => 'info-item-link'] + );?> +
    + +
    + error_outline + Html->link( + __('Fehler') . ' (' . $adminErrorCount . ')', + ['controller' => 'AdminErrors'], ['class' => 'info-item-link']); + ?> +
    + +
    +
    + + +
    +

    Benutzer ...

    +
    +
    + search + Html->link( + __('suchen'), + ['controller' => 'StateUsers', 'action' => 'search'], + ['class' => 'info-item-link'] + ); ?> +
    +
    + how_to_reg + + + +
    +
    + enhanced_encryption + + + +
    +
    +
    + diff --git a/community_server/src/Template/Dashboard/server_index.ctp b/community_server/src/Template/Dashboard/server_index.ctp new file mode 100644 index 000000000..1b4da7647 --- /dev/null +++ b/community_server/src/Template/Dashboard/server_index.ctp @@ -0,0 +1,36 @@ +assign('title', __('Willkommen')); +$this->assign( + 'header', + '

    Server Dashboard, nur für Admins

    ' +); +?> +
    +

    Gradido ...

    +
    +
    + redeem + Html->link( + __('viele schöpfen'), + ['controller' => 'TransactionCreations', 'action' => 'createMulti'], + ['class' => 'action-button-link'] + );?> +
    +
    +
    +
    + error_outline + Html->link( + __('Fehler') . ' (' . $adminErrorCount . ')', + ['controller' => 'AdminErrors'], ['class' => 'info-item-link']); + ?> +
    +
    +
    \ No newline at end of file diff --git a/community_server/src/Template/Element/Flash/default.ctp b/community_server/src/Template/Element/Flash/default.ctp new file mode 100644 index 000000000..694b244c1 --- /dev/null +++ b/community_server/src/Template/Element/Flash/default.ctp @@ -0,0 +1,13 @@ + + + diff --git a/community_server/src/Template/Element/Flash/error.ctp b/community_server/src/Template/Element/Flash/error.ctp new file mode 100644 index 000000000..65a8fbec3 --- /dev/null +++ b/community_server/src/Template/Element/Flash/error.ctp @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/community_server/src/Template/Element/Flash/success.ctp b/community_server/src/Template/Element/Flash/success.ctp new file mode 100644 index 000000000..31a062095 --- /dev/null +++ b/community_server/src/Template/Element/Flash/success.ctp @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/community_server/src/Template/Element/navi.ctp b/community_server/src/Template/Element/navi.ctp new file mode 100644 index 000000000..33055197f --- /dev/null +++ b/community_server/src/Template/Element/navi.ctp @@ -0,0 +1,38 @@ +getRequest()->getSession(); +$errorCount = intval($session->read('StateUser.errorCount')); +$balance = $session->read('StateUser.balance'); +//echo "balance: $balance
    "; +if(!isset($balance)) { + $balance = 0; +} + +$navi = []; +/*if($errorCount > 0) { + $errorNaviEntry = new NaviEntry(__('Fehler '). "($errorCount)", 'mdi-alert-outline', 'StateErrors', 'showForUser'); + $errorNaviEntry->setBGColor('bg-inverse-danger') + ->setIconColor('alert-color'); + array_push($navi, $errorNaviEntry); +}*/ +$balanceNaviEntry = new NaviEntry( + __('Kontoübersicht') . ' (' . + str_replace(array("\r", "\n"), '', strip_tags($this->element('printGradido', ['number' => $balance]))) + . ' )', + 'account_balance_wallet', 'StateBalances', 'overview' +); +if($balance < 0 ) { + //$balanceNaviEntry->setIconColor('alert-color'); +} else if($balance > 0) { + //$balanceNaviEntry->setIconColor('success-color'); +} +array_push($navi, $balanceNaviEntry); +array_push($navi, new NaviEntry(__('Startseite'), 'home', 'Dashboard', 'index')); +array_push($navi, new NaviEntry(__('Überweisung'), 'account_balance', 'TransactionSendCoins', 'create')); +array_push($navi, new NaviEntryExternLink(__('Mitgliederbereich'), 'people_alt', 'https://elopage.com/s/gradido/sign_in')); + +?> + diff --git a/community_server/src/Template/Element/navi_center.ctp b/community_server/src/Template/Element/navi_center.ctp new file mode 100644 index 000000000..d07f44978 --- /dev/null +++ b/community_server/src/Template/Element/navi_center.ctp @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/community_server/src/Template/Element/navi_header.ctp b/community_server/src/Template/Element/navi_header.ctp new file mode 100644 index 000000000..cbc2eea97 --- /dev/null +++ b/community_server/src/Template/Element/navi_header.ctp @@ -0,0 +1,45 @@ +getRequest()->getSession(); +$errorCount = intval($session->read('StateUser.errorCount')); +$transactionPendings = $session->read('Transactions.pending'); + +/* +class NavHeaderEntry +{ + public function __construct($icon_name, $controller, $action, $title) { + ; + } + + public function +} +*/ +?> + \ No newline at end of file diff --git a/community_server/src/Template/Element/navi_notify.ctp b/community_server/src/Template/Element/navi_notify.ctp new file mode 100644 index 000000000..35687687d --- /dev/null +++ b/community_server/src/Template/Element/navi_notify.ctp @@ -0,0 +1,41 @@ +getRequest()->getSession(); +$errorCount = intval($session->read('StateUser.errorCount')); +$transactionPendings = $session->read('Transactions.pending'); + +/* +class NavHeaderEntry +{ + public function __construct($icon_name, $controller, $action, $title) { + ; + } + + public function +} +*/ +?> + 0) : ?> + " href="account/checkTransactions"> + verified_user + + + + + 0) : ?> + Html->link( + 'announcement', + ['controller' => 'StateErrors', 'action' => 'ShowForUser'], + ['class' => 'notify-link', 'escape' => false, 'title' => "$errorCount " . __('Fehler')]) ?> + diff --git a/community_server/src/Template/Element/printEuro.ctp b/community_server/src/Template/Element/printEuro.ctp new file mode 100644 index 000000000..976e4e007 --- /dev/null +++ b/community_server/src/Template/Element/printEuro.ctp @@ -0,0 +1,24 @@ + 0) $class = "grd-positive-currency";*/ +if($number < 0) { + $class = 'grd-negative-currency'; +} + +?> +Number->format(intval($number) / 100.0, ['precision' => 2]) . ' €';?> + + + Number->format(intval($number) / 100.0, ['precision' => 2]) . ' €';?> + + \ No newline at end of file diff --git a/community_server/src/Template/Element/printGDT.ctp b/community_server/src/Template/Element/printGDT.ctp new file mode 100644 index 000000000..8052283d0 --- /dev/null +++ b/community_server/src/Template/Element/printGDT.ctp @@ -0,0 +1,24 @@ + 0) $class = "grd-positive-currency";*/ +if($number < 0) { + $class = 'grd-negative-currency'; +} + +?> +Number->format(intval($number) / 100.0, ['precision' => 2]) . ' GDT';?> + + + Number->format(intval($number) / 100.0, ['precision' => 2]) . ' GDT';?> + + \ No newline at end of file diff --git a/community_server/src/Template/Element/printGradido.ctp b/community_server/src/Template/Element/printGradido.ctp new file mode 100644 index 000000000..404bdb70d --- /dev/null +++ b/community_server/src/Template/Element/printGradido.ctp @@ -0,0 +1,19 @@ + +Number->format(intval($number) / 10000.0, ['precision' => 2]) . ' GDD';?> + + + Number->format(intval($number) / 10000.0, ['precision' => 2]) . ' GDD';?> + + \ No newline at end of file diff --git a/community_server/src/Template/Element/user_menu.ctp b/community_server/src/Template/Element/user_menu.ctp new file mode 100644 index 000000000..633674233 --- /dev/null +++ b/community_server/src/Template/Element/user_menu.ctp @@ -0,0 +1,43 @@ +getRequest()->getSession(); +$user = $session->read('StateUser'); +$transactionPendings = $session->read('Transactions.pending'); +$this->set('user', $user); +$navi = []; +array_push($navi, new NaviEntry(__('Mein Profil'), 'build', 'Profile', 'index')); +if(intval($transactionPendings) > 0) { +/* array_push($navi, new NaviEntryAbsoluteLink( + __("Transaktionen unterzeichnen") . ' (' . intval($transactionPendings) . ')', + 'mdi-signature-freehand', 'account/checkTransactions' + ));*/ +} else { + array_push($navi, new NaviEntryAbsoluteLink(__('Abmelden'), 'exit_to_app', 'account/logout')); +} +?> +
    + + account_circle +
    + + \ No newline at end of file diff --git a/community_server/src/Template/ElopageBuys/add.ctp b/community_server/src/Template/ElopageBuys/add.ctp new file mode 100644 index 000000000..e9c2c6a80 --- /dev/null +++ b/community_server/src/Template/ElopageBuys/add.ctp @@ -0,0 +1,33 @@ + + +
    + Form->create($elopageBuy) ?> +
    + + Form->control('elopage_user_id'); + echo $this->Form->control('affiliate_program_id'); + echo $this->Form->control('publisher_id'); + echo $this->Form->control('order_id'); + echo $this->Form->control('product_id'); + echo $this->Form->control('product_price'); + echo $this->Form->control('payer_email'); + echo $this->Form->control('publisher_email'); + echo $this->Form->control('payed'); + echo $this->Form->control('success_date'); + echo $this->Form->control('event'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/ElopageBuys/edit.ctp b/community_server/src/Template/ElopageBuys/edit.ctp new file mode 100644 index 000000000..e33956b83 --- /dev/null +++ b/community_server/src/Template/ElopageBuys/edit.ctp @@ -0,0 +1,39 @@ + + +
    + Form->create($elopageBuy) ?> +
    + + Form->control('elopage_user_id'); + echo $this->Form->control('affiliate_program_id'); + echo $this->Form->control('publisher_id'); + echo $this->Form->control('order_id'); + echo $this->Form->control('product_id'); + echo $this->Form->control('product_price'); + echo $this->Form->control('payer_email'); + echo $this->Form->control('publisher_email'); + echo $this->Form->control('payed'); + echo $this->Form->control('success_date'); + echo $this->Form->control('event'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/ElopageBuys/index.ctp b/community_server/src/Template/ElopageBuys/index.ctp new file mode 100644 index 000000000..4d5ecc1d1 --- /dev/null +++ b/community_server/src/Template/ElopageBuys/index.ctp @@ -0,0 +1,67 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('elopage_user_id') ?>Paginator->sort('affiliate_program_id') ?>Paginator->sort('publisher_id') ?>Paginator->sort('order_id') ?>Paginator->sort('product_id') ?>Paginator->sort('product_price') ?>Paginator->sort('payer_email') ?>Paginator->sort('publisher_email') ?>Paginator->sort('payed') ?>Paginator->sort('success_date') ?>Paginator->sort('event') ?>
    Number->format($elopageBuy->id) ?>Number->format($elopageBuy->elopage_user_id) ?>Number->format($elopageBuy->affiliate_program_id) ?>Number->format($elopageBuy->publisher_id) ?>Number->format($elopageBuy->order_id) ?>Number->format($elopageBuy->product_id) ?>Number->format($elopageBuy->product_price) ?>payer_email) ?>publisher_email) ?>payed) ?>success_date) ?>event) ?> + Html->link(__('View'), ['action' => 'view', $elopageBuy->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $elopageBuy->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $elopageBuy->id], ['confirm' => __('Are you sure you want to delete # {0}?', $elopageBuy->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/ElopageBuys/statistics.ctp b/community_server/src/Template/ElopageBuys/statistics.ctp new file mode 100644 index 000000000..3ac6cf7f6 --- /dev/null +++ b/community_server/src/Template/ElopageBuys/statistics.ctp @@ -0,0 +1,35 @@ +toArray()); +/*foreach($elopageBuys as $entry) { + echo $entry->success_date . "
    "; +} + * + */ +/*foreach($users as $user) { + //var_dump($user); + echo $user->created; + echo "
    "; +}*/ +?> +
    +
    +
    +
    +
    +
    +
    +

    count()?>

    + + 12.01% +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/community_server/src/Template/ElopageBuys/view.ctp b/community_server/src/Template/ElopageBuys/view.ctp new file mode 100644 index 000000000..2631e17fe --- /dev/null +++ b/community_server/src/Template/ElopageBuys/view.ctp @@ -0,0 +1,68 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    payer_email) ?>
    publisher_email) ?>
    event) ?>
    Number->format($elopageBuy->id) ?>
    Number->format($elopageBuy->elopage_user_id) ?>
    Number->format($elopageBuy->affiliate_program_id) ?>
    Number->format($elopageBuy->publisher_id) ?>
    Number->format($elopageBuy->order_id) ?>
    Number->format($elopageBuy->product_id) ?>
    Number->format($elopageBuy->product_price) ?>
    success_date) ?>
    payed ? __('Yes') : __('No'); ?>
    +
    diff --git a/community_server/src/Template/Email/html/default.ctp b/community_server/src/Template/Email/html/default.ctp new file mode 100644 index 000000000..ac3daa7fe --- /dev/null +++ b/community_server/src/Template/Email/html/default.ctp @@ -0,0 +1,20 @@ + ' . $line . "

    \n"; +endforeach; diff --git a/community_server/src/Template/Email/text/default.ctp b/community_server/src/Template/Email/text/default.ctp new file mode 100644 index 000000000..862cd9f76 --- /dev/null +++ b/community_server/src/Template/Email/text/default.ctp @@ -0,0 +1,16 @@ +assign('title', __('Gradido Schöpfung')); +?> first_name ?> last_name ?>, + +element('printGradido', ['number' => $gdd_cent, 'raw' => true])) ?> +Gradido Akademie schreibt: + + + + + + +Gradido Community Server \ No newline at end of file diff --git a/community_server/src/Template/Email/text/notification_transfer.ctp b/community_server/src/Template/Email/text/notification_transfer.ctp new file mode 100644 index 000000000..2cc692e02 --- /dev/null +++ b/community_server/src/Template/Email/text/notification_transfer.ctp @@ -0,0 +1,21 @@ +assign('title', __('Gradido Überweisung')); +$receiverNames = $receiverUser->first_name . ' ' . $receiverUser->last_name; +$senderNames = $senderUser->first_name . ' ' . $senderUser->last_name; +?> , + +element('printGradido', ['number' => $gdd_cent, 'raw' => true]), $senderNames) ?> + + + + + + + +Gradido Community Server \ No newline at end of file diff --git a/community_server/src/Template/Error/error400.ctp b/community_server/src/Template/Error/error400.ctp new file mode 100644 index 000000000..6b538b7f4 --- /dev/null +++ b/community_server/src/Template/Error/error400.ctp @@ -0,0 +1,38 @@ +layout = 'error'; + +if (Configure::read('debug')) : + $this->layout = 'dev_error'; + + $this->assign('title', $message); + $this->assign('templateName', 'error400.ctp'); + + $this->start('file'); +?> +queryString)) : ?> +

    + SQL Query: + queryString) ?> +

    + +params)) : ?> + SQL Query Params: + params) ?> + +element('auto_table_warning') ?> +end(); +endif; +?> +

    +

    + : + '{$url}'") ?> +

    diff --git a/community_server/src/Template/Error/error500.ctp b/community_server/src/Template/Error/error500.ctp new file mode 100644 index 000000000..3328cc52c --- /dev/null +++ b/community_server/src/Template/Error/error500.ctp @@ -0,0 +1,43 @@ +layout = 'error'; + +if (Configure::read('debug')) : + $this->layout = 'dev_error'; + + $this->assign('title', $message); + $this->assign('templateName', 'error500.ctp'); + + $this->start('file'); +?> +queryString)) : ?> +

    + SQL Query: + queryString) ?> +

    + +params)) : ?> + SQL Query Params: + params) ?> + + + Error in: + getFile()), $error->getLine()) ?> + +element('auto_table_warning'); + + if (extension_loaded('xdebug')) : + xdebug_print_function_stack(); + endif; + + $this->end(); +endif; +?> +

    +

    + : + +

    diff --git a/community_server/src/Template/Layout/Email/html/default.ctp b/community_server/src/Template/Layout/Email/html/default.ctp new file mode 100644 index 000000000..3ff87ff83 --- /dev/null +++ b/community_server/src/Template/Layout/Email/html/default.ctp @@ -0,0 +1,24 @@ + + + + + <?= $this->fetch('title') ?> + + + fetch('content') ?> + + diff --git a/community_server/src/Template/Layout/Email/text/default.ctp b/community_server/src/Template/Layout/Email/text/default.ctp new file mode 100644 index 000000000..29b439ccc --- /dev/null +++ b/community_server/src/Template/Layout/Email/text/default.ctp @@ -0,0 +1,16 @@ +fetch('content'); diff --git a/community_server/src/Template/Layout/ajax.ctp b/community_server/src/Template/Layout/ajax.ctp new file mode 100644 index 000000000..29b439ccc --- /dev/null +++ b/community_server/src/Template/Layout/ajax.ctp @@ -0,0 +1,16 @@ +fetch('content'); diff --git a/community_server/src/Template/Layout/default.ctp b/community_server/src/Template/Layout/default.ctp new file mode 100644 index 000000000..4633502df --- /dev/null +++ b/community_server/src/Template/Layout/default.ctp @@ -0,0 +1,53 @@ + + + + + Html->charset() ?> + + + <?= $cakeDescription ?>: + <?= $this->fetch('title') ?> + + Html->meta('icon') ?> + Html->css(['main.css']) ?> + Html->script(['basic']) ?> + fetch('meta') ?> + fetch('css') ?> + fetch('script') ?> + + +
    +
    + +

    fetch('title') ?>

    + Flash->render() ?> + fetch('content') ?> +
    +
    + +
    + ms +
    + + + diff --git a/community_server/src/Template/Layout/error.ctp b/community_server/src/Template/Layout/error.ctp new file mode 100644 index 000000000..7367c1bf7 --- /dev/null +++ b/community_server/src/Template/Layout/error.ctp @@ -0,0 +1,47 @@ + + + + + Html->charset() ?> + + <?= $this->fetch('title') ?> + + Html->meta('icon') ?> + + Html->css('base.css') ?> + Html->css('style.css') ?> + + fetch('meta') ?> + fetch('css') ?> + fetch('script') ?> + + +
    + +
    + Flash->render() ?> + + fetch('content') ?> +
    + +
    + + diff --git a/community_server/src/Template/Layout/frontend.ctp b/community_server/src/Template/Layout/frontend.ctp new file mode 100644 index 000000000..425073374 --- /dev/null +++ b/community_server/src/Template/Layout/frontend.ctp @@ -0,0 +1,113 @@ +"; +//echo "transactions pending: " . $transactionPendings; +?> + + + + Html->charset() ?> + + + <?= $cakeDescription ?>: + <?= $this->fetch('title') ?> + + Html->meta('icon') ?> + Html->css(['main.css']) ?> + Html->script(['basic']) ?> + fetch('meta') ?> + fetch('css') ?> + fetch('script') ?> + + +
    +
    + element('navi_notify'); ?> +
    +
    + element('user_menu'); ?> +
    +
    + menu +
    + + + +
    + fetch('header')): ?> +
    + fetch('header') ?> +
    + +
    + fetch('content') ?> +
    +
    + + +
    + + ms + +
    +
    +

    +

    Alpha 0.20.06.03

    +
    +
    + + \ No newline at end of file diff --git a/community_server/src/Template/Layout/rss/default.ctp b/community_server/src/Template/Layout/rss/default.ctp new file mode 100644 index 000000000..8269be212 --- /dev/null +++ b/community_server/src/Template/Layout/rss/default.ctp @@ -0,0 +1,11 @@ +fetch('title'); +endif; + +echo $this->Rss->document( + $this->Rss->channel([], $channel, $this->fetch('content')) +); diff --git a/community_server/src/Template/OperatorTypes/add.ctp b/community_server/src/Template/OperatorTypes/add.ctp new file mode 100644 index 000000000..c50feecf0 --- /dev/null +++ b/community_server/src/Template/OperatorTypes/add.ctp @@ -0,0 +1,26 @@ + + +
    + Form->create($operatorType) ?> +
    + + Form->control('name'); + echo $this->Form->control('text'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/OperatorTypes/edit.ctp b/community_server/src/Template/OperatorTypes/edit.ctp new file mode 100644 index 000000000..0b61f0f7a --- /dev/null +++ b/community_server/src/Template/OperatorTypes/edit.ctp @@ -0,0 +1,32 @@ + + +
    + Form->create($operatorType) ?> +
    + + Form->control('name'); + echo $this->Form->control('text'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/OperatorTypes/index.ctp b/community_server/src/Template/OperatorTypes/index.ctp new file mode 100644 index 000000000..52a49b547 --- /dev/null +++ b/community_server/src/Template/OperatorTypes/index.ctp @@ -0,0 +1,51 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('text') ?>
    Number->format($operatorType->id) ?>name) ?>text) ?> + Html->link(__('View'), ['action' => 'view', $operatorType->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $operatorType->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $operatorType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $operatorType->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/OperatorTypes/view.ctp b/community_server/src/Template/OperatorTypes/view.ctp new file mode 100644 index 000000000..a7cb775cf --- /dev/null +++ b/community_server/src/Template/OperatorTypes/view.ctp @@ -0,0 +1,61 @@ + + +
    +

    name) ?>

    + + + + + + + + + + + + + +
    name) ?>
    text) ?>
    Number->format($operatorType->id) ?>
    + +
    diff --git a/community_server/src/Template/Operators/add.ctp b/community_server/src/Template/Operators/add.ctp new file mode 100644 index 000000000..6696cce5c --- /dev/null +++ b/community_server/src/Template/Operators/add.ctp @@ -0,0 +1,26 @@ + + +
    + Form->create($operator) ?> +
    + + Form->control('username'); + echo $this->Form->control('user_pubkey'); + echo $this->Form->control('operator_type_id'); + echo $this->Form->control('data_base64'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/Operators/edit.ctp b/community_server/src/Template/Operators/edit.ctp new file mode 100644 index 000000000..88a348e59 --- /dev/null +++ b/community_server/src/Template/Operators/edit.ctp @@ -0,0 +1,32 @@ + + +
    + Form->create($operator) ?> +
    + + Form->control('username'); + echo $this->Form->control('user_pubkey'); + echo $this->Form->control('operator_type_id'); + echo $this->Form->control('data_base64'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/Operators/index.ctp b/community_server/src/Template/Operators/index.ctp new file mode 100644 index 000000000..3da9a6afb --- /dev/null +++ b/community_server/src/Template/Operators/index.ctp @@ -0,0 +1,56 @@ + + +
    +

    + + + + + + + + + + + + + + operator_type->name ?> + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('username') ?>Paginator->sort('user_pubkey') ?>Paginator->sort('operator_type_id') ?>Paginator->sort('data_base64') ?>Paginator->sort('modified') ?>
    Number->format($operator->id) ?>username) ?>user_pubkey)) ?>Html->link(__($operator->operator_type->name), ['controller' => 'OperatorTypes', 'action' => 'view', $operator->operator_type_id]) ?>data_base64) ?>modified) ?> + Html->link(__('View'), ['action' => 'view', $operator->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $operator->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $operator->id], ['confirm' => __('Are you sure you want to delete # {0}?', $operator->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/Operators/view.ctp b/community_server/src/Template/Operators/view.ctp new file mode 100644 index 000000000..a317c8e17 --- /dev/null +++ b/community_server/src/Template/Operators/view.ctp @@ -0,0 +1,40 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + + + + + +
    username) ?>
    user_pubkey)) ?>
    data_base64) ?>
    Number->format($operator->id) ?>
    Number->format($operator->operator_type_id) ?>
    +
    diff --git a/community_server/src/Template/Pages/cake_home.ctp b/community_server/src/Template/Pages/cake_home.ctp new file mode 100644 index 000000000..5a3731e4c --- /dev/null +++ b/community_server/src/Template/Pages/cake_home.ctp @@ -0,0 +1,276 @@ +layout = false; + +if (!Configure::read('debug')) : + throw new NotFoundException( + 'Please replace src/Template/Pages/home.ctp with your own version or re-enable debug mode.' + ); +endif; + +$cakeDescription = 'CakePHP: the rapid development PHP framework'; +?> + + + + Html->charset() ?> + + + <?= $cakeDescription ?> + + + Html->meta('icon') ?> + Html->css('base.css') ?> + Html->css('style.css') ?> + Html->css('home.css') ?> + + + + +
    +
    Html->image('cake.logo.svg') ?>
    +
    +

    Welcome to CakePHP Red Velvet. Build fast. Grow solid.

    +
    +
    + +
    +
    +
    +

    Please be aware that this page will not be shown if you turn off debug mode unless you replace src/Template/Pages/home.ctp with your own version.

    +
    +
    + +
    + +
    +
    + +
    +
    +

    Environment

    +
      + =')) : ?> +
    • Your version of PHP is 5.6.0 or higher (detected ).
    • + +
    • Your version of PHP is too low. You need PHP 5.6.0 or higher to use CakePHP (detected ).
    • + + + +
    • Your version of PHP has the mbstring extension loaded.
    • + +
    • Your version of PHP does NOT have the mbstring extension loaded.
    • + + + +
    • Your version of PHP has the openssl extension loaded.
    • + +
    • Your version of PHP has the mcrypt extension loaded.
    • + +
    • Your version of PHP does NOT have the openssl or mcrypt extension loaded.
    • + + + +
    • Your version of PHP has the intl extension loaded.
    • + +
    • Your version of PHP does NOT have the intl extension loaded.
    • + +
    +
    +
    +

    Filesystem

    +
      + +
    • Your tmp directory is writable.
    • + +
    • Your tmp directory is NOT writable.
    • + + + +
    • Your logs directory is writable.
    • + +
    • Your logs directory is NOT writable.
    • + + + + +
    • The Engine is being used for core caching. To change the config edit config/app.php
    • + +
    • Your cache is NOT working. Please check the settings in config/app.php
    • + +
    +
    +
    +
    + +
    +
    +

    Database

    + connect(); + } catch (Exception $connectionError) { + $connected = false; + $errorMsg = $connectionError->getMessage(); + if (method_exists($connectionError, 'getAttributes')) : + $attributes = $connectionError->getAttributes(); + if (isset($errorMsg['message'])) : + $errorMsg .= '
    ' . $attributes['message']; + endif; + endif; + } + ?> +
      + +
    • CakePHP is able to connect to the database.
    • + +
    • CakePHP is NOT able to connect to the database.
    • + +
    +
    +
    +

    DebugKit

    +
      + +
    • DebugKit is loaded.
    • + +
    • DebugKit is NOT loaded. You need to either install pdo_sqlite, or define the "debug_kit" connection name.
    • + +
    +
    +
    +
    + +
    +
    +

    Editing this Page

    +
      +
    • To change the content of this page, edit: src/Template/Pages/home.ctp.
    • +
    • You can also add some CSS styles for your pages at: webroot/css/.
    • +
    +
    +
    +

    Getting Started

    + +
    +
    + +
    +
    +

    More about Cake

    +

    + CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Front Controller and MVC.
    + Our primary goal is to provide a structured framework that enables PHP users at all levels to rapidly develop robust web applications, without any loss to flexibility. +

    +
    +
    +
    + +
    +
    + P +

    Help and Bug Reports

    + +
    +
    + r +

    Docs and Downloads

    + +
    +
    + s +

    Training and Certification

    + +
    +
    + + + diff --git a/community_server/src/Template/Pages/gradido.ctp b/community_server/src/Template/Pages/gradido.ctp new file mode 100644 index 000000000..f6a2213cc --- /dev/null +++ b/community_server/src/Template/Pages/gradido.ctp @@ -0,0 +1,14 @@ +layout = false;?> + + Web Assembly Test (CakePHP Single Node Version) + + + +
    Wird geladen...
    + + + + + \ No newline at end of file diff --git a/community_server/src/Template/Pages/home.ctp b/community_server/src/Template/Pages/home.ctp new file mode 100644 index 000000000..3926921c4 --- /dev/null +++ b/community_server/src/Template/Pages/home.ctp @@ -0,0 +1,19 @@ +layout = false;?> + + Web Assembly Test (CakePHP Single Node Version) + + + +
    +
    +

    Gradido

    +

    Implementierung wählen

    +
    + +
    + + + \ No newline at end of file diff --git a/community_server/src/Template/Pages/visitor.ctp b/community_server/src/Template/Pages/visitor.ctp new file mode 100644 index 000000000..e6956c97c --- /dev/null +++ b/community_server/src/Template/Pages/visitor.ctp @@ -0,0 +1,16 @@ +layout = false;?> + + + + Visitor Page + + + + +
    Info Page for Visitor to learn about group before try to enter or connect (befriend)
    + + diff --git a/community_server/src/Template/Profile/edit.ctp b/community_server/src/Template/Profile/edit.ctp new file mode 100644 index 000000000..edddf1631 --- /dev/null +++ b/community_server/src/Template/Profile/edit.ctp @@ -0,0 +1,41 @@ +assign('title', __('Profil ändern')); +// In a View class +$this->loadHelper('Form', [ + 'templates' => 'horizontal_form', +]); +?> +
    +
    + Form->create($profileForm, ['enctype' => 'multipart/form-data']) ?> + Form->control('first_name', ['label' => __('Vorname'), 'placeholder' => 'Vorname', 'value' => $user['first_name']]) ?> + Form->control('last_name', ['label' => __('Nachname'), 'placeholder' => 'Nachname', 'value' => $user['last_name']]) ?> + Form->control('profile_img', ['type' => 'file', 'accept' => 'image/*', 'label' => __('Profilbild')]) ?> + + +
    + + Form->control('profile_desc', ['label' => __('Beschreibung'), 'rows' => 4, 'placeholder' => 'Beschreibung', 'value' => $communityProfile['profile_desc']]) ?> + Form->button(__('Daten speichern'), ['name' => 'submit', 'class' => 'form-button']) ?> + Form->end() ?> +
    +
    + +Html->script(['core', 'vendor.addons']); ?> + diff --git a/community_server/src/Template/Profile/index.ctp b/community_server/src/Template/Profile/index.ctp new file mode 100644 index 000000000..b77ff9f70 --- /dev/null +++ b/community_server/src/Template/Profile/index.ctp @@ -0,0 +1,82 @@ +'; +$header .= '

    '.$user['first_name'] . ' ' . $user['last_name'] . '

    '; +if (!empty($communityProfile['profile_desc'])) { + $header .= "

    ".$communityProfile['profile_desc']."

    "; +} +$header .= ''; +if ($communityProfile && $communityProfile['profile_img']) { + $header .= "
    "; +} +$this->assign('title', __('Mein Profil')); +$this->assign('header', $header); +?> + + ms + +
    +

    + + Meine Daten +

    +
    + +
    + +

    + + Passwort ändern +

    +
    + +
    +
    diff --git a/community_server/src/Template/ServerUsers/add.ctp b/community_server/src/Template/ServerUsers/add.ctp new file mode 100644 index 000000000..35907282b --- /dev/null +++ b/community_server/src/Template/ServerUsers/add.ctp @@ -0,0 +1,26 @@ + + +
    + Form->create($serverUser) ?> +
    + + Form->control('username'); + echo $this->Form->control('password'); + echo $this->Form->control('email'); + echo $this->Form->control('role'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/ServerUsers/edit.ctp b/community_server/src/Template/ServerUsers/edit.ctp new file mode 100644 index 000000000..df812d032 --- /dev/null +++ b/community_server/src/Template/ServerUsers/edit.ctp @@ -0,0 +1,34 @@ + + +
    + Form->create($serverUser) ?> +
    + + Form->control('username'); + echo $this->Form->control('password'); + echo $this->Form->control('email'); + echo $this->Form->control('role'); + echo $this->Form->control('activated'); + echo $this->Form->control('last_login', ['empty' => true]); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/ServerUsers/index.ctp b/community_server/src/Template/ServerUsers/index.ctp new file mode 100644 index 000000000..a6e14cedc --- /dev/null +++ b/community_server/src/Template/ServerUsers/index.ctp @@ -0,0 +1,59 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('username') ?>Paginator->sort('email') ?>Paginator->sort('role') ?>Paginator->sort('activated') ?>Paginator->sort('last_login') ?>Paginator->sort('created') ?>Paginator->sort('modified') ?>
    Number->format($serverUser->id) ?>username) ?>email) ?>role) ?>activated) ?>last_login) ?>created) ?>modified) ?> + Html->link(__('View'), ['action' => 'view', $serverUser->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $serverUser->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $serverUser->id], ['confirm' => __('Are you sure you want to delete # {0}?', $serverUser->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/ServerUsers/login.ctp b/community_server/src/Template/ServerUsers/login.ctp new file mode 100644 index 000000000..4996d5e7b --- /dev/null +++ b/community_server/src/Template/ServerUsers/login.ctp @@ -0,0 +1,22 @@ +loadHelper('Form', [ + 'templates' => 'horizontal_form', +]); +?> +Flash->render() ?> +
    + Form->create() ?> +
    + + Form->control('username') ?> + Form->control('password') ?> +
    + Form->button(__('Login'), ['class' => 'form-button']); ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/ServerUsers/view.ctp b/community_server/src/Template/ServerUsers/view.ctp new file mode 100644 index 000000000..0d3a9ae21 --- /dev/null +++ b/community_server/src/Template/ServerUsers/view.ctp @@ -0,0 +1,56 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    username) ?>
    password) ?>
    email) ?>
    role) ?>
    Number->format($serverUser->id) ?>
    last_login) ?>
    created) ?>
    modified) ?>
    activated ? __('Yes') : __('No'); ?>
    +
    diff --git a/community_server/src/Template/StateBalances/add.ctp b/community_server/src/Template/StateBalances/add.ctp new file mode 100644 index 000000000..64ef5d576 --- /dev/null +++ b/community_server/src/Template/StateBalances/add.ctp @@ -0,0 +1,27 @@ + + +
    + Form->create($stateBalance) ?> + add +
    + + Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('amount'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateBalances/edit.ctp b/community_server/src/Template/StateBalances/edit.ctp new file mode 100644 index 000000000..c4a6c1e81 --- /dev/null +++ b/community_server/src/Template/StateBalances/edit.ctp @@ -0,0 +1,33 @@ + + +
    + Form->create($stateBalance) ?> + edit +
    + + Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('amount'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateBalances/index.ctp b/community_server/src/Template/StateBalances/index.ctp new file mode 100644 index 000000000..4b0db06d6 --- /dev/null +++ b/community_server/src/Template/StateBalances/index.ctp @@ -0,0 +1,54 @@ + + +
    +

    + index + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('modified') ?>Paginator->sort('amount') ?>
    Number->format($stateBalance->id) ?>has('state_user') ? $this->Html->link($stateBalance->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateBalance->state_user->id]) : '' ?>modified) ?>Number->format($stateBalance->amount) ?> + Html->link(__('View'), ['action' => 'view', $stateBalance->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $stateBalance->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $stateBalance->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateBalance->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/StateBalances/overview.ctp b/community_server/src/Template/StateBalances/overview.ctp new file mode 100644 index 000000000..e55d0aa7b --- /dev/null +++ b/community_server/src/Template/StateBalances/overview.ctp @@ -0,0 +1,149 @@ +assign('title', __('Kontoübersicht')); + +$header = '

    ' . __('Aktueller Kontostand: ') . '

    ' . + '

    ' . $this->element('printGradido', ['number' => $balance]) . '

    '; +if($gdtSum > 0) { + $header .= '

    '.$this->Html->link( + $this->element('printGDT', ['number' => $gdtSum]), + ['action' => 'overview_gdt'], + ['escape' => false] + ).'

    '; +} +$this->assign('header', $header); +//var_dump($transactions); +?> + + 0) : ?> +
    + +
    + +
    +

    Überweisungen

    +
    +
    +
    +
    +
    +
    +
    +
    + 30) { + $memoShort = substr($memoShort, 0, 30) . '...'; + } + $cellColorClass = 'success-color'; + if($send) { + $balance = -$balance; + $cellColorClass = 'alert-color'; + } else if($transaction['type'] == 'creation') { + $cellColorClass = 'orange-color'; + } + ?> +
    +
    + Html->image('50x50.png', ['class' => 'profile-img', 'alt' => 'profile image']) ?> +
    + + + + + + + + +
    + + redeem + + + + arrow_back + + + arrow_forward + + +
    +
    +
    +
    + 30): ?> + + + + +
    +
    nice() ?>
    +
    element('printGradido', ['number' => $balance]) ?>
    +
    + +
    +
    + +
    +
    + + + 0) : ?> + + \ No newline at end of file diff --git a/community_server/src/Template/StateBalances/overview_gdt.ctp b/community_server/src/Template/StateBalances/overview_gdt.ctp new file mode 100644 index 000000000..85ecbfd50 --- /dev/null +++ b/community_server/src/Template/StateBalances/overview_gdt.ctp @@ -0,0 +1,119 @@ +assign('title', __('GDT Kontoübersicht')); +$header = '

    ' . __('Zur Verfügung: ') . '

    '; +$gdtSumFromEmails = 0; +foreach($gdtSumPerEmail as $email => $gdt) { + $gdtSumFromEmails += $gdt; +} + +if($gdtSum > 0){ + $header .= '

    '.$this->element('printGDT', ['number' => $gdtSumFromEmails]).'

    '; +} +if($moreEntrysAsShown) { + $header .= ''. __('Nur die letzten 100 Einträge werden angezeigt!') . ''; +} +$this->assign('header', $header); + +?> + 0) :?> +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + element('printEuro', ['number' => $entry['amount']]); ?> + element('printEuro', ['number' => $entry['amount2']]) ?> +
    +
    + Number->format($entry['factor']) ?> + x + Number->format($entry['factor2']) ?> + +
    +
    element('printGDT', ['number' => $entry['gdt']]) ?>
    +
    + +
    +
    + + 0) : ?> +
    +

    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + + +
    +
    + element('printEuro', ['number' => $gdtEntry['amount']]) ?> + element('printEuro', ['number' => $gdtEntry['amount2']]) ?> +
    +
    + Number->format($gdtEntry['factor']) ?> + x + Number->format($gdtEntry['factor2']) ?> + +
    +
    element('printGDT', ['number' => $gdtEntry['gdt']]) ?>
    +
    + +
    +
    + +Html->script(['basic', 'popper.min', 'tippy-bundle.umd.min']) ?> + \ No newline at end of file diff --git a/community_server/src/Template/StateBalances/view.ctp b/community_server/src/Template/StateBalances/view.ctp new file mode 100644 index 000000000..e5f8901dd --- /dev/null +++ b/community_server/src/Template/StateBalances/view.ctp @@ -0,0 +1,39 @@ + + +
    +

    id) ?>

    + view + + + + + + + + + + + + + + + + + +
    has('state_user') ? $this->Html->link($stateBalance->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateBalance->state_user->id]) : '' ?>
    Number->format($stateBalance->id) ?>
    Number->format($stateBalance->amount) ?>
    modified) ?>
    +
    diff --git a/community_server/src/Template/StateCreated/add.ctp b/community_server/src/Template/StateCreated/add.ctp new file mode 100644 index 000000000..c66cf83f3 --- /dev/null +++ b/community_server/src/Template/StateCreated/add.ctp @@ -0,0 +1,31 @@ + + +
    + Form->create($stateCreated) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('month'); + echo $this->Form->control('year'); + echo $this->Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('short_ident_hash'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateCreated/edit.ctp b/community_server/src/Template/StateCreated/edit.ctp new file mode 100644 index 000000000..be1ef330b --- /dev/null +++ b/community_server/src/Template/StateCreated/edit.ctp @@ -0,0 +1,37 @@ + + +
    + Form->create($stateCreated) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('month'); + echo $this->Form->control('year'); + echo $this->Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('short_ident_hash'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateCreated/index.ctp b/community_server/src/Template/StateCreated/index.ctp new file mode 100644 index 000000000..64a514b3b --- /dev/null +++ b/community_server/src/Template/StateCreated/index.ctp @@ -0,0 +1,61 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('month') ?>Paginator->sort('year') ?>Paginator->sort('state_user_id') ?>Paginator->sort('created') ?>Paginator->sort('short_ident_hash') ?>
    Number->format($stateCreated->id) ?>has('transaction') ? $this->Html->link($stateCreated->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $stateCreated->transaction->id]) : '' ?>Number->format($stateCreated->month) ?>Number->format($stateCreated->year) ?>has('state_user') ? $this->Html->link($stateCreated->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateCreated->state_user->id]) : '' ?>created) ?>Number->format($stateCreated->short_ident_hash) ?> + Html->link(__('View'), ['action' => 'view', $stateCreated->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $stateCreated->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $stateCreated->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateCreated->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/StateCreated/view.ctp b/community_server/src/Template/StateCreated/view.ctp new file mode 100644 index 000000000..e0e9301ec --- /dev/null +++ b/community_server/src/Template/StateCreated/view.ctp @@ -0,0 +1,52 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    has('transaction') ? $this->Html->link($stateCreated->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $stateCreated->transaction->id]) : '' ?>
    has('state_user') ? $this->Html->link($stateCreated->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateCreated->state_user->id]) : '' ?>
    Number->format($stateCreated->id) ?>
    Number->format($stateCreated->month) ?>
    Number->format($stateCreated->year) ?>
    Number->format($stateCreated->short_ident_hash) ?>
    created) ?>
    +
    diff --git a/community_server/src/Template/StateErrors/add.ctp b/community_server/src/Template/StateErrors/add.ctp new file mode 100644 index 000000000..24d095b90 --- /dev/null +++ b/community_server/src/Template/StateErrors/add.ctp @@ -0,0 +1,29 @@ + + +
    + Form->create($stateError) ?> +
    + + Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]); + echo $this->Form->control('message_json'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateErrors/edit.ctp b/community_server/src/Template/StateErrors/edit.ctp new file mode 100644 index 000000000..795b6c7dd --- /dev/null +++ b/community_server/src/Template/StateErrors/edit.ctp @@ -0,0 +1,35 @@ + + +
    + Form->create($stateError) ?> +
    + + Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]); + echo $this->Form->control('message_json'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateErrors/index.ctp b/community_server/src/Template/StateErrors/index.ctp new file mode 100644 index 000000000..3f34f449b --- /dev/null +++ b/community_server/src/Template/StateErrors/index.ctp @@ -0,0 +1,55 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('transaction_type_id') ?>Paginator->sort('created') ?>
    Number->format($stateError->id) ?>has('state_user') ? $this->Html->link($stateError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateError->state_user->id]) : '' ?>has('transaction_type') ? $this->Html->link($stateError->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $stateError->transaction_type->id]) : '' ?>created) ?> + Html->link(__('View'), ['action' => 'view', $stateError->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $stateError->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $stateError->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateError->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/StateErrors/show_for_user.ctp b/community_server/src/Template/StateErrors/show_for_user.ctp new file mode 100644 index 000000000..2420571a3 --- /dev/null +++ b/community_server/src/Template/StateErrors/show_for_user.ctp @@ -0,0 +1,51 @@ +assign('title', __('Fehlermeldungen')); +//var_dump($transactionTypes); +/*foreach($transactionTypes as $i => $t) { + echo "$i => "; + var_dump($t); + echo "
    "; +}*/ +?> +
    +

    Fehler

    +
    +
    +
    Transaktion Typ
    +
    Datum
    +
    Fehler
    +
    Aktionen
    +
    + transaction_type_id-1]; + $errorMessage = ""; + $errorArray = json_decode($error->message_json, true); + if(isset($errorArray['details']) && is_array($errorArray['details'])) { + foreach($errorArray['details'][0] as $function => $errorString) { + $errorMessage = '' . $function . '
    ' . $errorString; + } + } else { + $errorMessage = $error->message_json; + } + ?> +
    +
    name ?>
    +
    created ?>
    +
    +
    + Html->link( + __('Delete'), + ['action' => 'deleteForUser', $error->id], + ['class' => 'form-button button-cancel'] + ) ?>
    +
    + +
    +
    diff --git a/community_server/src/Template/StateErrors/view.ctp b/community_server/src/Template/StateErrors/view.ctp new file mode 100644 index 000000000..c2913d306 --- /dev/null +++ b/community_server/src/Template/StateErrors/view.ctp @@ -0,0 +1,44 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + +
    has('state_user') ? $this->Html->link($stateError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateError->state_user->id]) : '' ?>
    has('transaction_type') ? $this->Html->link($stateError->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $stateError->transaction_type->id]) : '' ?>
    Number->format($stateError->id) ?>
    created) ?>
    +
    +

    + Text->autoParagraph(h($stateError->message_json)); ?> +
    +
    diff --git a/community_server/src/Template/StateGroupAddresses/add.ctp b/community_server/src/Template/StateGroupAddresses/add.ctp new file mode 100644 index 000000000..f9eba953a --- /dev/null +++ b/community_server/src/Template/StateGroupAddresses/add.ctp @@ -0,0 +1,28 @@ + + +
    + Form->create($stateGroupAddress) ?> +
    + + Form->control('state_group_id', ['options' => $stateGroups]); + echo $this->Form->control('address_type_id', ['options' => $addressTypes]); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateGroupAddresses/edit.ctp b/community_server/src/Template/StateGroupAddresses/edit.ctp new file mode 100644 index 000000000..46107779b --- /dev/null +++ b/community_server/src/Template/StateGroupAddresses/edit.ctp @@ -0,0 +1,34 @@ + + +
    + Form->create($stateGroupAddress) ?> +
    + + Form->control('state_group_id', ['options' => $stateGroups]); + echo $this->Form->control('address_type_id', ['options' => $addressTypes]); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateGroupAddresses/index.ctp b/community_server/src/Template/StateGroupAddresses/index.ctp new file mode 100644 index 000000000..1d988e9a7 --- /dev/null +++ b/community_server/src/Template/StateGroupAddresses/index.ctp @@ -0,0 +1,53 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('state_group_id') ?>Paginator->sort('address_type_id') ?>
    Number->format($stateGroupAddress->id) ?>has('state_group') ? $this->Html->link($stateGroupAddress->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $stateGroupAddress->state_group->id]) : '' ?>has('address_type') ? $this->Html->link($stateGroupAddress->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $stateGroupAddress->address_type->id]) : '' ?> + Html->link(__('View'), ['action' => 'view', $stateGroupAddress->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $stateGroupAddress->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $stateGroupAddress->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateGroupAddress->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/StateGroupAddresses/view.ctp b/community_server/src/Template/StateGroupAddresses/view.ctp new file mode 100644 index 000000000..848a6476f --- /dev/null +++ b/community_server/src/Template/StateGroupAddresses/view.ctp @@ -0,0 +1,36 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + +
    has('state_group') ? $this->Html->link($stateGroupAddress->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $stateGroupAddress->state_group->id]) : '' ?>
    has('address_type') ? $this->Html->link($stateGroupAddress->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $stateGroupAddress->address_type->id]) : '' ?>
    Number->format($stateGroupAddress->id) ?>
    +
    diff --git a/community_server/src/Template/StateGroupRelationships/add.ctp b/community_server/src/Template/StateGroupRelationships/add.ctp new file mode 100644 index 000000000..39eb550e8 --- /dev/null +++ b/community_server/src/Template/StateGroupRelationships/add.ctp @@ -0,0 +1,25 @@ + + +
    + Form->create($stateGroupRelationship) ?> +
    + + Form->control('state_group1_id'); + echo $this->Form->control('state_group2_id'); + echo $this->Form->control('state_relationship_id'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateGroupRelationships/edit.ctp b/community_server/src/Template/StateGroupRelationships/edit.ctp new file mode 100644 index 000000000..55bcc6afe --- /dev/null +++ b/community_server/src/Template/StateGroupRelationships/edit.ctp @@ -0,0 +1,31 @@ + + +
    + Form->create($stateGroupRelationship) ?> +
    + + Form->control('state_group1_id'); + echo $this->Form->control('state_group2_id'); + echo $this->Form->control('state_relationship_id'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateGroupRelationships/index.ctp b/community_server/src/Template/StateGroupRelationships/index.ctp new file mode 100644 index 000000000..57fbc4da5 --- /dev/null +++ b/community_server/src/Template/StateGroupRelationships/index.ctp @@ -0,0 +1,51 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('state_group1_id') ?>Paginator->sort('state_group2_id') ?>Paginator->sort('state_relationship_id') ?>
    Number->format($stateGroupRelationship->id) ?>Number->format($stateGroupRelationship->state_group1_id) ?>Number->format($stateGroupRelationship->state_group2_id) ?>Number->format($stateGroupRelationship->state_relationship_id) ?> + Html->link(__('View'), ['action' => 'view', $stateGroupRelationship->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $stateGroupRelationship->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $stateGroupRelationship->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateGroupRelationship->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/StateGroupRelationships/view.ctp b/community_server/src/Template/StateGroupRelationships/view.ctp new file mode 100644 index 000000000..de871dc77 --- /dev/null +++ b/community_server/src/Template/StateGroupRelationships/view.ctp @@ -0,0 +1,36 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + +
    Number->format($stateGroupRelationship->id) ?>
    Number->format($stateGroupRelationship->state_group1_id) ?>
    Number->format($stateGroupRelationship->state_group2_id) ?>
    Number->format($stateGroupRelationship->state_relationship_id) ?>
    +
    diff --git a/community_server/src/Template/StateGroups/add.ctp b/community_server/src/Template/StateGroups/add.ctp new file mode 100644 index 000000000..e71480593 --- /dev/null +++ b/community_server/src/Template/StateGroups/add.ctp @@ -0,0 +1,32 @@ + + +
    + Form->create($stateGroup) ?> +
    + + Form->control('name'); + echo $this->Form->control('user_count'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateGroups/edit.ctp b/community_server/src/Template/StateGroups/edit.ctp new file mode 100644 index 000000000..93b35256b --- /dev/null +++ b/community_server/src/Template/StateGroups/edit.ctp @@ -0,0 +1,38 @@ + + +
    + Form->create($stateGroup) ?> +
    + + Form->control('name'); + echo $this->Form->control('user_count'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateGroups/index.ctp b/community_server/src/Template/StateGroups/index.ctp new file mode 100644 index 000000000..a37029ab2 --- /dev/null +++ b/community_server/src/Template/StateGroups/index.ctp @@ -0,0 +1,57 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('user_count') ?>
    Number->format($stateGroup->id) ?>name) ?>Number->format($stateGroup->user_count) ?> + Html->link(__('View'), ['action' => 'view', $stateGroup->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $stateGroup->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $stateGroup->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateGroup->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/StateGroups/view.ctp b/community_server/src/Template/StateGroups/view.ctp new file mode 100644 index 000000000..0ecb27009 --- /dev/null +++ b/community_server/src/Template/StateGroups/view.ctp @@ -0,0 +1,152 @@ + + +
    +

    name) ?>

    + + + + + + + + + + + + + +
    name) ?>
    Number->format($stateGroup->id) ?>
    Number->format($stateGroup->user_count) ?>
    + + + + +
    diff --git a/community_server/src/Template/StateRelationshipTypes/add.ctp b/community_server/src/Template/StateRelationshipTypes/add.ctp new file mode 100644 index 000000000..5eb7c3b4f --- /dev/null +++ b/community_server/src/Template/StateRelationshipTypes/add.ctp @@ -0,0 +1,24 @@ + + +
    + Form->create($stateRelationshipType) ?> +
    + + Form->control('name'); + echo $this->Form->control('text'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateRelationshipTypes/edit.ctp b/community_server/src/Template/StateRelationshipTypes/edit.ctp new file mode 100644 index 000000000..96ef4ba88 --- /dev/null +++ b/community_server/src/Template/StateRelationshipTypes/edit.ctp @@ -0,0 +1,30 @@ + + +
    + Form->create($stateRelationshipType) ?> +
    + + Form->control('name'); + echo $this->Form->control('text'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateRelationshipTypes/index.ctp b/community_server/src/Template/StateRelationshipTypes/index.ctp new file mode 100644 index 000000000..2e44a8d88 --- /dev/null +++ b/community_server/src/Template/StateRelationshipTypes/index.ctp @@ -0,0 +1,49 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('text') ?>
    Number->format($stateRelationshipType->id) ?>name) ?>text) ?> + Html->link(__('View'), ['action' => 'view', $stateRelationshipType->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $stateRelationshipType->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $stateRelationshipType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateRelationshipType->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/StateRelationshipTypes/view.ctp b/community_server/src/Template/StateRelationshipTypes/view.ctp new file mode 100644 index 000000000..5d745a0df --- /dev/null +++ b/community_server/src/Template/StateRelationshipTypes/view.ctp @@ -0,0 +1,32 @@ + + +
    +

    name) ?>

    + + + + + + + + + + + + + +
    name) ?>
    text) ?>
    Number->format($stateRelationshipType->id) ?>
    +
    diff --git a/community_server/src/Template/StateUsers/add.ctp b/community_server/src/Template/StateUsers/add.ctp new file mode 100644 index 000000000..a810bc9d5 --- /dev/null +++ b/community_server/src/Template/StateUsers/add.ctp @@ -0,0 +1,34 @@ + + +
    + Form->create($stateUser) ?> +
    + + Form->control('index_id'); + echo $this->Form->control('state_group_id', ['options' => $stateGroups]); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateUsers/edit.ctp b/community_server/src/Template/StateUsers/edit.ctp new file mode 100644 index 000000000..473f1d845 --- /dev/null +++ b/community_server/src/Template/StateUsers/edit.ctp @@ -0,0 +1,39 @@ + + +
    + Form->create($stateUser) ?> +
    + + Form->control('disabled'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/StateUsers/index.ctp b/community_server/src/Template/StateUsers/index.ctp new file mode 100644 index 000000000..4e6ea8cb1 --- /dev/null +++ b/community_server/src/Template/StateUsers/index.ctp @@ -0,0 +1,69 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('first_name') ?> + Paginator->sort('last_name') ?> + Paginator->sort('username') ?> + Paginator->sort('email') ?> + Paginator->sort('disabled') ?> +
    Number->format($stateUser->id) ?>first_name ?>last_name ?>username ?>email ?>disabled ?> + Html->link(__('View'), ['action' => 'view', $stateUser->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $stateUser->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $stateUser->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateUser->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/StateUsers/list_ident_hashes.ctp b/community_server/src/Template/StateUsers/list_ident_hashes.ctp new file mode 100644 index 000000000..7f50910b1 --- /dev/null +++ b/community_server/src/Template/StateUsers/list_ident_hashes.ctp @@ -0,0 +1,29 @@ + +
    + + + + + + + + + + + + + + + + + +
    first namelast nameemailidentHashPublic key hex +
    first_name ?>last_name ?>email ?>identHash ?>public_key)) ?>
    +
    diff --git a/community_server/src/Template/StateUsers/search.ctp b/community_server/src/Template/StateUsers/search.ctp new file mode 100644 index 000000000..e6775729b --- /dev/null +++ b/community_server/src/Template/StateUsers/search.ctp @@ -0,0 +1,65 @@ +assign('title', __('Benutzer suchen')); +// In a View class +$this->loadHelper('Form', [ + 'templates' => 'horizontal_form', +]); +?> +Html->css([ + 'loginServer/style.css', + 'rippleUI/style.css', + 'materialdesignicons.min.css' +]) ?> + +
    +

    Benutzer suchen

    +
    + Form->create($searchForm, []) ?> + Form->control('search', ['label' => __('Suchbegriff'), 'class' => 'form-control', 'id' => 'inlineFormInputGroup', 'placeholder' => __('Vorname/Nachname/E-Mail')]) ?> + Form->button('search ' . __('Suchen'), ['class' => 'form-button']) ?> + Form->hidden('order_row', ['id' => 'input-order-row']) ?> +
    +
    +
    + +
    + + +Html->script('userSearch') ?> + + + diff --git a/community_server/src/Template/StateUsers/view.ctp b/community_server/src/Template/StateUsers/view.ctp new file mode 100644 index 000000000..c2bb33c2b --- /dev/null +++ b/community_server/src/Template/StateUsers/view.ctp @@ -0,0 +1,143 @@ + + +
    +

    first_name) ?> last_name) ?> <email) ?>>

    + Konto-Adresse: public_key))) ?> + + + + + +
    diff --git a/community_server/src/Template/TransactionCreations/add.ctp b/community_server/src/Template/TransactionCreations/add.ctp new file mode 100644 index 000000000..dfe34be56 --- /dev/null +++ b/community_server/src/Template/TransactionCreations/add.ctp @@ -0,0 +1,29 @@ + + +
    + Form->create($transactionCreation) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('amount'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionCreations/create.ctp b/community_server/src/Template/TransactionCreations/create.ctp new file mode 100644 index 000000000..a7e7c4afc --- /dev/null +++ b/community_server/src/Template/TransactionCreations/create.ctp @@ -0,0 +1,31 @@ + $receiver) { + //var_dump($receiver); + array_push($address_options, [ + 'text' => $receiver['name'], + 'value' => $i+1, + 'title' => $receiver['key'] + ]); +} +$this->assign('title', __('Schöpfungstransaktion')); +?> +
    + + Form->create($creationForm) ?> +
    + Form->control('memo'); ?> + Form->control('amount'); ?> + Form->control('receiver', ['options' => $address_options]); ?> + +
    + Form->button(__('Transaktion(en) abschließen'), ['name' => 'next', 'class' => 'grd-form-bn grd-form-bn-succeed grd_clickable grd-width-200']) ?> + Form->button(__('Weitere Transaktion erstellen'), ['name' => 'add', 'class' => 'grd-form-bn grd_clickable grd-width-200']) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionCreations/create_multi.ctp b/community_server/src/Template/TransactionCreations/create_multi.ctp new file mode 100644 index 000000000..d4d130b9c --- /dev/null +++ b/community_server/src/Template/TransactionCreations/create_multi.ctp @@ -0,0 +1,229 @@ + $receiver) { + //var_dump($receiver); + array_push($address_options, [ + 'text' => $receiver['name'], + 'value' => $i+1, + 'title' => $receiver['key'] + ]); +}*/ +$this->assign('title', __('Schöpfungstransaktion')); +$this->loadHelper('Form', [ + 'templates' => 'horizontal_form', +]); + +use Cake\I18n\FrozenTime; + +?> +
    +

    Schöpfen

    +
    + Form->create($creationForm) ?> + 0) : ?> +
    + +
    +
    + Form->control('searchText', ['label' => __('Suche'), 'placeholder' => 'Email/Name']); ?> + Form->button(__('Suchen'), ['name' => 'searchButton', 'class' => 'form-button']) ?> +
    +
    + Form->control('memo', ['label' => __('Memo'), 'placeholder' => 'Memo']); ?> + Form->control('amount', ['label' => __('Betrag in GDD'), 'required' => false]); ?> + day(1)->subMonth(1); + ?> + +
    +
    + + +
    +
    + 30000000) { + //$disable = 'disabled'; + } + ?> +
    + + Form->hidden('user_pending[' . $possibleReceiver['id'] . ']', ['value' => $possibleReceiver['pending']] ) ?> + +
    +
    + Form->checkbox('user[' .$possibleReceiver['id'] . ']', ['value' => $possibleReceiver['id'], 'hiddenField' => false, $disable]); ?> +
    +
    + + + + + + + <> + + +
    +
    + Form->text('user_amount[' . $possibleReceiver['id'] . ']', ['placeholder' => __('Für benutzerdefinierten Betrag'), 'class' => 'user_amount', 'type' => 'number', 'step' => '0.01', $disable]); ?> GDD +
    +
    + Form->date('user_target_date[' . $possibleReceiver['id'] . ']', ['value' => $firstDayLastMonth]) ?> +
    +
    +
    + + + Bereits als Transaktion angelegt: element('printGradido', ['number' => $possibleReceiver['pending']]);?> + + + + + In diesen und den letzten 2 Monaten bereits geschöpft (alte Berechnung): element('printGradido', ['number' => $possibleReceiver['amount']]);?> + + + 0) : ?> + + Im letzten Monat geschöpft (neue Berechnung): element('printGradido', ['number' => $possibleReceiver['amount2']]) ?> + + +
    +
    + + +
    + $limit) : ?> +

    Benutzer insgesamt

    +

    Seiten: + 0) echo ', '; + if($i != $page) { + echo $this->Html->link($i, ['action' => 'create_multi', $i]); + } else { + echo $i; + } + } + ?> +

    + +
    +
    +
    + Form->button(__('Transaktion(en) abschließen'), ['name' => 'next', 'class' => 'form-button' ]) ?> + Form->button(__('Weitere Transaktion erstellen'), ['name' => 'add', 'class' => 'form-button']) ?> +
    +
    + Form->end() ?> +
    +
    +Html->script('basic'); ?> + + 0) : ?> + + \ No newline at end of file diff --git a/community_server/src/Template/TransactionCreations/edit.ctp b/community_server/src/Template/TransactionCreations/edit.ctp new file mode 100644 index 000000000..85b7704be --- /dev/null +++ b/community_server/src/Template/TransactionCreations/edit.ctp @@ -0,0 +1,35 @@ + + +
    + Form->create($transactionCreation) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('amount'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionCreations/index.ctp b/community_server/src/Template/TransactionCreations/index.ctp new file mode 100644 index 000000000..d9d156239 --- /dev/null +++ b/community_server/src/Template/TransactionCreations/index.ctp @@ -0,0 +1,55 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('amount') ?>Paginator->sort('ident_hash ') ?>
    Number->format($transactionCreation->id) ?>has('transaction') ? $this->Html->link($transactionCreation->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionCreation->transaction->id]) : '' ?>has('state_user') ? $this->Html->link($transactionCreation->state_user->getEmailWithName(), ['controller' => 'StateUsers', 'action' => 'view', $transactionCreation->state_user->id]) : '' ?>element('printGradido', ['number' => $transactionCreation->amount]) ?>ident_hash) ?> + Html->link(__('View'), ['action' => 'view', $transactionCreation->id]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/TransactionCreations/view.ctp b/community_server/src/Template/TransactionCreations/view.ctp new file mode 100644 index 000000000..a51312674 --- /dev/null +++ b/community_server/src/Template/TransactionCreations/view.ctp @@ -0,0 +1,40 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + +
    has('transaction') ? $this->Html->link($transactionCreation->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionCreation->transaction->id]) : '' ?>
    has('state_user') ? $this->Html->link($transactionCreation->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $transactionCreation->state_user->id]) : '' ?>
    Number->format($transactionCreation->id) ?>
    Number->format($transactionCreation->amount) ?>
    +
    diff --git a/community_server/src/Template/TransactionGroupAddaddress/add.ctp b/community_server/src/Template/TransactionGroupAddaddress/add.ctp new file mode 100644 index 000000000..21fa1bea7 --- /dev/null +++ b/community_server/src/Template/TransactionGroupAddaddress/add.ctp @@ -0,0 +1,28 @@ + + +
    + Form->create($transactionGroupAddaddres) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('address_type_id', ['options' => $addressTypes]); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionGroupAddaddress/edit.ctp b/community_server/src/Template/TransactionGroupAddaddress/edit.ctp new file mode 100644 index 000000000..e9d7c318a --- /dev/null +++ b/community_server/src/Template/TransactionGroupAddaddress/edit.ctp @@ -0,0 +1,34 @@ + + +
    + Form->create($transactionGroupAddaddres) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('address_type_id', ['options' => $addressTypes]); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionGroupAddaddress/index.ctp b/community_server/src/Template/TransactionGroupAddaddress/index.ctp new file mode 100644 index 000000000..eb3d82084 --- /dev/null +++ b/community_server/src/Template/TransactionGroupAddaddress/index.ctp @@ -0,0 +1,53 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('address_type_id') ?>
    Number->format($transactionGroupAddaddres->id) ?>has('transaction') ? $this->Html->link($transactionGroupAddaddres->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAddaddres->transaction->id]) : '' ?>has('address_type') ? $this->Html->link($transactionGroupAddaddres->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $transactionGroupAddaddres->address_type->id]) : '' ?> + Html->link(__('View'), ['action' => 'view', $transactionGroupAddaddres->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $transactionGroupAddaddres->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $transactionGroupAddaddres->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionGroupAddaddres->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/TransactionGroupAddaddress/view.ctp b/community_server/src/Template/TransactionGroupAddaddress/view.ctp new file mode 100644 index 000000000..8401780e7 --- /dev/null +++ b/community_server/src/Template/TransactionGroupAddaddress/view.ctp @@ -0,0 +1,36 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + +
    has('transaction') ? $this->Html->link($transactionGroupAddaddres->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAddaddres->transaction->id]) : '' ?>
    has('address_type') ? $this->Html->link($transactionGroupAddaddres->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $transactionGroupAddaddres->address_type->id]) : '' ?>
    Number->format($transactionGroupAddaddres->id) ?>
    +
    diff --git a/community_server/src/Template/TransactionGroupAllowtrades/add.ctp b/community_server/src/Template/TransactionGroupAllowtrades/add.ctp new file mode 100644 index 000000000..7e29efc24 --- /dev/null +++ b/community_server/src/Template/TransactionGroupAllowtrades/add.ctp @@ -0,0 +1,27 @@ + + +
    + Form->create($transactionGroupAllowtrade) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('group_id'); + echo $this->Form->control('allow'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionGroupAllowtrades/edit.ctp b/community_server/src/Template/TransactionGroupAllowtrades/edit.ctp new file mode 100644 index 000000000..500241331 --- /dev/null +++ b/community_server/src/Template/TransactionGroupAllowtrades/edit.ctp @@ -0,0 +1,33 @@ + + +
    + Form->create($transactionGroupAllowtrade) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('group_id'); + echo $this->Form->control('allow'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionGroupAllowtrades/index.ctp b/community_server/src/Template/TransactionGroupAllowtrades/index.ctp new file mode 100644 index 000000000..07386ccb2 --- /dev/null +++ b/community_server/src/Template/TransactionGroupAllowtrades/index.ctp @@ -0,0 +1,53 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('group_id') ?>Paginator->sort('allow') ?>
    Number->format($transactionGroupAllowtrade->id) ?>has('transaction') ? $this->Html->link($transactionGroupAllowtrade->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAllowtrade->transaction->id]) : '' ?>Number->format($transactionGroupAllowtrade->group_id) ?>allow) ?> + Html->link(__('View'), ['action' => 'view', $transactionGroupAllowtrade->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $transactionGroupAllowtrade->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $transactionGroupAllowtrade->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionGroupAllowtrade->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/TransactionGroupAllowtrades/view.ctp b/community_server/src/Template/TransactionGroupAllowtrades/view.ctp new file mode 100644 index 000000000..7a6a36f5a --- /dev/null +++ b/community_server/src/Template/TransactionGroupAllowtrades/view.ctp @@ -0,0 +1,38 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + +
    has('transaction') ? $this->Html->link($transactionGroupAllowtrade->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAllowtrade->transaction->id]) : '' ?>
    Number->format($transactionGroupAllowtrade->id) ?>
    Number->format($transactionGroupAllowtrade->group_id) ?>
    allow ? __('Yes') : __('No'); ?>
    +
    diff --git a/community_server/src/Template/TransactionGroupCreates/add.ctp b/community_server/src/Template/TransactionGroupCreates/add.ctp new file mode 100644 index 000000000..6e6174eb4 --- /dev/null +++ b/community_server/src/Template/TransactionGroupCreates/add.ctp @@ -0,0 +1,29 @@ + + +
    + Form->create($transactionGroupCreate) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('state_group_id', ['options' => $stateGroups]); + echo $this->Form->control('name'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionGroupCreates/edit.ctp b/community_server/src/Template/TransactionGroupCreates/edit.ctp new file mode 100644 index 000000000..d1890afca --- /dev/null +++ b/community_server/src/Template/TransactionGroupCreates/edit.ctp @@ -0,0 +1,35 @@ + + +
    + Form->create($transactionGroupCreate) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('state_group_id', ['options' => $stateGroups]); + echo $this->Form->control('name'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionGroupCreates/index.ctp b/community_server/src/Template/TransactionGroupCreates/index.ctp new file mode 100644 index 000000000..13aeabf83 --- /dev/null +++ b/community_server/src/Template/TransactionGroupCreates/index.ctp @@ -0,0 +1,55 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('state_group_id') ?>Paginator->sort('name') ?>
    Number->format($transactionGroupCreate->id) ?>has('transaction') ? $this->Html->link($transactionGroupCreate->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupCreate->transaction->id]) : '' ?>has('state_group') ? $this->Html->link($transactionGroupCreate->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $transactionGroupCreate->state_group->id]) : '' ?>name) ?> + Html->link(__('View'), ['action' => 'view', $transactionGroupCreate->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $transactionGroupCreate->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $transactionGroupCreate->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionGroupCreate->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/TransactionGroupCreates/view.ctp b/community_server/src/Template/TransactionGroupCreates/view.ctp new file mode 100644 index 000000000..c774f8bc3 --- /dev/null +++ b/community_server/src/Template/TransactionGroupCreates/view.ctp @@ -0,0 +1,40 @@ + + +
    +

    name) ?>

    + + + + + + + + + + + + + + + + + +
    has('transaction') ? $this->Html->link($transactionGroupCreate->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupCreate->transaction->id]) : '' ?>
    has('state_group') ? $this->Html->link($transactionGroupCreate->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $transactionGroupCreate->state_group->id]) : '' ?>
    name) ?>
    Number->format($transactionGroupCreate->id) ?>
    +
    diff --git a/community_server/src/Template/TransactionSendCoins/add.ctp b/community_server/src/Template/TransactionSendCoins/add.ctp new file mode 100644 index 000000000..8b5a757c4 --- /dev/null +++ b/community_server/src/Template/TransactionSendCoins/add.ctp @@ -0,0 +1,30 @@ + + +
    + Form->create($transactionSendCoin) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('amount'); + echo $this->Form->control('sender_final_balance'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionSendCoins/create.ctp b/community_server/src/Template/TransactionSendCoins/create.ctp new file mode 100644 index 000000000..9b578d0c9 --- /dev/null +++ b/community_server/src/Template/TransactionSendCoins/create.ctp @@ -0,0 +1,39 @@ +assign('title', __('Überweisung')); +// In a View class +$this->loadHelper('Form', [ + 'templates' => 'horizontal_form', +]); +?> +
    +

    Überweisen

    +
    + Form->create($transferForm) ?> + Form->control('email', ['label' => __('Empfänger'), 'placeholder' => 'E-Mail']) ?> + Form->control('memo', ['label' => __('Verwendungszweck'), 'rows' => 3]) ?> + Form->control('amount', ['label' => __('Betrag in GDD')]) ?> + Form->button(__('Transaktion abschließen'), ['name' => 'next', 'class' => 'form-button']) ?> + + Form->end() ?> +
    +
    + +Html->script(['core', 'vendor.addons']); ?> + diff --git a/community_server/src/Template/TransactionSendCoins/create_raw.ctp b/community_server/src/Template/TransactionSendCoins/create_raw.ctp new file mode 100644 index 000000000..0b3d74e1f --- /dev/null +++ b/community_server/src/Template/TransactionSendCoins/create_raw.ctp @@ -0,0 +1,55 @@ +assign('title', __('Überweisung')); +// In a View class +$this->loadHelper('Form', [ + 'templates' => 'horizontal_form', +]); +?> + +
    +
    +
    +

    Überweisen

    +
    +
    +
    +
    + Form->create($transferRawForm) ?> + Form->control('sender_privkey_hex', ['label' => __('Sender Private Key')]) ?> + Form->control('sender_pubkey_hex', ['label' => __('Sender Public Key')]) ?> + Form->control('receiver_pubkey_hex', ['label' => __('Empfänger Public Key')]) ?> + Form->control('memo', ['label' => __('Verwendungszweck'), 'rows' => 3]) ?> + Form->control('amount', ['label' => __('Betrag in GDD')]) ?> + Form->button(__('Transaktion abschließen'), ['name' => 'next', 'class' => 'btn btn-sm btn-primary']) ?> + Form->end() ?> +
    +
    +
    +
    +
    +
    +
    + +Html->script(['core', 'vendor.addons']); ?> + diff --git a/community_server/src/Template/TransactionSendCoins/edit.ctp b/community_server/src/Template/TransactionSendCoins/edit.ctp new file mode 100644 index 000000000..61a6841fe --- /dev/null +++ b/community_server/src/Template/TransactionSendCoins/edit.ctp @@ -0,0 +1,36 @@ + + +
    + Form->create($transactionSendCoin) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + echo $this->Form->control('state_user_id', ['options' => $stateUsers]); + echo $this->Form->control('amount'); + echo $this->Form->control('sender_final_balance'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionSendCoins/index.ctp b/community_server/src/Template/TransactionSendCoins/index.ctp new file mode 100644 index 000000000..a14083c61 --- /dev/null +++ b/community_server/src/Template/TransactionSendCoins/index.ctp @@ -0,0 +1,56 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('amount') ?>Paginator->sort('sender_final_balance') ?>
    Number->format($transactionSendCoin->id) ?>has('transaction') ? $this->Html->link($transactionSendCoin->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSendCoin->transaction->id]) : '' ?>has('state_user') ? $this->Html->link($transactionSendCoin->state_user->getEmailWithName(), ['controller' => 'StateUsers', 'action' => 'view', $transactionSendCoin->state_user->id]) : '' ?>Number->format($transactionSendCoin->amount) ?>Number->format($transactionSendCoin->sender_final_balance) ?> + Html->link(__('View'), ['action' => 'view', $transactionSendCoin->id]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/TransactionSendCoins/view.ctp b/community_server/src/Template/TransactionSendCoins/view.ctp new file mode 100644 index 000000000..322621942 --- /dev/null +++ b/community_server/src/Template/TransactionSendCoins/view.ctp @@ -0,0 +1,44 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + + + + + +
    has('transaction') ? $this->Html->link($transactionSendCoin->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSendCoin->transaction->id]) : '' ?>
    has('state_user') ? $this->Html->link($transactionSendCoin->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $transactionSendCoin->state_user->id]) : '' ?>
    Number->format($transactionSendCoin->id) ?>
    Number->format($transactionSendCoin->amount) ?>
    Number->format($transactionSendCoin->sender_final_balance) ?>
    +
    diff --git a/community_server/src/Template/TransactionSignatures/add.ctp b/community_server/src/Template/TransactionSignatures/add.ctp new file mode 100644 index 000000000..752389cd7 --- /dev/null +++ b/community_server/src/Template/TransactionSignatures/add.ctp @@ -0,0 +1,25 @@ + + +
    + Form->create($transactionSignature) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionSignatures/edit.ctp b/community_server/src/Template/TransactionSignatures/edit.ctp new file mode 100644 index 000000000..68143712b --- /dev/null +++ b/community_server/src/Template/TransactionSignatures/edit.ctp @@ -0,0 +1,31 @@ + + +
    + Form->create($transactionSignature) ?> +
    + + Form->control('transaction_id', ['options' => $transactions]); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionSignatures/index.ctp b/community_server/src/Template/TransactionSignatures/index.ctp new file mode 100644 index 000000000..9b8bc2826 --- /dev/null +++ b/community_server/src/Template/TransactionSignatures/index.ctp @@ -0,0 +1,49 @@ + + +
    +

    + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>
    Number->format($transactionSignature->id) ?>has('transaction') ? $this->Html->link($transactionSignature->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSignature->transaction->id]) : '' ?> + Html->link(__('View'), ['action' => 'view', $transactionSignature->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $transactionSignature->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $transactionSignature->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionSignature->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/TransactionSignatures/view.ctp b/community_server/src/Template/TransactionSignatures/view.ctp new file mode 100644 index 000000000..681198125 --- /dev/null +++ b/community_server/src/Template/TransactionSignatures/view.ctp @@ -0,0 +1,30 @@ + + +
    +

    id) ?>

    + + + + + + + + + +
    has('transaction') ? $this->Html->link($transactionSignature->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSignature->transaction->id]) : '' ?>
    Number->format($transactionSignature->id) ?>
    +
    diff --git a/community_server/src/Template/TransactionTypes/add.ctp b/community_server/src/Template/TransactionTypes/add.ctp new file mode 100644 index 000000000..97de82122 --- /dev/null +++ b/community_server/src/Template/TransactionTypes/add.ctp @@ -0,0 +1,26 @@ + + +
    + Form->create($transactionType) ?> +
    + + Form->control('name'); + echo $this->Form->control('text'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionTypes/edit.ctp b/community_server/src/Template/TransactionTypes/edit.ctp new file mode 100644 index 000000000..421184b55 --- /dev/null +++ b/community_server/src/Template/TransactionTypes/edit.ctp @@ -0,0 +1,32 @@ + + +
    + Form->create($transactionType) ?> +
    + + Form->control('name'); + echo $this->Form->control('text'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/TransactionTypes/index.ctp b/community_server/src/Template/TransactionTypes/index.ctp new file mode 100644 index 000000000..b2248ae4b --- /dev/null +++ b/community_server/src/Template/TransactionTypes/index.ctp @@ -0,0 +1,51 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('text') ?>
    Number->format($transactionType->id) ?>name) ?>text) ?> + Html->link(__('View'), ['action' => 'view', $transactionType->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $transactionType->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $transactionType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionType->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/TransactionTypes/view.ctp b/community_server/src/Template/TransactionTypes/view.ctp new file mode 100644 index 000000000..3da64f7e3 --- /dev/null +++ b/community_server/src/Template/TransactionTypes/view.ctp @@ -0,0 +1,63 @@ + + +
    +

    name) ?>

    + + + + + + + + + + + + + +
    name) ?>
    text) ?>
    Number->format($transactionType->id) ?>
    + +
    diff --git a/community_server/src/Template/Transactions/add.ctp b/community_server/src/Template/Transactions/add.ctp new file mode 100644 index 000000000..59782d944 --- /dev/null +++ b/community_server/src/Template/Transactions/add.ctp @@ -0,0 +1,43 @@ + + +
    + Form->create($transaction) ?> +
    + + Form->control('state_group_id', ['options' => $stateGroups]); + echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]); + echo $this->Form->control('received'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/Transactions/decode.ctp b/community_server/src/Template/Transactions/decode.ctp new file mode 100644 index 000000000..dddde1cb8 --- /dev/null +++ b/community_server/src/Template/Transactions/decode.ctp @@ -0,0 +1,36 @@ + + 0) : ?> +
    +
      + +
    • + +
    • + +
    +
    + + +Form->create() ?> +Form->control('base64', ['type'=> 'textarea', 'rows' => '5', 'cols' => 40]) ?> +Form->submit(); ?> +Form->end() ?> + + +getTransactionBody(); +?> + + + getMemo() ?> +
    TypegetTransactionTypeName() ?>
    Memo
    + + diff --git a/community_server/src/Template/Transactions/edit.ctp b/community_server/src/Template/Transactions/edit.ctp new file mode 100644 index 000000000..4085a60c4 --- /dev/null +++ b/community_server/src/Template/Transactions/edit.ctp @@ -0,0 +1,49 @@ + + +
    + Form->create($transaction) ?> +
    + + Form->control('state_group_id', ['options' => $stateGroups]); + echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]); + echo $this->Form->control('received'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/Transactions/index.ctp b/community_server/src/Template/Transactions/index.ctp new file mode 100644 index 000000000..25890878a --- /dev/null +++ b/community_server/src/Template/Transactions/index.ctp @@ -0,0 +1,54 @@ + + +
    +
    +
    Paginator->sort('id') ?>
    +
    Paginator->sort('memo') ?>
    +
    Paginator->sort('transaction_type_id') ?>
    +
    Paginator->sort('received') ?>
    + +
    Number->format($transaction->id) ?>
    +
    memo) ?>
    +
    has('transaction_type') ? $this->Html->link(__($transaction->transaction_type->name), ['controller' => 'TransactionTypes', 'action' => 'view', $transaction->transaction_type->id]) : '' ?>
    +
    received) ?>
    + +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/Transactions/send_to_node.ctp b/community_server/src/Template/Transactions/send_to_node.ctp new file mode 100644 index 000000000..0bb652feb --- /dev/null +++ b/community_server/src/Template/Transactions/send_to_node.ctp @@ -0,0 +1,106 @@ +assign('title', __('Transaktionen an Gradido-Node senden')); +?> + + +

    + +Bisher keine Transaktionen eingereicht + +Letzte eingereichte Transaktion + +

    +
      + $id) : ?> +
    • + : + + + Wird verarbeitet + + in Warteschlange + + + +
    • +
    +Html->script(['core']); ?> + diff --git a/community_server/src/Template/Transactions/view.ctp b/community_server/src/Template/Transactions/view.ctp new file mode 100644 index 000000000..e15b9dbe3 --- /dev/null +++ b/community_server/src/Template/Transactions/view.ctp @@ -0,0 +1,259 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + +
    has('state_group') ? $this->Html->link($transaction->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $transaction->state_group->id]) : '' ?>
    has('transaction_type') ? $this->Html->link($transaction->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $transaction->transaction_type->id]) : '' ?>
    Number->format($transaction->id) ?>
    received) ?>
    + + + + + + + +
    diff --git a/community_server/src/Template/Users/add.ctp b/community_server/src/Template/Users/add.ctp new file mode 100644 index 000000000..6f67f02e6 --- /dev/null +++ b/community_server/src/Template/Users/add.ctp @@ -0,0 +1,28 @@ + + +
    + Form->create($user) ?> +
    + + Form->control('email'); + echo $this->Form->control('first_name'); + echo $this->Form->control('last_name'); + echo $this->Form->control('password'); + echo $this->Form->control('email_checked'); + echo $this->Form->control('language'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/Users/edit.ctp b/community_server/src/Template/Users/edit.ctp new file mode 100644 index 000000000..681eacd36 --- /dev/null +++ b/community_server/src/Template/Users/edit.ctp @@ -0,0 +1,34 @@ + + +
    + Form->create($user) ?> +
    + + Form->control('email'); + echo $this->Form->control('first_name'); + echo $this->Form->control('last_name'); + echo $this->Form->control('password'); + echo $this->Form->control('email_checked'); + echo $this->Form->control('language'); + ?> +
    + Form->button(__('Submit')) ?> + Form->end() ?> +
    diff --git a/community_server/src/Template/Users/index.ctp b/community_server/src/Template/Users/index.ctp new file mode 100644 index 000000000..14566ea26 --- /dev/null +++ b/community_server/src/Template/Users/index.ctp @@ -0,0 +1,59 @@ + + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Paginator->sort('id') ?>Paginator->sort('email') ?>Paginator->sort('first_name') ?>Paginator->sort('last_name') ?>Paginator->sort('password') ?>Paginator->sort('created') ?>Paginator->sort('email_checked') ?>Paginator->sort('language') ?>
    Number->format($user->id) ?>email) ?>first_name) ?>last_name) ?>Number->format($user->password) ?>created) ?>email_checked) ?>language) ?> + Html->link(__('View'), ['action' => 'view', $user->id]) ?> + Html->link(__('Edit'), ['action' => 'edit', $user->id]) ?> + Form->postLink(__('Delete'), ['action' => 'delete', $user->id], ['confirm' => __('Are you sure you want to delete # {0}?', $user->id)]) ?> +
    +
    + +

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    +
    +
    diff --git a/community_server/src/Template/Users/statistics.ctp b/community_server/src/Template/Users/statistics.ctp new file mode 100644 index 000000000..76532faa8 --- /dev/null +++ b/community_server/src/Template/Users/statistics.ctp @@ -0,0 +1,98 @@ +assign('title', __('Benutzer Statistiken')); + +//mdi mdi-account-multiple-plus +//$newUserPercent = (1 - (b / a)) * 100 +$newUserPercent = 0; +$percentColor = 'info'; +if($users->count() > 0 && $newUsersLastMonth->count()) { + $newUserPercent = round((1 - ($users->count() / $newUsersLastMonth->count())) * 100.0, 2); + if($newUserPercent > 0 ) { + $percentColor = 'success'; + } else if($newUserPercent <= 0) { + $percentColor = 'alert'; + } +} + +$userColor = 'info'; +if($users->count() > 0) { + if($users->count() > 0 ) { + $userColor = 'success'; + } else if($users->count() <= 0) { + $userColor = 'alert'; + } +} +?> +
    +
    +
    + people +
    +

    count()?>

    +
     
    + +   + +
    +
    +
    + group_add +
    +

    count() ?>

    +
     
    + + + arrow_drop_down + 0) : ?> + arrow_drop_up + + % + +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    + +
    +
    first_name . ' ' . $user->last_name ?>
    +
    email ?>
    +
    created ?>
    +
    + + toArray()); ?> +
    +
    +
    +

    +
    +
    +
    +
    +
    +
    + $yearEntrys) : ?> + $monthEntrys): ?> +
    +
    +
    +
    +
    + + +
    +
    +Html->script(['core', 'vendor.addons']); ?> +Html->script('userSearch') ?> \ No newline at end of file diff --git a/community_server/src/Template/Users/view.ctp b/community_server/src/Template/Users/view.ctp new file mode 100644 index 000000000..d3a1e67cd --- /dev/null +++ b/community_server/src/Template/Users/view.ctp @@ -0,0 +1,52 @@ + + +
    +

    id) ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    email) ?>
    first_name) ?>
    last_name) ?>
    language) ?>
    Number->format($user->id) ?>
    Number->format($user->password) ?>
    created) ?>
    email_checked ? __('Yes') : __('No'); ?>
    +
    diff --git a/community_server/src/View/AjaxView.php b/community_server/src/View/AjaxView.php new file mode 100644 index 000000000..3cb786926 --- /dev/null +++ b/community_server/src/View/AjaxView.php @@ -0,0 +1,49 @@ +response = $this->response->withType('ajax'); + } +} diff --git a/community_server/src/View/AppView.php b/community_server/src/View/AppView.php new file mode 100644 index 000000000..242ab6bde --- /dev/null +++ b/community_server/src/View/AppView.php @@ -0,0 +1,40 @@ +loadHelper('Html');` + * + * @return void + */ + public function initialize() + { + } +} diff --git a/community_server/src/View/Cell/empty b/community_server/src/View/Cell/empty new file mode 100644 index 000000000..e69de29bb diff --git a/community_server/src/View/Helper/empty b/community_server/src/View/Helper/empty new file mode 100644 index 000000000..e69de29bb diff --git a/community_server/src/protobuf b/community_server/src/protobuf new file mode 160000 index 000000000..9004e6978 --- /dev/null +++ b/community_server/src/protobuf @@ -0,0 +1 @@ +Subproject commit 9004e6978ac3dafcc635b2ffcf8bc6a156451cca diff --git a/community_server/tests/Fixture/AddressTypesFixture.php b/community_server/tests/Fixture/AddressTypesFixture.php new file mode 100644 index 000000000..ad440c1cb --- /dev/null +++ b/community_server/tests/Fixture/AddressTypesFixture.php @@ -0,0 +1,46 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'name' => ['type' => 'string', 'length' => 25, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'text' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'name' => 'Lorem ipsum dolor sit a', + 'text' => 'Lorem ipsum dolor sit amet' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/AdminErrorsFixture.php b/community_server/tests/Fixture/AdminErrorsFixture.php new file mode 100644 index 000000000..0fbc3a067 --- /dev/null +++ b/community_server/tests/Fixture/AdminErrorsFixture.php @@ -0,0 +1,56 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'controller' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], + 'action' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], + 'state' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], + 'msg' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], + 'details' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], + 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8mb4_general_ci' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'state_user_id' => 1, + 'controller' => 'Lorem ipsum dolor sit amet', + 'action' => 'Lorem ipsum dolor sit amet', + 'state' => 'Lorem ipsum dolor sit amet', + 'msg' => 'Lorem ipsum dolor sit amet', + 'details' => 'Lorem ipsum dolor sit amet', + 'created' => '2019-12-16 15:08:19' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/CommunityProfilesFixture.php b/community_server/tests/Fixture/CommunityProfilesFixture.php new file mode 100644 index 000000000..1259d6e25 --- /dev/null +++ b/community_server/tests/Fixture/CommunityProfilesFixture.php @@ -0,0 +1,52 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'profile_img' => ['type' => 'binary', 'length' => 4294967295, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], + 'profile_desc' => ['type' => 'string', 'length' => 2000, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], + '_indexes' => [ + 'state_user_id' => ['type' => 'index', 'columns' => ['state_user_id'], 'length' => []], + ], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + 'community_profiles_ibfk_1' => ['type' => 'foreign', 'columns' => ['state_user_id'], 'references' => ['state_users', 'id'], 'update' => 'restrict', 'delete' => 'restrict', 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8mb4_general_ci' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'state_user_id' => 1, + 'profile_img' => 'Lorem ipsum dolor sit amet', + 'profile_desc' => 'Lorem ipsum dolor sit amet', + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/ElopageBuysFixture.php b/community_server/tests/Fixture/ElopageBuysFixture.php new file mode 100644 index 000000000..20be0f4e3 --- /dev/null +++ b/community_server/tests/Fixture/ElopageBuysFixture.php @@ -0,0 +1,64 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'elopage_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'affiliate_program_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'publisher_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'order_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'product_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'product_price' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'payer_email' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'publisher_email' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'payed' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'success_date' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'event' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'elopage_user_id' => 1, + 'affiliate_program_id' => 1, + 'publisher_id' => 1, + 'order_id' => 1, + 'product_id' => 1, + 'product_price' => 1, + 'payer_email' => 'Lorem ipsum dolor sit amet', + 'publisher_email' => 'Lorem ipsum dolor sit amet', + 'payed' => 1, + 'success_date' => '2020-02-13 09:49:46', + 'event' => 'Lorem ipsum dolor sit amet', + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/OperatorTypesFixture.php b/community_server/tests/Fixture/OperatorTypesFixture.php new file mode 100644 index 000000000..dfc589034 --- /dev/null +++ b/community_server/tests/Fixture/OperatorTypesFixture.php @@ -0,0 +1,46 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'name' => ['type' => 'string', 'length' => 25, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'text' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'name' => 'Lorem ipsum dolor sit a', + 'text' => 'Lorem ipsum dolor sit amet' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/OperatorsFixture.php b/community_server/tests/Fixture/OperatorsFixture.php new file mode 100644 index 000000000..2cb852efc --- /dev/null +++ b/community_server/tests/Fixture/OperatorsFixture.php @@ -0,0 +1,49 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'username' => ['type' => 'string', 'length' => 128, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'operator_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'data_base64' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + 'username' => ['type' => 'unique', 'columns' => ['username'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'username' => 'Lorem ipsum dolor sit amet', + 'operator_type_id' => 1, + 'data_base64' => 'Lorem ipsum dolor sit amet' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/ServerUsersFixture.php b/community_server/tests/Fixture/ServerUsersFixture.php new file mode 100644 index 000000000..3aeedab12 --- /dev/null +++ b/community_server/tests/Fixture/ServerUsersFixture.php @@ -0,0 +1,58 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'username' => ['type' => 'string', 'length' => 50, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'password' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'email' => ['type' => 'string', 'length' => 50, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'role' => ['type' => 'string', 'length' => 20, 'null' => false, 'default' => 'admin', 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'activated' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null], + 'last_login' => ['type' => 'datetime', 'length' => null, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], + 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'modified' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'username' => 'Lorem ipsum dolor sit amet', + 'password' => 'Lorem ipsum dolor sit amet', + 'email' => 'Lorem ipsum dolor sit amet', + 'role' => 'Lorem ipsum dolor ', + 'activated' => 1, + 'last_login' => '2019-09-13 10:30:09', + 'created' => '2019-09-13 10:30:09', + 'modified' => '2019-09-13 10:30:09' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/StateBalancesFixture.php b/community_server/tests/Fixture/StateBalancesFixture.php new file mode 100644 index 000000000..64118f3ed --- /dev/null +++ b/community_server/tests/Fixture/StateBalancesFixture.php @@ -0,0 +1,54 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => true], + 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'modified' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'amount' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'state_user_id' => 1, + 'modified' => '2019-11-05 18:02:28', + 'amount' => 1200 + ], + [ + 'id' => 10, + 'state_user_id' => 4, + 'modified' => '2019-11-11 14:58:54', + 'amount' => 1200000 + ] + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/StateCreatedFixture.php b/community_server/tests/Fixture/StateCreatedFixture.php new file mode 100644 index 000000000..2f1abd155 --- /dev/null +++ b/community_server/tests/Fixture/StateCreatedFixture.php @@ -0,0 +1,63 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'month' => ['type' => 'tinyinteger', 'length' => 4, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'year' => ['type' => 'smallinteger', 'length' => 6, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'short_ident_hash' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + '_indexes' => [ + 'short_ident_hash' => ['type' => 'index', 'columns' => ['short_ident_hash'], 'length' => []], + ], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'transaction_id' => 1, + 'month' => 1, + 'year' => 1, + 'state_user_id' => 1, + 'created' => '2019-09-12 11:14:51', + 'short_ident_hash' => 1 + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/StateErrorsFixture.php b/community_server/tests/Fixture/StateErrorsFixture.php new file mode 100644 index 000000000..6f0d95e26 --- /dev/null +++ b/community_server/tests/Fixture/StateErrorsFixture.php @@ -0,0 +1,50 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'transaction_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'message_json' => ['type' => 'text', 'length' => null, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8mb4_general_ci' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'state_user_id' => 1, + 'transaction_type_id' => 1, + 'created' => '2019-11-07 13:13:12', + 'message_json' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida, phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit, feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/StateGroupAddressesFixture.php b/community_server/tests/Fixture/StateGroupAddressesFixture.php new file mode 100644 index 000000000..7ab0a37e9 --- /dev/null +++ b/community_server/tests/Fixture/StateGroupAddressesFixture.php @@ -0,0 +1,48 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'state_group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'address_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'state_group_id' => 1, + 'public_key' => 'Lorem ipsum dolor sit amet', + 'address_type_id' => 1 + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/StateGroupRelationshipsFixture.php b/community_server/tests/Fixture/StateGroupRelationshipsFixture.php new file mode 100644 index 000000000..e50d76f5d --- /dev/null +++ b/community_server/tests/Fixture/StateGroupRelationshipsFixture.php @@ -0,0 +1,48 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'state_group1_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'state_group2_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'state_relationship_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'state_group1_id' => 1, + 'state_group2_id' => 1, + 'state_relationship_id' => 1 + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/StateGroupsFixture.php b/community_server/tests/Fixture/StateGroupsFixture.php new file mode 100644 index 000000000..57cde2350 --- /dev/null +++ b/community_server/tests/Fixture/StateGroupsFixture.php @@ -0,0 +1,50 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'index_id' => ['type' => 'binary', 'length' => 64, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'name' => ['type' => 'string', 'length' => 50, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'root_public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'user_count' => ['type' => 'smallinteger', 'length' => 6, 'unsigned' => false, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'index_id' => 'Lorem ipsum dolor sit amet', + 'name' => 'Lorem ipsum dolor sit amet', + 'root_public_key' => 'Lorem ipsum dolor sit amet', + 'user_count' => 1 + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/StateRelationshipTypesFixture.php b/community_server/tests/Fixture/StateRelationshipTypesFixture.php new file mode 100644 index 000000000..c461e0ce3 --- /dev/null +++ b/community_server/tests/Fixture/StateRelationshipTypesFixture.php @@ -0,0 +1,46 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'name' => ['type' => 'string', 'length' => 25, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'text' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'name' => 'Lorem ipsum dolor sit a', + 'text' => 'Lorem ipsum dolor sit amet' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/StateUsersFixture.php b/community_server/tests/Fixture/StateUsersFixture.php new file mode 100644 index 000000000..04654dea9 --- /dev/null +++ b/community_server/tests/Fixture/StateUsersFixture.php @@ -0,0 +1,73 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'index_id' => ['type' => 'smallinteger', 'length' => 6, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'email' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'first_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'last_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + 'public_key' => ['type' => 'unique', 'columns' => ['public_key'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'index_id' => 0, + 'group_id' => 0, + 'public_key' => hex2bin('94ae135b93cd9f33752b4e55c41903a3faa13a75bb90bfd411ea1d4a1a5e711f'), + 'email' => '***REMOVED***', + 'first_name' => 'Dario', + 'last_name' => 'Rekowski' + ], + [ + 'id' => 4, + 'index_id' => 0, + 'group_id' => 0, + 'public_key' => hex2bin('8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d'), + 'email' => 'dariofrodo@gmx.de', + 'first_name' => 'Dario', + 'last_name' => 'Frodo' + ], + [ + 'id' => 11, + 'index_id' => 0, + 'group_id' => 0, + 'public_key' => hex2bin('61b923c218cb63a64a8c62f3860121283b9577f374d0a31590ba02cdc2912999'), + 'email' => 'em741@gmx.de', + 'first_name' => 'Dario', + 'last_name' => 'Rekowski' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/TransactionCreationsFixture.php b/community_server/tests/Fixture/TransactionCreationsFixture.php new file mode 100644 index 000000000..d34a235a5 --- /dev/null +++ b/community_server/tests/Fixture/TransactionCreationsFixture.php @@ -0,0 +1,69 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'amount' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'ident_hash' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + + // (1, 1, 2, 10000000, 0x3235303332373635330000000000000000000000000000000000000000000000, '2020-12-01 00:00:00'), + // (2, 2, 2, 10000000, 0x3235303332373635330000000000000000000000000000000000000000000000, '2021-01-01 00:00:00'), + // (3, 3, 2, 10000000, 0x3235303332373635330000000000000000000000000000000000000000000000, '2021-02-01 00:00:00'); + + $this->records = [ + [ + 'id' => 1, + 'transaction_id' => 1, + 'state_user_id' => 2, + 'amount' => 10000000, + 'ident_hash' => hex2bin('3235303332373635330000000000000000000000000000000000000000000000') + ], + [ + 'id' => 2, + 'transaction_id' => 2, + 'state_user_id' => 2, + 'amount' => 10000000, + 'ident_hash' => hex2bin('3235303332373635330000000000000000000000000000000000000000000000') + ], + [ + 'id' => 3, + 'transaction_id' => 3, + 'state_user_id' => 2, + 'amount' => 10000000, + 'ident_hash' => hex2bin('3235303332373635330000000000000000000000000000000000000000000000') + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/TransactionGroupAddaddressFixture.php b/community_server/tests/Fixture/TransactionGroupAddaddressFixture.php new file mode 100644 index 000000000..7b659386c --- /dev/null +++ b/community_server/tests/Fixture/TransactionGroupAddaddressFixture.php @@ -0,0 +1,54 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'address_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'transaction_id' => 1, + 'address_type_id' => 1, + 'public_key' => 'Lorem ipsum dolor sit amet' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/TransactionGroupAllowtradesFixture.php b/community_server/tests/Fixture/TransactionGroupAllowtradesFixture.php new file mode 100644 index 000000000..edb745441 --- /dev/null +++ b/community_server/tests/Fixture/TransactionGroupAllowtradesFixture.php @@ -0,0 +1,48 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'allow' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'transaction_id' => 1, + 'group_id' => 1, + 'allow' => 1 + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/TransactionGroupCreatesFixture.php b/community_server/tests/Fixture/TransactionGroupCreatesFixture.php new file mode 100644 index 000000000..73db1c751 --- /dev/null +++ b/community_server/tests/Fixture/TransactionGroupCreatesFixture.php @@ -0,0 +1,50 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'group_public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'state_group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'name' => ['type' => 'string', 'length' => 64, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'transaction_id' => 1, + 'group_public_key' => 'Lorem ipsum dolor sit amet', + 'state_group_id' => 1, + 'name' => 'Lorem ipsum dolor sit amet' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/TransactionSendCoinsFixture.php b/community_server/tests/Fixture/TransactionSendCoinsFixture.php new file mode 100644 index 000000000..9f7bc4a67 --- /dev/null +++ b/community_server/tests/Fixture/TransactionSendCoinsFixture.php @@ -0,0 +1,55 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'receiver_public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'receiver_user_id' => ['type' => 'binary', 'length' => 64, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'amount' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'sender_final_balance' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + // (1, 4, 2, 0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355, 1, 15000000, 15000000); + $this->records = [ + [ + 'id' => 1, + 'transaction_id' => 4, + 'state_user_id' => 2, + 'receiver_public_key' => '0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355', + 'receiver_user_id' => 1, + 'amount' => 150000001, + 'sender_final_balance' => 15000000 + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/TransactionSignaturesFixture.php b/community_server/tests/Fixture/TransactionSignaturesFixture.php new file mode 100644 index 000000000..c848461e1 --- /dev/null +++ b/community_server/tests/Fixture/TransactionSignaturesFixture.php @@ -0,0 +1,70 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'signature' => ['type' => 'binary', 'length' => 64, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'pubkey' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + // (1, 1, 0x911b173577261c8b971b4e6ca56b5125ebd5155de8176ce35f9c95ae6929edf3f1e3095d29b37c8bc7cc2478981a41d8cdd3e5398a2c7aa7c691bd486836b705, 0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355), + // (2, 2, 0x01e76b14190fa14cb5839d1129b04c4043e691895541b16ae1b54c6b3206d7933def3c58ebf195bc67a7cd5773554636c55fe5e7ddb0c81fb247c24761f8120f, 0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355), + // (3, 3, 0x2b8c56cac8993f445a8b41ab6e86a486faa18c1e945df1c0acce2bcb342b96d36c5fcb7e687c97cc89790a386241d4b911e8f7949a2da64eef290c5380fc8602, 0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355), + // (4, 4, 0xcb0e9f83b847f630cc6831d62aca8fbfa971af458a12389d7e43abb5bb0936b8e35dbc5b1d641eb2f793e253eb0b149a809860a69897bfe86ba4bfd178da8102, 0xcccb338e003d2abb92178fc4302d1ab83f66b27d9c7e5b6b3ac91e0c23922088); + $this->records = [ + [ + 'id' => 1, + 'transaction_id' => 1, + 'signature' => '0x911b173577261c8b971b4e6ca56b5125ebd5155de8176ce35f9c95ae6929edf3f1e3095d29b37c8bc7cc2478981a41d8cdd3e5398a2c7aa7c691bd486836b705', + 'pubkey' => '0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355' + ], + [ + 'id' => 2, + 'transaction_id' => 2, + 'signature' => '0x01e76b14190fa14cb5839d1129b04c4043e691895541b16ae1b54c6b3206d7933def3c58ebf195bc67a7cd5773554636c55fe5e7ddb0c81fb247c24761f8120f', + 'pubkey' => '0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355' + ], + [ + 'id' => 3, + 'transaction_id' => 3, + 'signature' => '0x2b8c56cac8993f445a8b41ab6e86a486faa18c1e945df1c0acce2bcb342b96d36c5fcb7e687c97cc89790a386241d4b911e8f7949a2da64eef290c5380fc8602', + 'pubkey' => '0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355' + ], + [ + 'id' => 4, + 'transaction_id' => 4, + 'signature' => '0xcb0e9f83b847f630cc6831d62aca8fbfa971af458a12389d7e43abb5bb0936b8e35dbc5b1d641eb2f793e253eb0b149a809860a69897bfe86ba4bfd178da8102', + 'pubkey' => '0xcccb338e003d2abb92178fc4302d1ab83f66b27d9c7e5b6b3ac91e0c23922088' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/TransactionTypesFixture.php b/community_server/tests/Fixture/TransactionTypesFixture.php new file mode 100644 index 000000000..48e00e0ec --- /dev/null +++ b/community_server/tests/Fixture/TransactionTypesFixture.php @@ -0,0 +1,51 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'name' => ['type' => 'string', 'length' => 24, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'text' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'name' => 'creation', + 'text' => 'Aktives oder Bedingsungsloses Grundeinkommen' + ], + [ + 'id' => 2, + 'name' => 'transfer', + 'text' => 'Einfache Überweisung' + ] + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/TransactionsFixture.php b/community_server/tests/Fixture/TransactionsFixture.php new file mode 100644 index 000000000..0a1be1341 --- /dev/null +++ b/community_server/tests/Fixture/TransactionsFixture.php @@ -0,0 +1,79 @@ + ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'state_group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'transaction_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'tx_hash' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'received' => ['type' => 'timestamp', 'length' => null, 'null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '', 'precision' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_bin' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + // (1, NULL, 1, 0x7dc55cf3a1a39b441d87d5452c40cad8e7fd8aab573ed1da0bf118129fc77987, 'AGE Dezember 2020', '2021-02-19 13:18:52'), + // (2, NULL, 1, 0xdea38d4dd72af1e0d90621ae8139efbbdb3b44b60be04b0d40cfc157afd2c19c, 'AGE Januar 2021', '2021-02-19 13:25:36'), + // (3, NULL, 1, 0x4e7734ed84dcd8ddc5286b87ff85eb12704092d51f485e7c4dbcb4a68ba296ce, 'AGE Februar 2021', '2021-02-19 13:25:37'), + // (4, NULL, 2, 0x065b5b75b7f4b156fe2b07b54b1a3df0c4eadc40c0f6940c666fed4d75751f8f, 'Ich teile mit dir\r\n \r\nmiau _=', '2021-02-19 13:27:14'); + $this->records = [ + [ + 'id' => 1, + 'group_id' => NULL, + 'transaction_type_id' => 1, + 'tx_hash' => '0x7dc55cf3a1a39b441d87d5452c40cad8e7fd8aab573ed1da0bf118129fc77987', + 'memo' => 'AGE Dezember 2020', + 'received' => '2021-02-19 13:18:52' + ], + [ + 'id' => 2, + 'group_id' => NULL, + 'transaction_type_id' => 1, + 'tx_hash' => '0xdea38d4dd72af1e0d90621ae8139efbbdb3b44b60be04b0d40cfc157afd2c19c', + 'memo' => 'AGE Januar 2021', + 'received' => '2021-02-19 13:25:36' + ], + [ + 'id' => 3, + 'group_id' => NULL, + 'transaction_type_id' => 1, + 'tx_hash' => '0x4e7734ed84dcd8ddc5286b87ff85eb12704092d51f485e7c4dbcb4a68ba296ce', + 'memo' => 'AGE Februar 2021', + 'received' => '2021-02-19 13:25:37' + ], + [ + 'id' => 4, + 'group_id' => NULL, + 'transaction_type_id' => 2, + 'tx_hash' => '0x065b5b75b7f4b156fe2b07b54b1a3df0c4eadc40c0f6940c666fed4d75751f8f', + 'memo' => 'Ich teile mit dir\r\n \r\nmiau _=', + 'received' => '2021-02-19 13:27:14' + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/UsersFixture.php b/community_server/tests/Fixture/UsersFixture.php new file mode 100644 index 000000000..fc1a9e620 --- /dev/null +++ b/community_server/tests/Fixture/UsersFixture.php @@ -0,0 +1,61 @@ + ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'email' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'first_name' => ['type' => 'string', 'length' => 150, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'last_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => '', 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + 'password' => ['type' => 'biginteger', 'length' => 25, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'pubkey' => ['type' => 'binary', 'length' => 32, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], + 'privkey' => ['type' => 'binary', 'length' => 80, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], + 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '', 'precision' => null], + 'email_checked' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null], + 'language' => ['type' => 'string', 'length' => 4, 'null' => false, 'default' => 'de', 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + 'email' => ['type' => 'unique', 'columns' => ['email'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8_general_ci' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->records = [ + [ + 'id' => 1, + 'email' => 'Lorem ipsum dolor sit amet', + 'first_name' => 'Lorem ipsum dolor sit amet', + 'last_name' => 'Lorem ipsum dolor sit amet', + 'password' => 1, + 'pubkey' => 'Lorem ipsum dolor sit amet', + 'privkey' => 'Lorem ipsum dolor sit amet', + 'created' => '2020-02-13 10:54:19', + 'email_checked' => 1, + 'language' => 'Lo', + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/TestCase/ApplicationTest.php b/community_server/tests/TestCase/ApplicationTest.php new file mode 100644 index 000000000..908b23539 --- /dev/null +++ b/community_server/tests/TestCase/ApplicationTest.php @@ -0,0 +1,84 @@ +bootstrap(); + $plugins = $app->getPlugins(); + + $this->assertCount(3, $plugins); + $this->assertSame('Bake', $plugins->get('Bake')->getName()); + $this->assertSame('Migrations', $plugins->get('Migrations')->getName()); + $this->assertSame('DebugKit', $plugins->get('DebugKit')->getName()); + } + + /** + * testBootstrapPluginWitoutHalt + * + * @return void + */ + public function testBootstrapPluginWithoutHalt() + { + $this->expectException(InvalidArgumentException::class); + + $app = $this->getMockBuilder(Application::class) + ->setConstructorArgs([dirname(dirname(__DIR__)) . '/config']) + ->setMethods(['addPlugin']) + ->getMock(); + + $app->method('addPlugin') + ->will($this->throwException(new InvalidArgumentException('test exception.'))); + + $app->bootstrap(); + } + + /** + * testMiddleware + * + * @return void + */ + public function testMiddleware() + { + $app = new Application(dirname(dirname(__DIR__)) . '/config'); + $middleware = new MiddlewareQueue(); + + $middleware = $app->middleware($middleware); + + $this->assertInstanceOf(ErrorHandlerMiddleware::class, $middleware->get(0)); + $this->assertInstanceOf(AssetMiddleware::class, $middleware->get(1)); + $this->assertInstanceOf(RoutingMiddleware::class, $middleware->get(2)); + } +} diff --git a/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php b/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php new file mode 100644 index 000000000..a9044b4ae --- /dev/null +++ b/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php @@ -0,0 +1,76 @@ +markTestIncomplete('Not implemented yet.'); + } + + /** + * Test view method + * + * @return void + */ + public function testView() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test add method + * + * @return void + */ + public function testAdd() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test edit method + * + * @return void + */ + public function testEdit() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test delete method + * + * @return void + */ + public function testDelete() + { + $this->markTestIncomplete('Not implemented yet.'); + } +} diff --git a/community_server/tests/TestCase/Controller/AppControllerTest.php b/community_server/tests/TestCase/Controller/AppControllerTest.php new file mode 100644 index 000000000..79294cbe0 --- /dev/null +++ b/community_server/tests/TestCase/Controller/AppControllerTest.php @@ -0,0 +1,46 @@ +session(['StateUser.id' => 1]); + $this->get('/'); + $this->assertSession(1200, 'StateUser.balance'); + //$this->markTestIncomplete('Not implemented yet.'); + } + + +} diff --git a/community_server/tests/TestCase/Controller/CommunityProfilesControllerTest.php b/community_server/tests/TestCase/Controller/CommunityProfilesControllerTest.php new file mode 100644 index 000000000..35f439dd7 --- /dev/null +++ b/community_server/tests/TestCase/Controller/CommunityProfilesControllerTest.php @@ -0,0 +1,75 @@ +markTestIncomplete('Not implemented yet.'); + } + + /** + * Test view method + * + * @return void + */ + public function testView() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test add method + * + * @return void + */ + public function testAdd() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test edit method + * + * @return void + */ + public function testEdit() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test delete method + * + * @return void + */ + public function testDelete() + { + $this->markTestIncomplete('Not implemented yet.'); + } +} diff --git a/community_server/tests/TestCase/Controller/Component/GradidoNumberComponentTest.php b/community_server/tests/TestCase/Controller/Component/GradidoNumberComponentTest.php new file mode 100644 index 000000000..be6167155 --- /dev/null +++ b/community_server/tests/TestCase/Controller/Component/GradidoNumberComponentTest.php @@ -0,0 +1,95 @@ +GradidoNumberComponent = new GradidoNumberComponent($registry); + } + + /** + * tearDown method + * + * @return void + */ + public function tearDown() + { + unset($this->GradidoNumberComponent); + + parent::tearDown(); + } + + /** + * Test parseInputNumberToCentNumber method + * + * @return void + */ + /* public function testParseInputNumberToCentNumber() + { + $this->markTestIncomplete('Not implemented yet.'); + }*/ + + public function test100() + { + $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber(100); + $this->assertEquals(1000000, $result); + } + + public function test1000() + { + $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber(1000); + $this->assertEquals(10000000, $result); + } + + public function test100Comma() + { + $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('100,12'); + $this->assertEquals(1001200, $result); + } + + public function test100Point() + { + $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('100.12'); + $this->assertEquals(1001200, $result); + } + + public function test100Decimal() + { + $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber(100.12); + $this->assertEquals(1001200, $result); + } + + public function test1000Point() + { + $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('1000.12'); + $this->assertEquals(10001200, $result); + } + + public function test1000Comma() + { + $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('1000,12'); + $this->assertEquals(10001200, $result); + } +} diff --git a/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php b/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php new file mode 100644 index 000000000..fb882478a --- /dev/null +++ b/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php @@ -0,0 +1,84 @@ +JsonRequestClientComponent = new JsonRequestClientComponent($registry); + } + + /** + * tearDown method + * + * @return void + */ + public function tearDown() + { + unset($this->JsonRequestClientComponent); + + parent::tearDown(); + } + + /** + * Test sendTransaction method + * + * @return void + */ + public function testSendTransaction() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test getLoginServerUrl method + * + * @return void + */ + public function testGetLoginServerUrl() + { + //$this->markTestIncomplete('Not implemented yet.'); + $serverUrl = $this->JsonRequestClientComponent->getLoginServerUrl(); + $this->assertEquals($serverUrl, 'http://***REMOVED***'); + } + + /** + * Test is_base64 method + * + * @return void + */ + public function testIsBase64Valid() + { + $result = $this->JsonRequestClientComponent->is_base64('CgpIYWxsbyBXZWx0EgYIr6fe7wVKLwonCiDWDyYU4+zldTQdQMIzGpsL20W+vV44JuNVA5hwczIELRDgg5sBELmhkoIE'); + + $this->assertEquals($result, true); + } + + public function testIsBase64Invalid() + { + $result = $this->JsonRequestClientComponent->is_base64('CgpIYWxsbyBXZWx0EgYIr6fe7wVKLwonCiDWDyYU4-zldTQdQMIzGpsL20W+vV44JuNVA5hwczIELRDgg5sBELmhkoIE'); + + $this->assertEquals($result, false); + } +} diff --git a/community_server/tests/TestCase/Controller/DashboardControllerTest.php b/community_server/tests/TestCase/Controller/DashboardControllerTest.php new file mode 100644 index 000000000..cddf0b7ef --- /dev/null +++ b/community_server/tests/TestCase/Controller/DashboardControllerTest.php @@ -0,0 +1,45 @@ +markTestIncomplete('Not implemented yet.'); + } + + /** + * Test index method + * + * @return void + */ + public function testIndex() + { + $this->markTestIncomplete('Not implemented yet.'); + } +} diff --git a/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php b/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php new file mode 100644 index 000000000..d8a241d7d --- /dev/null +++ b/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php @@ -0,0 +1,187 @@ + 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQJ8wF12eZo3hcMAlAKKJ9WLT-zuSkNmGh7D98UEqH4KoIysnCkXqEya9EBZl9o11_nJ8xmm_nOevuVjR-GfLMQ8qSQoOSGFsbG8gV2VsdCAxMjMSBgiZm4ruBUovCicKIJSuE1uTzZ8zdStOVcQZA6P6oTp1u5C_1BHqHUoaXnEfEKDakwEQtYntlgo', + 'validCreation900' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQNVZ8Ae3Zbg3G0wZ840fzKan6N4KtTcSe0KYi17kQwFmsl18oFxXv8_s6j1xXFrIKjy1_1Olq0a7xYLErDMkjwYqORIGCNb5iu4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgNHKCBC1ie2WCg', + 'validCreation1200' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQEEey5QMAdldoOTP_jTETHgOQriGsixEY0cziQeRfT_J5YtbI_A6AizEYD-JcxmRmXzv1xjjTgsV39Y32ta2CQkqORIGCIeGi-4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgOy4CxC1ie2WCg', + 'notBase64' => 'CgpIYWxsbyBXZW-0EgYIyfSG7gV_LwonCiCboKikqwjZfes9xuqgthFH3', + 'validTransfer' => 'GmYKZAoggZC9pYXuXx2fv30G6B5p7BjhM3YQTP9Ut0V-t9PvcQ0SQDddHyKzAX3LBV0PuDiPc6lxkUipss5tyuLRpMtFJQnT30tsbYIkA1FXimjMKOoiuLswf4OLLV3bAIYehW-b9AgqYQoFSGFsbG8SBgiJlaPvBUJQCiYKIIGQvaWF7l8dn799BugeaewY4TN2EEz_VLdFfrfT73ENEICfSRImCiDtdleSLxhUgEbMW9DpqIwsykFj3-z_enKEOuGnXrmW8xCAn0k', + 'errornusTransfer' => 'ClxGcm9oZXMgTmV1ZXMgSmFociB1bmQgREFOS0UsIGRhc3MgZHUgZGljaCBzbyBlaW5zZXR6dCBmw7xyIEdyYWRpZG8hIEhlcnpsaWNoZSBHcsO8w59lIFRlcmVzYRIGCPjjgvEFQlAKJgogUQwFYeVlGlfWDrkXNN7rHwejoCDJKt+YkYJfbJVyj3EQwIQ9EiYKIPXIRnUhVJ/zCs5+y/VaTBjTIoYizJNwS+JC//xsbQrHEMCEPQ==', + 'creationValid' => 'GmYKZAogLtKKHPXhFtg2FUBrxXcVIiHC93SlZW9moOdUD3V21xsSQHpXYAGiVmSfhjB3o7OPx0ZJuPXrDk5eu1_AOhQBODU3KpUqBRA9yMX54S_mvGijGubCNRcMLcm7wiYbyAG-3AkqSwoQZWluIE1vbmF0c2dlaGFsdBIGCKqs5vEFSi8KJwoggZC9pYXuXx2fv30G6B5p7BjhM3YQTP9Ut0V-t9PvcQ0QgNrECRDKyd3uAQ' + ]; + + /*public function setUp() { + parent::setUp(); + } +*/ + public function testWrongMethod() + { + $this->configRequest([ + 'headers' => ['Accept' => 'application/json'] + ]); + $this->get('/JsonRequestHandler'); + $this->assertResponseOk(); + + $expected = json_encode(['state' => 'error', 'msg' => 'no post']); + $this->assertEquals($expected, (string)$this->_response->getBody()); + } + + public function testInvalidJson() + { + $this->configRequest([ + 'headers' => ['Accept' => 'application/json'] + ]); + $this->post('/JsonRequestHandler', '{This isn\'t valid json}'); + $this->assertResponseOk(); + + $expected = json_encode(['state' => 'error', 'msg' => 'parameter error']); + $this->assertEquals($expected, (string)$this->_response->getBody()); + } + + public function testNotSetTransaction() + { + $this->postAndParse( + ['method' => 'putTransaction'], + ['state' => 'error', 'msg' => 'parameter error'] + ); + } + public function testNotSetMethod() + { + $this->postAndParse( + ['transaction' => $this->transactions['validCreation']], + ['state' => 'error', 'msg' => 'parameter error'] + ); + } + + public function testUnknownMethod() + { + //$this->post('/TransactionJsonRequestHandler', ['method' => 'putTransaction', 'transaction' => 'CgpIYWxsbyBXZWx0EgYIyfSG7gVKLwonCiCboKikqwjZfes9xuqgthFH3/cHHaWchkUhWiGhQjB23xCg2pMBELWJ7ZYK']); + $this->postAndParse( + ['method' => 'foobar', 'transaction' => $this->transactions['validCreation']], + ['state' => 'error', 'msg' => 'unknown method', 'details' => 'foobar'] + ); + + } + + public function testInvalidEncodedTransaction() { + //"msg":"error parsing transaction","details":[{"Transaction":"base64 decode error"}] + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['notBase64']], + ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [ + ['Transaction' => 'invalid base64 string'] + ]] + ); + } + + public function testInvalidTransaction() { + + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => base64_encode('Hallo Miau Welt')], + ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [ + ['Transaction' => 'Error occurred during parsing: Unexpected wire type.'] + ]] + ); + } + + public function testToLargeCreationSum() + { + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation900']], + '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}' + ); + } + + public function testToLargeCreation() + { + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation1200']], + '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}' + ); + } + + public function testValidTransfer() + { + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['validTransfer']], + ['state' => 'success'] + ); + } + + /*public function testMissingPreviousTransaction() + { + + }*/ + + public function testValidTransaction() + { + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation']], + ['state' => 'success'] + ); + } + + public function testValidCreation() + { + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['creationValid']], + ['state' => 'success'] + ); + } + + private function postAndParse($params, $expected) + { + //$this->enableCsrfToken(); + //$this->enableSecurityToken(); + + $token = 'my-csrf-token'; + $this->cookie('csrfToken', $token); + + $this->configRequest([ + 'headers' => ['Accept' => 'application/json', 'X-CSRF-Token' => $token] + ]); + + $this->disableErrorHandlerMiddleware(); + $this->post('/JsonRequestHandler', json_encode($params)); + + // Check that the response was a 200 + $this->assertResponseOk(); + + $responseBodyString = (string)$this->_response->getBody(); + $json = json_decode($responseBodyString); + $this->assertNotFalse($json); + + if(is_array($expected)) { + $expected = json_encode($expected); + } + $this->assertEquals($expected, $responseBodyString); + } +} diff --git a/community_server/tests/TestCase/Controller/PagesControllerTest.php b/community_server/tests/TestCase/Controller/PagesControllerTest.php new file mode 100644 index 000000000..35fe1a13b --- /dev/null +++ b/community_server/tests/TestCase/Controller/PagesControllerTest.php @@ -0,0 +1,97 @@ +get('/'); + $this->assertRedirect('account/'); + $this->get('/'); + $this->assertRedirect('account/'); + } + + /** + * testDisplay method + * + * @return void + */ + public function testDisplay() + { + $this->get('/pages/home'); + $this->assertResponseOk(); + $this->assertResponseContains('CakePHP'); + $this->assertResponseContains(''); + } + + /** + * Test that missing template renders 404 page in production + * + * @return void + */ + public function testMissingTemplate() + { + Configure::write('debug', false); + $this->get('/pages/not_existing'); + + $this->assertResponseError(); + $this->assertResponseContains('Error'); + } + + /** + * Test that missing template in debug mode renders missing_template error page + * + * @return void + */ + public function testMissingTemplateInDebug() + { + Configure::write('debug', true); + $this->get('/pages/not_existing'); + + $this->assertResponseFailure(); + $this->assertResponseContains('Missing Template'); + $this->assertResponseContains('Stacktrace'); + $this->assertResponseContains('not_existing.ctp'); + } + + /** + * Test directory traversal protection + * + * @return void + */ + public function testDirectoryTraversalProtection() + { + $this->get('/pages/../Layout/ajax'); + $this->assertResponseCode(403); + $this->assertResponseContains('Forbidden'); + } +} diff --git a/community_server/tests/TestCase/Controller/ProfilesControllerTest.php b/community_server/tests/TestCase/Controller/ProfilesControllerTest.php new file mode 100644 index 000000000..d87558e55 --- /dev/null +++ b/community_server/tests/TestCase/Controller/ProfilesControllerTest.php @@ -0,0 +1,76 @@ +markTestIncomplete('Not implemented yet.'); + } + + /** + * Test view method + * + * @return void + */ + public function testView() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test add method + * + * @return void + */ + public function testAdd() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test edit method + * + * @return void + */ + public function testEdit() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test delete method + * + * @return void + */ + public function testDelete() + { + $this->markTestIncomplete('Not implemented yet.'); + } +} diff --git a/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php new file mode 100644 index 000000000..cfa59d80b --- /dev/null +++ b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php @@ -0,0 +1,178 @@ +markTestIncomplete('Not implemented yet.'); + } + + /** + * Test index method + * + * @return void + */ + public function testIndex() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test overview method + * + * @return void + */ + public function testOverview() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test ajaxGetBalance method + * + * @return void + */ + public function testAjaxGetBalance() + { + $session_id = rand(); + $balance = rand(); + $this->session([ + 'session_id' => $session_id, + 'Transaction' => ['pending' => 0, 'executing' => 0], + 'StateUser' => [ + 'id' => 2, // 1 don't work, I don't know why + 'email_checked' => 1, + 'balance' => $balance + ] + ]); + //echo "balance: $balance"; + $this->getAndParse('/state-balances/ajaxGetBalance/' . $session_id, + ['state' => 'success', 'balance' => $balance] + ); + } + + /** + * Test ajaxListTransactions method + * + * @return void + */ + public function testAjaxListTransactions() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test overviewGdt method + * + * @return void + */ + public function testOverviewGdt() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test sortTransactions method + * + * @return void + */ + public function testSortTransactions() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test view method + * + * @return void + */ + public function testView() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test add method + * + * @return void + */ + public function testAdd() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test edit method + * + * @return void + */ + public function testEdit() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test delete method + * + * @return void + */ + public function testDelete() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + + private function getAndParse($path, $expected) + { + $this->configRequest([ + 'headers' => ['Accept' => 'application/json'] + ]); + + $this->disableErrorHandlerMiddleware(); + $this->get($path); + + // Check that the response was a 200 + $this->assertResponseOk(); + + $responseBodyString = (string)$this->_response->getBody(); + $json = json_decode($responseBodyString); + $this->assertNotFalse($json); + + if(is_array($expected)) { + $expected = json_encode($expected); + } + $this->assertEquals($expected, $responseBodyString); + } +} diff --git a/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php b/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php new file mode 100644 index 000000000..452af54fc --- /dev/null +++ b/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php @@ -0,0 +1,77 @@ +markTestIncomplete('Not implemented yet.'); + } + + /** + * Test view method + * + * @return void + */ + public function testView() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test add method + * + * @return void + */ + public function testAdd() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test edit method + * + * @return void + */ + public function testEdit() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test delete method + * + * @return void + */ + public function testDelete() + { + $this->markTestIncomplete('Not implemented yet.'); + } +} diff --git a/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php b/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php new file mode 100644 index 000000000..74c0e4b1e --- /dev/null +++ b/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php @@ -0,0 +1,97 @@ +markTestIncomplete('Not implemented yet.'); + } + + /** + * Test index method + * + * @return void + */ + public function testIndex() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test view method + * + * @return void + */ + public function testView() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test create method + * + * @return void + */ + public function testCreate() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test add method + * + * @return void + */ + public function testAdd() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test edit method + * + * @return void + */ + public function testEdit() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test delete method + * + * @return void + */ + public function testDelete() + { + $this->markTestIncomplete('Not implemented yet.'); + } +} diff --git a/community_server/tests/TestCase/Controller/TransactionJsonRequestHandlerControllerTest.php b/community_server/tests/TestCase/Controller/TransactionJsonRequestHandlerControllerTest.php new file mode 100644 index 000000000..7ad28760c --- /dev/null +++ b/community_server/tests/TestCase/Controller/TransactionJsonRequestHandlerControllerTest.php @@ -0,0 +1,174 @@ + 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQJ8wF12eZo3hcMAlAKKJ9WLT-zuSkNmGh7D98UEqH4KoIysnCkXqEya9EBZl9o11_nJ8xmm_nOevuVjR-GfLMQ8qSQoOSGFsbG8gV2VsdCAxMjMSBgiZm4ruBUovCicKIJSuE1uTzZ8zdStOVcQZA6P6oTp1u5C_1BHqHUoaXnEfEKDakwEQtYntlgo', + 'validCreation900' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQNVZ8Ae3Zbg3G0wZ840fzKan6N4KtTcSe0KYi17kQwFmsl18oFxXv8_s6j1xXFrIKjy1_1Olq0a7xYLErDMkjwYqORIGCNb5iu4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgNHKCBC1ie2WCg', + 'validCreation1200' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQEEey5QMAdldoOTP_jTETHgOQriGsixEY0cziQeRfT_J5YtbI_A6AizEYD-JcxmRmXzv1xjjTgsV39Y32ta2CQkqORIGCIeGi-4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgOy4CxC1ie2WCg', + 'notBase64' => 'CgpIYWxsbyBXZW-0EgYIyfSG7gV_LwonCiCboKikqwjZfes9xuqgthFH3', + 'validTransfer' => 'GmYKZAoggZC9pYXuXx2fv30G6B5p7BjhM3YQTP9Ut0V-t9PvcQ0SQDddHyKzAX3LBV0PuDiPc6lxkUipss5tyuLRpMtFJQnT30tsbYIkA1FXimjMKOoiuLswf4OLLV3bAIYehW-b9AgqYQoFSGFsbG8SBgiJlaPvBUJQCiYKIIGQvaWF7l8dn799BugeaewY4TN2EEz_VLdFfrfT73ENEICfSRImCiDtdleSLxhUgEbMW9DpqIwsykFj3-z_enKEOuGnXrmW8xCAn0k', + 'errornusTransfer' => 'ClxGcm9oZXMgTmV1ZXMgSmFociB1bmQgREFOS0UsIGRhc3MgZHUgZGljaCBzbyBlaW5zZXR6dCBmw7xyIEdyYWRpZG8hIEhlcnpsaWNoZSBHcsO8w59lIFRlcmVzYRIGCPjjgvEFQlAKJgogUQwFYeVlGlfWDrkXNN7rHwejoCDJKt+YkYJfbJVyj3EQwIQ9EiYKIPXIRnUhVJ/zCs5+y/VaTBjTIoYizJNwS+JC//xsbQrHEMCEPQ==' + ]; + + /*public function setUp() { + parent::setUp(); + } +*/ + public function testWrongMethod() + { + $this->configRequest([ + 'headers' => ['Accept' => 'application/json'] + ]); + $this->get('/TransactionJsonRequestHandler'); + $this->assertResponseOk(); + + $expected = json_encode(['state' => 'error', 'msg' => 'no post']); + $this->assertEquals($expected, (string)$this->_response->getBody()); + } + + public function testInvalidJson() + { + $this->configRequest([ + 'headers' => ['Accept' => 'application/json'] + ]); + $this->post('/TransactionJsonRequestHandler', '{This isn\'t valid json}'); + $this->assertResponseOk(); + + $expected = json_encode(['state' => 'error', 'msg' => 'parameter error']); + $this->assertEquals($expected, (string)$this->_response->getBody()); + } + + public function testNotSetTransaction() + { + $this->postAndParse( + ['method' => 'putTransaction'], + ['state' => 'error', 'msg' => 'parameter error'] + ); + } + public function testNotSetMethod() + { + $this->postAndParse( + ['transaction' => $this->transactions['validCreation']], + ['state' => 'error', 'msg' => 'parameter error'] + ); + } + + public function testUnknownMethod() + { + //$this->post('/TransactionJsonRequestHandler', ['method' => 'putTransaction', 'transaction' => 'CgpIYWxsbyBXZWx0EgYIyfSG7gVKLwonCiCboKikqwjZfes9xuqgthFH3/cHHaWchkUhWiGhQjB23xCg2pMBELWJ7ZYK']); + $this->postAndParse( + ['method' => 'foobar', 'transaction' => $this->transactions['validCreation']], + ['state' => 'error', 'msg' => 'unknown method', 'details' => 'foobar'] + ); + + } + + public function testInvalidEncodedTransaction() { + //"msg":"error parsing transaction","details":[{"Transaction":"base64 decode error"}] + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['notBase64']], + ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [ + ['Transaction' => 'invalid base64 string'] + ]] + ); + } + + public function testInvalidTransaction() { + + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => base64_encode('Hallo Miau Welt')], + ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [ + ['Transaction' => 'Error occurred during parsing: Unexpected wire type.'] + ]] + ); + } + + public function testToLargeCreationSum() + { + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation900']], + '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}' + ); + } + + public function testToLargeCreation() + { + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation1200']], + '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}' + ); + } + + public function testValidTransfer() + { + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['validTransfer']], + ['state' => 'success'] + ); + } + + /*public function testMissingPreviousTransaction() + { + + }*/ + + public function testValidTransaction() + { + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation']], + ['state' => 'success'] + ); + } + + private function postAndParse($params, $expected) + { + + $this->configRequest([ + 'headers' => ['Accept' => 'application/json'] + ]); + + $this->disableErrorHandlerMiddleware(); + $this->post('/TransactionJsonRequestHandler', json_encode($params)); + + // Check that the response was a 200 + $this->assertResponseOk(); + + $responseBodyString = (string)$this->_response->getBody(); + $json = json_decode($responseBodyString); + $this->assertNotFalse($json); + + if(is_array($expected)) { + $expected = json_encode($expected); + } + $this->assertEquals($expected, $responseBodyString); + } +} diff --git a/community_server/tests/TestCase/Model/Behavior/empty b/community_server/tests/TestCase/Model/Behavior/empty new file mode 100644 index 000000000..e69de29bb diff --git a/community_server/tests/TestCase/Model/Table/AdminErrorsTableTest.php b/community_server/tests/TestCase/Model/Table/AdminErrorsTableTest.php new file mode 100644 index 000000000..09d7a35fb --- /dev/null +++ b/community_server/tests/TestCase/Model/Table/AdminErrorsTableTest.php @@ -0,0 +1,83 @@ +exists('AdminErrors') ? [] : ['className' => AdminErrorsTable::class]; + $this->AdminErrors = TableRegistry::getTableLocator()->get('AdminErrors', $config); + } + + /** + * tearDown method + * + * @return void + */ + public function tearDown() + { + unset($this->AdminErrors); + + parent::tearDown(); + } + + /** + * Test initialize method + * + * @return void + */ + public function testInitialize() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test validationDefault method + * + * @return void + */ + public function testValidationDefault() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test buildRules method + * + * @return void + */ + public function testBuildRules() + { + $this->markTestIncomplete('Not implemented yet.'); + } +} diff --git a/community_server/tests/TestCase/Model/Table/CommunityProfilesTableTest.php b/community_server/tests/TestCase/Model/Table/CommunityProfilesTableTest.php new file mode 100644 index 000000000..0d7e5fba2 --- /dev/null +++ b/community_server/tests/TestCase/Model/Table/CommunityProfilesTableTest.php @@ -0,0 +1,72 @@ +exists('CommunityProfiles') ? [] : ['className' => CommunityProfilesTable::class]; + $this->CommunityProfiles = TableRegistry::getTableLocator()->get('CommunityProfiles', $config); + } + + /** + * tearDown method + * + * @return void + */ + public function tearDown() + { + unset($this->CommunityProfiles); + + parent::tearDown(); + } + + /** + * Test initialize method + * + * @return void + */ + public function testInitialize() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test validationDefault method + * + * @return void + */ + public function testValidationDefault() + { + $this->markTestIncomplete('Not implemented yet.'); + } +} diff --git a/community_server/tests/TestCase/Model/Table/StateErrorsTableTest.php b/community_server/tests/TestCase/Model/Table/StateErrorsTableTest.php new file mode 100644 index 000000000..21cbe6128 --- /dev/null +++ b/community_server/tests/TestCase/Model/Table/StateErrorsTableTest.php @@ -0,0 +1,84 @@ +exists('StateErrors') ? [] : ['className' => StateErrorsTable::class]; + $this->StateErrors = TableRegistry::getTableLocator()->get('StateErrors', $config); + } + + /** + * tearDown method + * + * @return void + */ + public function tearDown() + { + unset($this->StateErrors); + + parent::tearDown(); + } + + /** + * Test initialize method + * + * @return void + */ + public function testInitialize() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test validationDefault method + * + * @return void + */ + public function testValidationDefault() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test buildRules method + * + * @return void + */ + public function testBuildRules() + { + $this->markTestIncomplete('Not implemented yet.'); + } +} diff --git a/community_server/tests/TestCase/Model/Table/StateUsersTableTest.php b/community_server/tests/TestCase/Model/Table/StateUsersTableTest.php new file mode 100644 index 000000000..49deb1166 --- /dev/null +++ b/community_server/tests/TestCase/Model/Table/StateUsersTableTest.php @@ -0,0 +1,97 @@ +exists('StateUsers') ? [] : ['className' => StateUsersTable::class]; + $this->StateUsersTable = TableRegistry::getTableLocator()->get('StateUsers', $config); + } + + /** + * tearDown method + * + * @return void + */ + public function tearDown() + { + unset($this->StateUsersTable); + + parent::tearDown(); + } + + /** + * Test initialize method + * + * @return void + */ + public function testInitialize() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test validationDefault method + * + * @return void + */ + public function testValidationDefault() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test buildRules method + * + * @return void + */ + public function testBuildRules() + { + $this->markTestIncomplete('Not implemented yet.'); + } + + /** + * Test getReceiverProposal method + * + * @return void + */ + public function testGetReceiverProposal() + { + $this->markTestIncomplete('Not implemented yet.'); + } +} diff --git a/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php b/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php new file mode 100644 index 000000000..60a6307ed --- /dev/null +++ b/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php @@ -0,0 +1,113 @@ + 97, + "b" => 98, + "c" => 99, + "d" => 100, + "aa" => 12513, + "ab" => 12514, + "@" => 64, + ".d" => 5988, + "gmx" => 1701624, + "@gmx" => 135919352, + "@gmx.de" => 3742152099, + "***REMOVED***" => 2928827813, + "***REMOVED***" => 1899591683, + "***REMOVED***" => 2089074830, + "maximilian.muster@gradido.net" => 793144931, + "coin-info5@gradido.net" => 1829129963, + "coin-info6@gradido.net" => 1830178539, + "coin-info8@gradido.net" => 1832275691, + "coin-info9@gradido.net" => 1833324267, + "coin-info10@gradido.net" => 3877298078, + "coin-info11@gradido.net" => 3878346654, + "coin-info12@gradido.net" => 3879395230, + "***REMOVED***" => 2089074830, + "***REMOVED***" => 3996757473, + "***REMOVED***" => 3788634614, + "***REMOVED***" => 807797884, + "***REMOVED***" => 1640973721, + "***REMOVED***" => 2025729173, + "***REMOVED***" => 1961122507, + "***REMOVED***" => 362466358, + "***REMOVED***" => 3796728871, + "***REMOVED***" => 807797884, + "***REMOVED***" => 3794905967, + "***REMOVED***" => 3077694284, + "***REMOVED***" => 3246159770, + "***REMOVED***" => 3123402690, + "testneu-11-12-3@gradido.net" => 4092403827, + "***REMOVED***" => 3151414199, + "***REMOVED***" => 3526188273, + "***REMOVED***" => 966804823, + "***REMOVED***" => 1309273258, + "***REMOVED***" => 995978784, + "***REMOVED***" => 310113324, + "***REMOVED***" => 1309273258, + "***REMOVED***" => 530108573, + "***REMOVED***" => 1734855679, + "***REMOVED***" => 767779182, + "***REMOVED***" => 2247491519, + "***REMOVED***" => 3248626267, + "***REMOVED***" => 3516649930, + "***REMOVED***" => 231214190, + "***REMOVED***" => 4247461928, + "***REMOVED***" => 324829839, + "***REMOVED***" => 3046147747, + "***REMOVED***" => 3207307415, + "***REMOVED***" => 728893500, + "***REMOVED***" => 3905254663, + "***REMOVED***" => 3207307415, + "***REMOVED***" => 1155733239, + "***REMOVED***" => 2013046423, + "***REMOVED***" => 4033835283, + "***REMOVED***" => 1945541625, + "***REMOVED***" => 2310715309, + "***REMOVED***" => 1221362064, + "***REMOVED***" => 4161339877 + ]; + foreach($pairs as $email => $cpp_hash) { + $php_hash = TransactionCreation::DRMakeStringHash($email); + // assertEquals(mixed $expected, mixed $actual[, string $message = '']) + if($php_hash != $cpp_hash) { + $this->assertEquals($cpp_hash, $php_hash, "hashes for $email don't match"); + } + } + } + + +} diff --git a/community_server/tests/TestCase/View/Helper/empty b/community_server/tests/TestCase/View/Helper/empty new file mode 100644 index 000000000..e69de29bb diff --git a/community_server/tests/bootstrap.php b/community_server/tests/bootstrap.php new file mode 100644 index 000000000..0ca191e4a --- /dev/null +++ b/community_server/tests/bootstrap.php @@ -0,0 +1,12 @@ + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/community_server/webroot/css/grd_styles.css b/community_server/webroot/css/grd_styles.css new file mode 100644 index 000000000..08ecdc3a5 --- /dev/null +++ b/community_server/webroot/css/grd_styles.css @@ -0,0 +1,1781 @@ +/* ============================================================ + + Grid Layout Page + + Datei : layout.less + Datum : 2020-04-30 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +/*==================================== += BREAK POINTS = +====================================*/ +/* https://scotch.io/courses/getting-started-with-less/responsive-and-media-queries */ +/* GRID */ +.layout { + display: grid; + grid-template-rows: [top] 8vh [line2] 86vh [footer1] 3vh [footer2] 5vh [end]; + grid-template-columns: [left1] auto [left2] 1fr [left3] 12fr [right3] 1fr [right2] auto [right1]; + grid-template-areas: "header header header header header" "left . center center ." "footer footer footer footer footer" "bottom bottom bottom bottom bottom"; + margin: 0; + padding: 0; +} +@media (max-width:1199px) { + .layout { + grid-template-areas: "header header header header header" "left . center center center" "footer footer footer footer footer" "bottom bottom bottom bottom bottom"; + } +} +@media (max-width:767px) { + .layout { + position: relative; + display: grid; + grid-template-rows: [top] 12vh [line2] 80vh [footer1] 3vh [footer2] 8vh [end]; + grid-template-columns: [left1] 100vw [right1]; + grid-template-areas: "header" "center" "footer" "bottom"; + margin: 0; + padding: 0; + } +} +.header-notify { + grid-area: header; + grid-column-start: right3; + grid-column-end: right2; +} +.header-user { + grid-area: header; + grid-column-start: right2; + grid-column-end: right1; +} +.sidebar1 { + grid-area: left; + grid-row-start: top; + grid-row-end: end; +} +@media (max-width:767px) { + .sidebar1 { + position: relative; + grid-area: header; + z-index: 2; + top: -300px; + right: 0px; + } + .header-user, + .header-notify { + grid-area: header; + } +} +.center-form-single, +.content { + grid-area: center; + grid-row-start: line2; + grid-row-end: footer1; +} +.footer { + grid-area: footer; + grid-row-start: footer1; + grid-row-end: footer2; +} +.nav-bottom { + grid-area: bottom; + grid-row-start: footer2; + grid-row-end: end; +} +/* ============================================================ + + Generic Color Definitions + + Vars and some generic CSS rules. + + Datei : colors.less + Datum : 2020-05-26 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +/* MAIN */ +/* MENU */ +/* CONTENT */ +/* CONTENT-NAV */ +/* CONTENT-ITEMS */ +/* CONTENT-TABLE */ +/* FORMS */ +/* VARIOUS INDIVIDUAL */ +/* XXX TODO XXX */ +/*rgba(0, 0, 0, 0.5) ??? */ +/* NOTIFICATION */ +/* https://www.w3schools.com/colors/colors_shades.asp */ +.info-color { + color: grey; +} +.success-color { + color: #047006; +} +.alert-color { + color: #ff5f66; +} +.orange-color { + color: #ffa600; +} +.blue-color { + color: blue; +} +.unobtrusive { + color: grey; +} +.info-icon { + color: grey; + background-color: #80808026; +} +.success-icon { + color: #047006; + background-color: rgba(4, 112, 6, 0.2); +} +.alert-icon { + color: #ff5f66; + background-color: #ff5f662e; +} +/* ======================= + Gradido + =======================*/ +/* Gradido */ +.grd-negative-currency { + color: red; +} +/* Gradido Transform */ +.gdt-text-color { + color: #a27824; +} +.grd_clickable { + cursor: pointer; +} +/* ============================================================ + + Typography Definitions + + Datei : typography.less + Datum : 2020-05-26 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +.small-font { + font-size: 0.75em; + font-weight: 300; +} +/* ============================================================ + + Basic screen styles. + + Datei : screen.less + Datum : 2020-04-30 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@font-face { + font-family: 'Material Icons Outlined'; + font-style: normal; + font-weight: 400; + src: url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.eot); + /* For IE6-8 */ + src: local('Material Icons Outlined'), local('Material-Icons-Outlined'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2) format('woff2'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.woff) format('woff'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf) format('truetype'); +} +.material-icons-outlined { + font-family: 'Material Icons Outlined'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + vertical-align: middle; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; +} +@media screen { + /* ======================= + Basis + =======================*/ + html, + body { + font-family: 'Roboto', sans-serif; + font-size: 100%; + line-height: 27px; + color: #212529; + background-color: #f9fafb; + margin: 0; + overflow: auto; + } + div { + border-collapse: collapse; + box-sizing: border-box; + } + /* ======================= + Kopfbereich + =======================*/ + .header { + display: flex; + justify-content: space-between; + align-items: center; + flex: flex-grow; + width: 100%; + padding: 1em; + background-color: #fff; + } + /* ======================= + Fußbereich + =======================*/ + .footer { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + font-size: 70%; + font-style: italic; + line-height: 0; + } + .bottomright { + position: fixed; + bottom: 0; + right: 0; + color: grey; + font-size: smaller; + line-height: 0.125em; + padding-right: 0.25em; + text-align: right; + } + .bottomleft { + position: fixed; + bottom: 0; + left: 0; + color: grey; + font-size: smaller; + line-height: 1.125em; + padding-left: 0.25em; + } + /* ======================= + Sonstige + =======================*/ + /* Hyperlinks */ + a { + text-decoration: none; + color: inherit; + } + main a { + text-decoration: underline; + font-style: italic; + } + a:link, + a:visited { + color: inherit; + } + a:hover, + a:focus { + text-decoration: underline; + } + a:active { + background-color: #fff; + color: #000; + } + a:focus, + a:active { + outline: none; + } + a.grd_invisible_link { + color: #000; + text-decoration: none; + } + a.grd_invisible_link:hover { + color: grey; + } + [type=button]:not(:disabled), + [type=reset]:not(:disabled), + [type=submit]:not(:disabled), + button:not(:disabled) { + cursor: pointer; + } +} +@media screen and (max-width:767px) { + .bottomright { + font-size: 0.7em; + font-weight: 300; + line-height: 1em; + width: 100px; + } + .bottomright p { + margin-block-start: 0; + margin-block-end: 2px; + margin-inline-start: 0; + margin-inline-end: 0; + } +} +/* Ende @media screen */ +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* ============================================================ + + Screen styles for flash messages. + + Datei : messages.css + Datum : 30.10.2019, 16:04:16 + Autor : einhornimmond, Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + .flash-messages { + width: 30%; + position: absolute; + top: 57px; + left: 241px; + text-align: center; + } + .flash-messages .alert { + margin: 0; + padding: 1em; + vertical-align: middle; + border-radius: 5px; + } + .flash-messages .alert-success { + color: #1A1A1A !important; + background-color: #06c50a; + border: 1px solid #04700675; + } + .flash-messages .alert-error { + color: #fff !important; + background-color: red; + border: 1px solid rgba(255, 0, 0, 0.5); + } + .flash-messages .message { + padding: 5px; + } + .flash-messages .success { + color: #047006; + } + .flash-messages .error { + color: red; + } + .flash-messages.hidden { + display: none; + } + /* messages, update flash */ + .grd-error { + color: red; + border: 1px solid rgba(255, 0, 0, 0.5); + padding: 5px; + } + .grd-info { + border: 1px dotted gray; + padding: 5px; + } + .grd-success { + padding: 5px; + color: #047006; + } +} +@media screen and (max-width:767px) { + .flash-messages { + width: 90%; + top: 0; + left: 0; + text-align: center; + } +} +/* ============================================================ + + User Menu + + Datei : user.less + Datum : 2020-07-03 + Autor : Christine Slotty + Copyright : Gradido + + ============================================================*/ +@media screen { + .header-user { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-end; + align-content: flex-end; + position: relative; + width: 100%; + min-width: 12em; + height: 40px; + background-color: #fff; + border: 1px solid #f2f4f5; + border-radius: 0 0 0 18px; + } + .user-menu-container { + display: flex; + justify-content: flex-end; + align-items: center; + font-size: 0.8em; + font-weight: 300; + padding: 0.25em 0.5em; + z-index: 20; + height: 40px; + } + .user-name, + .user-icon { + display: inline-block; + vertical-align: middle; + cursor: pointer; + } + .user-name { + padding-right: 0.25em; + } + .nav-vertical.user-menu { + display: none; + background-color: #fff; + border-left: 1px solid #f2f4f5; + border-bottom: 1px solid #f2f4f5; + border-radius: 0 0 16px 16px; + z-index: 15; + font-size: 0.9em; + margin-top: 0 !important; + position: fixed; + top: 39px; + right: 0; + } + .nav-vertical.user-menu.visible { + display: inherit; + } + .nav-vertical.user-menu > ul { + padding: 2em; + padding-top: 0.5em; + padding-bottom: 1em; + margin-block-end: 0; + margin-block-start: 0; + } + .nav-vertical.user-menu li { + padding: 0.0125em; + } + .nav-top > ul { + padding: 0; + padding-right: 2em; + } + .material-icons-outlined.user-info { + color: grey; + } + .material-icons-outlined.user-info.success { + color: #047006; + } +} +@media screen and (max-width:767px) { + .header-user { + position: relative; + min-width: 3em; + background-color: transparent; + justify-content: center; + height: 100%; + margin-top: -13px; + margin-left: -16px; + color: #047006; + } + .user-menu-container { + margin: 0; + padding: 0; + } + .user-name { + display: none; + } + .nav-vertical { + margin-top: 55px; + } + .nav-vertical.user-menu { + position: fixed; + top: 1px; + right: 0; + margin-top: 0; + } + .nav-vertical.user-menu > ul { + padding: 1em 1em; + padding-top: 3em; + } +} +/* ============================================================ + + Navigation + + Datei : navi.less + Datum : 2020-04-30 + Autor : einhornimmond / Christine Slotty + Copyright : Gradido + + ============================================================*/ +@media screen { + .logo { + display: none; + vertical-align: middle; + height: 30px; + padding: 0.5em; + } + .logo.big.visible, + .logo.small.visible { + display: block !important; + } + .logo.mobile { + display: none; + } + .logo.small.visible { + padding-left: 41px; + } + /* + SIDEBARS + */ + .sidebar1 { + background-color: #fff; + font-size: 0.8em; + font-weight: 500; + line-height: 2.5em; + padding: 0; + border-right: 1px solid #f2f4f5; + } + .sidebar2 { + padding: 1em; + background-color: #f9fafb; + } + .sidebar1-header { + font-size: 0.75em; + font-style: italic; + color: grey; + } + /* set general icons size here! */ + .nav-icon { + font-size: 18px !important; + color: #4F4F4F; + vertical-align: middle; + padding-right: 1em; + } + /* important! order matters! we need to overwrite the main button's size here */ + .nav-main-button { + font-size: 32px !important; + color: grey; + margin: 0.3em; + } + /* Hide mobile menu button! */ + .nav-main-button.mobile { + display: none; + } + .nav-menu.nav-menu-maximized { + width: 280px; + height: 100%; + } + .nav-menu.nav-menu-minimized { + width: 120px; + height: 100%; + } + .nav-menu-maximized { + -webkit-animation: slide-out 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; + animation: slide-out 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; + } + .nav-menu-minimized { + -webkit-animation: slide-in 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; + animation: slide-in 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; + } + .nav-menu-minimized .link-title { + display: none; + } + .nav-menu-minimized .nav-icon, + .nav-menu-minimized .nav-main-button { + padding-left: 72px; + } + /** + * ---------------------------------------- + * animations slide-in / slide-out + * ---------------------------------------- + */ + /* slide-in */ + @-webkit-keyframes slide-in { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 0; + } + 100% { + -webkit-transform: translateX(-74px); + transform: translateX(-74px); + opacity: 1; + } + } + @keyframes slide-in { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 0; + } + 100% { + -webkit-transform: translateX(-74px); + transform: translateX(-74px); + opacity: 1; + } + } + /* slide-out */ + @-webkit-keyframes slide-out { + 0% { + -webkit-transform: translateX(-74px); + transform: translateX(-74px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + } + @keyframes slide-out { + 0% { + -webkit-transform: translateX(-74px); + transform: translateX(-74px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + } + /* + NAVI MOBILE + */ + /* END navi mobile base */ + .selected { + color: #047006; + } + .link-title { + vertical-align: middle; + line-height: normal; + background-color: transparent; + } + .nav-horizontal { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-items: flex-end; + list-style-type: none; + gap: 5%; + padding: 1em; + } + .footer .nav-horizontal { + gap: 0; + padding: 0 1em; + padding-inline-start: 0 !important; + } + .nav-top-smaller { + margin: 0; + padding: 0; + } + .nav-smaller { + justify-content: left; + align-items: flex-start; + gap: 0; + padding: 0; + } + .nav-smaller li { + padding: 0 !important; + padding: 0.2em 0.5em !important; + border: 1px solid #047006; + margin: 0.1em 0.3em; + border-radius: 12px; + } + .nav-smaller .heading { + font-weight: bold; + } + .nav-vertical { + margin-top: -2em; + } + .nav-horizontal li { + padding: 0.5em; + } + .nav-vertical > ul { + display: flex; + flex-direction: column; + list-style-type: none; + gap: 5%; + padding: 1em; + } + .nav-vertical li { + padding: 0.5em; + } + .nav-top > ul { + padding: 0; + padding-right: 2em; + } + .nav-bottom { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + list-style-type: none; + margin-bottom: 20px; + } + .nav-bottom p { + font-size: 0.9em; + color: grey; + margin: 0; + } + nav.grd-left-bar { + position: fixed; + top: 80.5px; + } + nav .grd-nav-bn { + width: 100px; + } + nav ul { + margin-top: 0; + padding-left: 0; + } + /* buttons */ + .grd-nav-bn:hover, + .grd-active { + background-color: lightgray; + border-color: #000; + } + .grd-nav-bn { + padding: 10px; + border: 1px solid grey; + display: table-cell; + text-align: center; + vertical-align: middle; + color: grey; + } + .grd-nav-bn-large { + width: 40vw; + height: 18vh; + font-size: 35px; + } + a.grd-nav-bn, + a.grd-nav-bn:visited { + color: #000; + text-decoration: none; + } +} +@media screen and (max-width:767px) { + .logo.big, + .logo.small { + display: none; + } + .logo.visible { + padding: 0 !important; + } + .logo, + .logo.mobile, + .logo.mobile.visible { + display: block; + position: fixed; + top: 12px; + left: 12px; + } + .logo.big, + .logo.big.visible { + display: none !important; + } + .nav-main-button { + display: none; + } + .nav-main-button.mobile { + display: block; + position: fixed; + top: 2px; + right: 46px; + z-index: 3; + } + .nav-menu.nav-menu-minimized, + .nav-menu.nav-menu-maximized { + width: 280px; + height: 300px; + } + .nav-menu-minimized .nav-icon, + .nav-menu-minimized .nav-main-button { + padding-left: 0; + } + .nav-menu-maximized { + -webkit-animation: slide-down 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; + animation: slide-down 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; + } + .nav-menu-minimized { + -webkit-animation: slide-up 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; + animation: slide-up 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; + } + @-webkit-keyframes slide-down { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 0; + } + 100% { + -webkit-transform: translateY(300px); + transform: translateX(300px); + opacity: 1; + } + } + @keyframes slide-down { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 0; + } + 100% { + -webkit-transform: translateY(300px); + transform: translateY(300px); + opacity: 1; + } + } + @-webkit-keyframes slide-up { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + -webkit-transform: translateY(-300px); + transform: translateY(-300px); + } + } + @keyframes slide-up { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + -webkit-transform: translateY(-300px); + transform: translateY(-300px); + } + } +} +@media screen and (max-width:767px) { + .nav-vertical { + margin-top: 55px; + } +} +@media screen and (max-width:767px) { + .nav-bottom p { + font-size: 0.8em; + margin-top: -10px; + } +} +/* ============================================================ + + Notification + + Datei : notification.css + Datum : 2020-06-10 + Autor : Christine Slotty + Copyright : Gradido + + ============================================================*/ +@media screen { + .header-notify { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; + z-index: 10; + } + .notify { + display: block; + padding: 0.5rem 0.3rem; + color: #525c5d; + animation: blinkingNotifySymbol 1.2s infinite; + } + .notify-alert { + color: #ff5f66; + animation: blinkingAlertSymbol 1.2s infinite; + } + @keyframes blinkingNotifySymbol { + 0% { + color: #525c5d; + } + 49% { + color: #525c5d; + } + 60% { + color: #525c5d82; + } + 99% { + color: #525c5d82; + } + 100% { + color: #525c5d; + } + } + @keyframes blinkingAlertSymbol { + 0% { + color: #ff5f66; + } + 49% { + color: #ff5f66; + } + 60% { + color: #ff5f669e; + } + 99% { + color: #ff5f669e; + } + 100% { + color: #ff5f66; + } + } + /* + .notification-indicator-primary { + background: #047006; + } + + .notification-indicator-warning { + background: #f0825f + } + .notification-indicator-secondary { + background: grey + } + + .notification-indicator-secondary:before { + content: ""; + background: rgba(128, 128, 128, .5) + } + + .notification-indicator-success { + background: #00e093 + } + + .notification-indicator-success:before { + content: ""; + background: rgba(0, 224, 147, .5) + } + + .notification-indicator-info { + background: #6c61f6 + } + + .notification-indicator-info:before { + content: ""; + background: rgba(108, 97, 246, .5) + } + + + .notification-indicator-danger { + background: #ff5f66 + } + + .notification-indicator-danger:before { + content: ""; + background: rgba(255, 95, 102, .5) + } + + .notification-indicator-light { + background: #dfdfdf + } + + .notification-indicator-light:before { + content: ""; + background: rgba(223, 223, 223, .5) + } + + .notification-indicator-dark { + background: #74767b + } + + .notification-indicator-dark:before { + content: ""; + background: rgba(116, 118, 123, .5) + } + + .notification-indicator-white { + background: #fff + } + + .notification-indicator-white:before { + content: ""; + background: rgba(255, 255, 255, .5) + } + */ +} +@media screen and (max-width:767px) { + .header-notify { + justify-content: flex-end; + margin-right: 93px; + margin-top: 8px; + } +} +/* ============================================================ + + Screen styles for the regular center part. + + Datei : center.css + Datum : 2020-04-30 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + /* ========= + CONTENT + =========*/ + .content-default { + display: flex; + justify-content: center; + max-width: 90%; + } + .content { + display: flex; + justify-content: flex-start; + flex-direction: column; + overflow: auto; + width: 100%; + background-color: #f9fafb; + line-height: 1.75em; + letter-spacing: 0.03rem; + font-family: Roboto, sans-serif; + font-weight: 500; + font-size: 1rem; + padding-right: 5em; + } + /* Center Navigation Top */ + .nav-content { + position: relative; + color: #565656; + margin: 0 0.25em; + } + .nav-content-list { + display: flex; + list-style-type: none; + padding: 0; + margin-left: 0.25em; + } + .nav-content-separator { + margin: 0 1em; + } + /* Center Content Container */ + .content-container { + background-color: #fff; + color: #212529; + border-radius: 0.5em; + box-shadow: 0 0 10px 0 rgba(183, 192, 206, 0.2); + border: 1px solid rgba(238, 238, 238, 0.75); + margin: 1em 0.25em; + } + /* Block Container Above Main */ + .block-container { + width: 100%; + display: flex; + } + /* Top Info Above Main */ + .info-container { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 70%; + padding: 1em 25px; + } + /* Main Container */ + .main-container { + width: 100%; + } + .default-container { + width: 90%; + margin: auto; + padding: 1em; + } + /* Content Block */ + .content-block { + width: 170px; + padding: 20px 25px 20px; + border: 1px dashed grey; + border-radius: 16px; + margin: 1em; + display: flex; + flex-direction: column; + justify-content: center; + justify-items: center; + align-items: center; + } + .block-img { + width: 40px; + height: 40px; + line-height: 20px; + font-size: 24px; + padding: 8px; + border-radius: 20px; + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2); + overflow: hidden; + border-style: none; + box-sizing: border-box; + } + /* Generic Content */ + .content-region h3 { + color: #21252969; + } + .content-region { + border-bottom: 1px dashed #F5F5F5; + padding: 0 25px; + padding-bottom: 2em; + margin: 1em 0.25em; + } + .content-collection { + display: flex; + } + .content-item { + margin: 0.5em 0; + margin-right: 5em; + width: 220px; + padding: 1em 2em; + } + .action-button { + background: #f9fafb; + border-left: 3px solid #047006; + } + .info-item { + border-left: 2px solid grey; + } + .inline-header { + display: inline; + } + .show-profile-img { + display: block; + height: 100px; + vertical-align: middle; + border-radius: 10px; + border: 2px dotted #80808026; + } + /* OTHER */ + .info-item i, + .info-item-link, + .action-button i, + .action-button-link { + vertical-align: middle; + } +} +@media screen and (max-width:767px) { + .content { + padding-right: 0; + } +} +@media screen and (max-width:767px) { + .nav-content-list { + display: flex; + font-size: small; + margin-bottom: 0; + justify-content: center; + } +} +@media screen and (max-width:1199px) { + .info-container { + flex-direction: column; + max-width: 90%; + line-height: 0.25em; + } +} +@media screen and (max-width:767px) { + .main-container { + max-width: 97%; + } +} +@media screen and (max-width:767px) { + .content-region { + padding-left: 5px; + } + .content-collection { + flex-direction: column; + align-items: center; + } + .content-item { + margin: 0.5em 0; + margin-right: 0; + width: 160px; + padding: 1em 2em; + } +} +/* Ende @media screen */ +/* ============================================================ + + Screen styles for the simple center form. (login etc) + + Datei : center-form-single.css + Datum : 2020-07-10 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + .center-form-single { + width: 50%; + margin: auto; + } + .center-form-header { + margin-bottom: 50px; + } + .center-logo { + display: block; + margin: 0 auto; + width: 280px; + } + .center-logo img { + width: 100%; + vertical-align: middle; + border-style: none; + } + .center-form-container { + display: flex; + flex-direction: column; + padding: 2em 8em; + background-color: #fff; + border-radius: 6px; + box-shadow: 0 0 10px 0 rgba(183, 192, 206, 0.2); + margin-bottom: 1.5rem; + border: 1px solid rgba(238, 238, 238, 0.75); + } + .center-form-title h1 { + margin-block-start: 0; + } + .center-form-selectors { + display: flex; + justify-content: flex-end; + align-items: center; + height: 38px; + padding: 5px 0; + margin-bottom: 2em; + } + .center-form-form, + .center-form-form form { + display: flex; + flex-direction: column; + } + .center-form-form .form-label { + text-align: left; + } + .center-form-form .form-control { + width: 100%; + margin: auto; + box-sizing: border-box; + margin-bottom: 0.5em; + } + .center-form-submit { + width: 100%; + margin: 1em 0; + } + .reset-pwd-link, + .signup-link { + padding: 0 20px; + } + .reset-pwd-link a, + .signup-link a { + color: #047006; + } + .reset-pwd-link p, + .signup-link p { + display: inline-block; + margin-block-start: 0; + margin-block-end: 0; + } + .center-bottom { + color: grey; + text-align: center; + padding-top: 30px; + } + .flag-btn { + text-align: center; + vertical-align: middle; + padding: 3px 11px; + } + .flag { + display: block; + } + .flag-germany { + background: red; + border-top: 9px solid #000; + border-bottom: 9px solid #fc0; + width: 40px; + height: 10px; + } + .flag-england { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==); + background-size: cover; + width: 40px; + height: 28px; + } + .group { + padding-left: 10px; + padding-top: 10px; + padding-bottom: 10px; + } + .group-is-invalid { + background-color: rgba(240, 130, 95, 0.2); + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); + } + .group-is-invalid .radio label .input-frame::before { + border-color: red; + } +} +@media screen and (max-width:767px) { + .center-form-header { + margin-bottom: 30px; + margin-top: -50px; + } + .center-form-single { + width: 97%; + margin: auto; + } + .center-form-container { + padding: 1em 0.5em; + } +} +/* Ende @media screen */ +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* ============================================================ + + Screen styles for plain facts. + + Datei : facts.css + Datum : 08.07.2020 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + .fact-list { + display: flex; + flex-direction: column; + list-style-type: none; + width: 100%; + padding-inline-start: 0; + font-weight: 300; + } + .fact { + display: inline-block; + padding-left: 1em; + } + .label { + width: 150px; + text-align: right; + font-weight: bold; + } +} +@media screen and (max-width:767px) { + .fact-list { + margin-block-start: 0; + margin-block-end: 0; + } + li.fact { + display: flex; + flex-direction: column; + } + .fact { + padding-left: 0.5em; + } + .label { + width: 250px; + text-align: left; + font-size: 0.9em; + font-weight: normal; + } +} +/* ============================================================ + + Screen styles for lists. + + Datei : list.css + Datum : 2020-06-09 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + /* ========= + LISTS + =========*/ + /* List Content */ + .content-list { + width: 100%; + } + .content-list-title { + font-size: 1rem; + margin: 0; + padding: 20px 25px; + color: #313131; + } + .content-list-table { + display: flex; + flex-direction: column; + width: 100%; + overflow: auto; + font-size: 16px; + color: #212529; + } + .row { + display: flex; + width: 100%; + border-top: 1px solid #f2f4f9; + -webkit-transition-duration: 0.5s; + transition-duration: 0.5s; + } + .row:hover { + background-color: #f6f7f9; + } + .cell { + display: flex; + flex-wrap: wrap; + align-items: center; + padding: 1em 1.5em; + } + .cell-dense { + padding: 0.1em 0.5em; + } + .centered { + justify-content: center; + } + .c0 { + flex-grow: 5; + min-width: 20%; + } + .c1 { + min-width: 40px; + flex: 0 0 40px; + } + .c2 { + min-width: 80px; + flex: 0 0 80px; + } + .c3 { + min-width: 160px; + flex: 0 0 160px; + } + .c4 { + min-width: 240px; + flex: 0 0 240px; + } + .c5 { + min-width: 320px; + flex: 0 0 320px; + } + .c6 { + min-width: 400px; + flex: 0 0 400px; + } + .header-cell { + border-top: 1px solid #f2f4f9; + background-color: #fafafa; + color: #101010; + } + .content-list-table img, + .content-list-table i { + vertical-align: middle; + } + .content-list-table > span { + font-size: 0.8em; + padding: 0.5em 2em; + vertical-align: middle; + } + /* Individual Tables XXX rm!! */ + .error-list { + grid-template-columns: 2fr 2fr 5fr 1fr; + } + .transactions { + grid-template-columns: 1fr 4fr 2fr 2fr; + } + .profile-img { + width: 30px; + height: 30px; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2); + overflow: hidden; + border-style: none; + box-sizing: border-box; + margin-right: 40px; + } + .tx-email { + cursor: pointer; + display: block; + color: #101010; + font-weight: 400; + } + .small { + font-size: 80%; + font-weight: 400; + } + /*, + .cell-icon .material-icons-outlined */ + .cell-icon { + /*noch ungeklärt - icon ist nicht aligned */ + /*font-size: 1.25em;*/ + vertical-align: middle; + } + /* ===================================== + FORM TOP CONTENT (checkTransaction) + =====================================*/ + .form-content { + padding: 35px; + padding-top: 20px; + max-width: 80%; + margin: auto; + } + .content-table { + border: 1px solid #f2f4f9; + border-top: none; + margin-bottom: 1.5rem; + } + .content-row { + display: flex; + justify-content: space-between; + font-weight: 400; + border-top: 1px solid #f2f4f9; + } + .content-row-header { + font-weight: 500; + color: #101010; + } + .content-row-bg { + background-color: #f0f2f5; + } + .content-cell { + display: block; + border-collapse: collapse; + padding: 10px 15px; + } + .form-button .material-icons-outlined { + font-size: 1.25em; + } +} +@media screen and (max-width:767px) { + .row { + flex-direction: column; + } +} +@media screen and (max-width:767px) { + .cell { + padding: 0.25em 1.5em; + } + .c1 { + flex-basis: auto; + } + .c2 { + flex-basis: auto; + } + .c3 { + flex-basis: auto; + } + .c4 { + flex-basis: auto; + } + .c5 { + flex-basis: auto; + } + .c6 { + flex-basis: auto; + } +} +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* ============================================================ + + Screen styles for forms. + + Datei : form.css + Datum : 2020-06-07 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + /* ========= + FORMS + =========*/ + /* Form Content */ + .action-form { + width: 100%; + } + .form-header { + border-left: 3px solid #047006; + background: #f9fafb; + padding: 15px 20px; + margin: 0; + margin-bottom: 15px; + border-radius: 0 6px 0 0; + } + .form-label { + grid-column: 0.5; + font-weight: 400; + text-align: right; + padding-right: 0.5em; + } + .form-control { + grid-column: 0.66666667; + padding: 0.4em 0.75em; + padding-left: 20px; + padding-right: 20px; + margin: 0; + margin-right: 0.5em; + color: rgba(16, 16, 16, 0.8); + display: block; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6c757d; + background-color: #f6f7f9; + background-clip: padding-box; + border: 1px solid #f0f2f5; + border-radius: 0.25rem; + -webkit-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + } + .form-control:focus { + color: #495057; + background-color: #f6f7f9; + border-color: #d7dee5; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + } + textarea { + resize: vertical; + } + .badge { + display: inline-block; + padding: 0.45rem 1rem; + font-size: 80%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + } + .badge-warning { + color: #fff; + background-color: #00e093; + } + .badge-error { + color: #fff; + background-color: #ff5f66; + } + .form-full-width { + grid-column-start: 1; + grid-column-end: 3; + display: flex; + flex-direction: column; + } + .form-button { + cursor: pointer; + font: 600 13.3333px Arial; + font-size: 0.875rem; + line-height: 1.5; + text-align: center; + vertical-align: middle; + color: #fff; + background-color: #047006; + border-color: #047006; + border: 1px solid transparent; + border-radius: 0.2rem; + height: 35px; + max-height: 35px; + padding: 4px 15px; + margin-right: 0.5em; + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2); + } + .form-button:hover { + background-color: #034b04; + border-color: #023f03; + } + .button-cancel { + color: #fff !important; + background-color: #f0825f; + border-color: #f0825f; + } + .button-cancel:hover { + background-color: #ec5e30; + border-color: #eb5425; + } + .link-button { + display: inline-block; + background: #f9fafb; + color: #fff; + height: 17px; + padding: 1em 2em; + line-height: 1em; + border-radius: 6px; + text-align: center; + vertical-align: middle; + } + .action-link { + color: #047006 !important; + } + .action-link-button { + background-color: #047006 !important; + color: #fff !important; + margin-top: 1em; + padding: 0.5em 1em; + } + .edit-profile-img { + width: 100px; + } + .note-smaller { + font-size: smaller; + } + .form-row, + .grid-row { + display: flex; + justify-content: flex-start; + align-items: center; + align-content: center; + width: 100%; + -webkit-transition-duration: 0.5s; + transition-duration: 0.5s; + } + .justify-end { + justify-content: flex-end; + } + .form-row { + border-top: 1px solid #f2f4f9; + } + .form-row:hover { + background-color: #f6f7f9; + } + /* CENTER FORM SPECIFICS */ + .form-body form { + display: grid; + grid-template-columns: 220px 1fr; + margin: 36px 75px; + grid-gap: 1em; + } + .center-form { + width: 450px; + } + .center-form .form-control { + width: 90%; + } + .center-form fieldset { + margin-bottom: 1em; + } +} +@media screen and (max-width:767px) { + .grid-row { + flex-direction: column; + } +} +@media screen and (max-width:767px) { + .form-body form { + grid-template-columns: 1fr; + margin: 20px; + grid-gap: 0.25em; + } + .form-label { + text-align: left; + } +} diff --git a/community_server/webroot/css/loginServer/style.css b/community_server/webroot/css/loginServer/style.css new file mode 100644 index 000000000..bf5f617a7 --- /dev/null +++ b/community_server/webroot/css/loginServer/style.css @@ -0,0 +1,14488 @@ +.bg-inverse-primary { + background: rgba(4, 112, 6, .2) +} + +.bg-inverse-secondary { + background: rgba(128, 128, 128, .2) +} + +.bg-inverse-success { + background: rgba(0, 224, 147, .2) +} + +.bg-inverse-info { + background: rgba(108, 97, 246, .2) +} + +.bg-inverse-warning { + background: rgba(240, 130, 95, .2) +} + +.bg-inverse-danger { + background: rgba(255, 95, 102, .2) +} + +.bg-inverse-light { + background: rgba(223, 223, 223, .2) +} + +.bg-inverse-dark { + background: rgba(116, 118, 123, .2) +} + +.bg-inverse-white { + background: rgba(255, 255, 255, .2) +} + +.bg-inverse-orange { + background: rgba(255, 166, 0, .2) +} + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0 + } + + to { + opacity: 1 + } + +} + +@keyframes fadeIn { + from { + opacity: 0 + } + + to { + opacity: 1 + } + +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none + } + +} + +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none + } + +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown +} + +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + +} + +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp +} + +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + + 50% { + opacity: 1 + } + +} + +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + + 50% { + opacity: 1 + } + +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn +} + +@keyframes bounceIn { + 20%, + 40%, + 60%, + 80%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + + 20% { + -webkit-transform: scale3d(1.4, 1.4, 1.4); + transform: scale3d(1.4, 1.4, 1.4) + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9) + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03) + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97) + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } + +} + +@-webkit-keyframes rotate360 { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + -webkit-transform-origin: center; + transform-origin: center + } + +} + +@keyframes rotate360 { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + -webkit-transform-origin: center; + transform-origin: center + } + +} + +@-webkit-keyframes bounceIn { + 20%, + 40%, + 60%, + 80%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + + 20% { + -webkit-transform: scale3d(1.4, 1.4, 1.4); + transform: scale3d(1.4, 1.4, 1.4) + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9) + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03) + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97) + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } + +} + +@-webkit-keyframes ripple { + 0%, + 35% { + -webkit-transform: scale(0); + transform: scale(0); + opacity: 1 + } + + 50% { + -webkit-transform: scale(.6); + transform: scale(.6); + opacity: .8 + } + + 100% { + opacity: 0; + -webkit-transform: scale(1.2); + transform: scale(1.2) + } + +} + +@keyframes ripple { + 0%, + 35% { + -webkit-transform: scale(0); + transform: scale(0); + opacity: 1 + } + + 50% { + -webkit-transform: scale(.6); + transform: scale(.6); + opacity: .8 + } + + 100% { + opacity: 0; + -webkit-transform: scale(1.2); + transform: scale(1.2) + } + +} + +body, +html { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + letter-spacing: .03rem; + font-family: Roboto, sans-serif; + font-weight: 400; + font-size: 14px +} + +@media (min-width:768px) and (max-width:991px) { + body, + html { + font-size: calc(14px + 1 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + body, + html { + font-size: calc(15px + -1 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + body, + html { + font-size: 14px + } + +} + +h1, +h2, +h3, +h4, +h5, +h6, +label { + font-family: Roboto, sans-serif; + font-weight: 500 +} + +label, +p { + font-family: Roboto, sans-serif; + font-weight: 400; + letter-spacing: .03rem +} + +a { + font-family: Roboto, sans-serif; + font-weight: 400 +} + +a:hover { + text-decoration: none +} + +pre { + font-size: 15px +} + +@media (min-width:768px) and (max-width:991px) { + pre { + font-size: calc(15px + 1 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + pre { + font-size: calc(16px + 0 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + pre { + font-size: 16px + } + +} + +.checkbox label, +.radio label, +label { + font-family: Roboto, sans-serif; + font-weight: 400 +} + +b { + font-weight: 700 +} + +small { + font-size: 14px; + font-family: Roboto, sans-serif; + font-weight: 400; + display: inline-block; + line-height: 1.4 +} + +@media (min-width:768px) and (max-width:991px) { + small { + font-size: calc(14px + 0 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + small { + font-size: calc(14px + -1 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + small { + font-size: 13px + } + +} + +h1 { + font-size: 20px +} + +@media (min-width:768px) and (max-width:991px) { + h1 { + font-size: calc(20px + 4 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + h1 { + font-size: calc(24px + 8 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + h1 { + font-size: 32px + } + +} + +h2 { + font-size: 19px +} + +@media (min-width:768px) and (max-width:991px) { + h2 { + font-size: calc(19px + 3 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + h2 { + font-size: calc(22px + 7 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + h2 { + font-size: 29px + } + +} + +h3 { + font-size: 18px +} + +@media (min-width:768px) and (max-width:991px) { + h3 { + font-size: calc(18px + 3 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + h3 { + font-size: calc(21px + 5 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + h3 { + font-size: 26px + } + +} + +h4 { + font-size: 17px +} + +@media (min-width:768px) and (max-width:991px) { + h4 { + font-size: calc(17px + 2 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + h4 { + font-size: calc(19px + 4 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + h4 { + font-size: 23px + } + +} + +h5 { + font-size: 17px +} + +@media (min-width:768px) and (max-width:991px) { + h5 { + font-size: calc(17px + 1 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + h5 { + font-size: calc(18px + 2 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + h5 { + font-size: 20px + } + +} + +h6 { + font-size: 16px +} + +@media (min-width:768px) and (max-width:991px) { + h6 { + font-size: calc(16px + 1 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + h6 { + font-size: calc(17px + 1 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + h6 { + font-size: 18px + } + +} + +.display-1 { + font-size: 26px +} + +@media (min-width:768px) and (max-width:991px) { + .display-1 { + font-size: calc(26px + 7 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .display-1 { + font-size: calc(33px + 25 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .display-1 { + font-size: 58px + } + +} + +.display-2 { + font-size: 24px +} + +@media (min-width:768px) and (max-width:991px) { + .display-2 { + font-size: calc(24px + 7 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .display-2 { + font-size: calc(31px + 21 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .display-2 { + font-size: 52px + } + +} + +.display-3 { + font-size: 23px +} + +@media (min-width:768px) and (max-width:991px) { + .display-3 { + font-size: calc(23px + 6 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .display-3 { + font-size: calc(29px + 17 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .display-3 { + font-size: 46px + } + +} + +.display-4 { + font-size: 22px +} + +@media (min-width:768px) and (max-width:991px) { + .display-4 { + font-size: calc(22px + 5 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .display-4 { + font-size: calc(27px + 14 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .display-4 { + font-size: 41px + } + +} + +.display-5 { + font-size: 21px +} + +@media (min-width:768px) and (max-width:991px) { + .display-5 { + font-size: calc(21px + 4 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .display-5 { + font-size: calc(25px + 11 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .display-5 { + font-size: 36px + } + +} + +.form-control, +input[type=email], +input[type=name], +input[type=number], +input[type=password], +input[type=text], +textarea { + font-family: Roboto, sans-serif; + font-weight: 500; + font-size: 14px +} + +@media (min-width:768px) and (max-width:991px) { + .form-control, + input[type=email], + input[type=name], + input[type=number], + input[type=password], + input[type=text], + textarea { + font-size: calc(14px + 0 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .form-control, + input[type=email], + input[type=name], + input[type=number], + input[type=password], + input[type=text], + textarea { + font-size: calc(14px + -1 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .form-control, + input[type=email], + input[type=name], + input[type=number], + input[type=password], + input[type=text], + textarea { + font-size: 13px + } + +} + +.form-control.placeholder, +input[type=email].placeholder, +input[type=name].placeholder, +input[type=number].placeholder, +input[type=password].placeholder, +input[type=text].placeholder, +textarea.placeholder { + font-family: inherit; + font-size: inherit; + color: #afb5ba; + font-weight: inherit +} + +.form-control:-moz-placeholder, +input[type=email]:-moz-placeholder, +input[type=name]:-moz-placeholder, +input[type=number]:-moz-placeholder, +input[type=password]:-moz-placeholder, +input[type=text]:-moz-placeholder, +textarea:-moz-placeholder { + font-family: inherit; + font-size: inherit; + color: #afb5ba; + font-weight: inherit +} + +.form-control::-moz-placeholder, +input[type=email]::-moz-placeholder, +input[type=name]::-moz-placeholder, +input[type=number]::-moz-placeholder, +input[type=password]::-moz-placeholder, +input[type=text]::-moz-placeholder, +textarea::-moz-placeholder { + font-family: inherit; + font-size: inherit; + color: #afb5ba; + font-weight: inherit +} + +.form-control:-ms-input-placeholder, +input[type=email]:-ms-input-placeholder, +input[type=name]:-ms-input-placeholder, +input[type=number]:-ms-input-placeholder, +input[type=password]:-ms-input-placeholder, +input[type=text]:-ms-input-placeholder, +textarea:-ms-input-placeholder { + font-family: inherit; + font-size: inherit; + color: #afb5ba; + font-weight: inherit +} + +.form-control::-webkit-input-placeholder, +input[type=email]::-webkit-input-placeholder, +input[type=name]::-webkit-input-placeholder, +input[type=number]::-webkit-input-placeholder, +input[type=password]::-webkit-input-placeholder, +input[type=text]::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + font-family: inherit; + font-size: inherit; + color: #afb5ba; + font-weight: inherit +} + +.grid-title { + font-size: 14px; + font-family: Roboto, sans-serif; + font-weight: 500 +} + +@media (min-width:768px) and (max-width:991px) { + .grid-title { + font-size: calc(14px + 1 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .grid-title { + font-size: calc(15px + -1 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .grid-title { + font-size: 14px + } + +} + +.bootstrap-tagsinput .tag { + font-size: 14px; + font-family: Roboto, sans-serif; + font-weight: 500 +} + +@media (min-width:768px) and (max-width:991px) { + .bootstrap-tagsinput .tag { + font-size: calc(14px + 0 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .bootstrap-tagsinput .tag { + font-size: calc(14px + -1 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .bootstrap-tagsinput .tag { + font-size: 13px + } + +} + +.font-weight-medium { + font-weight: 500 !important +} + +.font-weight-bold, +.font-weight-bolder, +.font-weight-medium { + letter-spacing: 1px +} + +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #fd7e14; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --primary: #047006; + --secondary: grey; + --success: #00e093; + --info: #6c61f6; + --warning: #f0825f; + --danger: #ff5f66; + --light: #dfdfdf; + --dark: #74767b; + --white: #fff; + --orange: #ffa600; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace +} + +*, +::after, +::before { + box-sizing: border-box +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) +} + +article, +aside, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section { + display: block +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.7; + color: #212529; + text-align: left; + background-color: #fff +} + +[tabindex="-1"]:focus { + outline: 0 !important +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: .5rem +} + +p { + margin-top: 0; + margin-bottom: 1rem +} + +abbr[data-original-title], +abbr[title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit +} + +dl, +ol, +ul { + margin-top: 0; + margin-bottom: 1rem +} + +ol ol, +ol ul, +ul ol, +ul ul { + margin-bottom: 0 +} + +dt { + font-weight: 700 +} + +dd { + margin-bottom: .5rem; + margin-left: 0 +} + +blockquote { + margin: 0 0 1rem +} + +b, +strong { + font-weight: bolder +} + +small { + font-size: 80% +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +a { + color: #047006; + text-decoration: none; + background-color: transparent +} + +a:hover { + color: #012602; + text-decoration: underline +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none +} + +a:not([href]):not([tabindex]):focus, +a:not([href]):not([tabindex]):hover { + color: inherit; + text-decoration: none +} + +a:not([href]):not([tabindex]):focus { + outline: 0 +} + +code, +kbd, +pre, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto +} + +figure { + margin: 0 0 1rem +} + +img { + vertical-align: middle; + border-style: none +} + +svg { + overflow: hidden; + vertical-align: middle +} + +table { + border-collapse: collapse +} + +caption { + padding-top: 10px 15px; + padding-bottom: 10px 15px; + color: #6c757d; + text-align: left; + caption-side: bottom +} + +th { + text-align: inherit +} + +label { + display: inline-block; + margin-bottom: .5rem +} + +button { + border-radius: 0 +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color +} + +button, +input, +optgroup, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +select { + word-wrap: normal +} + +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button +} + +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled), +button:not(:disabled) { + cursor: pointer +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + padding: 0; + border-style: none +} + +input[type=checkbox], +input[type=radio] { + box-sizing: border-box; + padding: 0 +} + +input[type=date], +input[type=datetime-local], +input[type=month], +input[type=time] { + -webkit-appearance: listbox +} + +textarea { + overflow: auto; + resize: vertical +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0 +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal +} + +progress { + vertical-align: baseline +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: none +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button +} + +output { + display: inline-block +} + +summary { + display: list-item; + cursor: pointer +} + +template { + display: none +} + +[hidden] { + display: none !important +} + +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + margin-bottom: .5rem; + font-weight: 500; + line-height: 1.2 +} + +.h1, +h1 { + font-size: 2.5rem +} + +.h2, +h2 { + font-size: 2rem +} + +.h3, +h3 { + font-size: 1.75rem +} + +.h4, +h4 { + font-size: 1.5rem +} + +.h5, +h5 { + font-size: 1.25rem +} + +.h6, +h6 { + font-size: 1rem +} + +.lead { + font-size: 1.25rem; + font-weight: 300 +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2 +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2 +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2 +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2 +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, .1) +} + +.small, +small { + font-size: 80%; + font-weight: 400 +} + +.mark, +mark { + padding: .2em; + background-color: #fcf8e3 +} + +.list-unstyled { + padding-left: 0; + list-style: none +} + +.list-inline { + padding-left: 0; + list-style: none +} + +.list-inline-item { + display: inline-block +} + +.list-inline-item:not(:last-child) { + margin-right: .5rem +} + +.initialism { + font-size: 90%; + text-transform: uppercase +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d +} + +.blockquote-footer::before { + content: "\2014\00A0" +} + +.img-fluid { + max-width: 100%; + height: auto +} + +.img-thumbnail { + padding: .25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: .25rem; + max-width: 100%; + height: auto +} + +.figure { + display: inline-block +} + +.figure-img { + margin-bottom: .5rem; + line-height: 1 +} + +.figure-caption { + font-size: 90%; + color: #6c757d +} + +code { + font-size: 90%; + color: #bd4147; + word-break: break-word +} + +a>code { + color: inherit +} + +kbd { + padding: .2rem .4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + border-radius: .2rem +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700 +} + +pre { + display: block; + font-size: 90%; + color: #212529 +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll +} + +.container { + width: 100%; + padding-right: 10px; + padding-left: 10px; + margin-right: auto; + margin-left: auto +} + +@media (min-width:576px) { + .container { + max-width: 540px + } + +} + +@media (min-width:768px) { + .container { + max-width: 720px + } + +} + +@media (min-width:992px) { + .container { + max-width: 960px + } + +} + +@media (min-width:1200px) { + .container { + max-width: 1140px + } + +} + +.container-fluid { + width: 100%; + padding-right: 10px; + padding-left: 10px; + margin-right: auto; + margin-left: auto +} + +.row { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + margin-right: -10px; + margin-left: -10px +} + +.no-gutters { + margin-right: 0; + margin-left: 0 +} + +.no-gutters>.col, +.no-gutters>[class*=col-] { + padding-right: 0; + padding-left: 0 +} + +.col, +.col-1, +.col-10, +.col-11, +.col-12, +.col-2, +.col-3, +.col-4, +.col-5, +.col-6, +.col-7, +.col-8, +.col-9, +.col-auto, +.col-lg, +.col-lg-1, +.col-lg-10, +.col-lg-11, +.col-lg-12, +.col-lg-2, +.col-lg-3, +.col-lg-4, +.col-lg-5, +.col-lg-6, +.col-lg-7, +.col-lg-8, +.col-lg-9, +.col-lg-auto, +.col-md, +.col-md-1, +.col-md-10, +.col-md-11, +.col-md-12, +.col-md-2, +.col-md-3, +.col-md-4, +.col-md-5, +.col-md-6, +.col-md-7, +.col-md-8, +.col-md-9, +.col-md-auto, +.col-sm, +.col-sm-1, +.col-sm-10, +.col-sm-11, +.col-sm-12, +.col-sm-2, +.col-sm-3, +.col-sm-4, +.col-sm-5, +.col-sm-6, +.col-sm-7, +.col-sm-8, +.col-sm-9, +.col-sm-auto, +.col-xl, +.col-xl-1, +.col-xl-10, +.col-xl-11, +.col-xl-12, +.col-xl-2, +.col-xl-3, +.col-xl-4, +.col-xl-5, +.col-xl-6, +.col-xl-7, +.col-xl-8, +.col-xl-9, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 10px; + padding-left: 10px +} + +.col { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + max-width: 100% +} + +.col-auto { + -webkit-box-flex: 0; + flex: 0 0 auto; + width: auto; + max-width: 100% +} + +.col-1 { + -webkit-box-flex: 0; + flex: 0 0 8.33333%; + max-width: 8.33333% +} + +.col-2 { + -webkit-box-flex: 0; + flex: 0 0 16.66667%; + max-width: 16.66667% +} + +.col-3 { + -webkit-box-flex: 0; + flex: 0 0 25%; + max-width: 25% +} + +.col-4 { + -webkit-box-flex: 0; + flex: 0 0 33.33333%; + max-width: 33.33333% +} + +.col-5 { + -webkit-box-flex: 0; + flex: 0 0 41.66667%; + max-width: 41.66667% +} + +.col-6 { + -webkit-box-flex: 0; + flex: 0 0 50%; + max-width: 50% +} + +.col-7 { + -webkit-box-flex: 0; + flex: 0 0 58.33333%; + max-width: 58.33333% +} + +.col-8 { + -webkit-box-flex: 0; + flex: 0 0 66.66667%; + max-width: 66.66667% +} + +.col-9 { + -webkit-box-flex: 0; + flex: 0 0 75%; + max-width: 75% +} + +.col-10 { + -webkit-box-flex: 0; + flex: 0 0 83.33333%; + max-width: 83.33333% +} + +.col-11 { + -webkit-box-flex: 0; + flex: 0 0 91.66667%; + max-width: 91.66667% +} + +.col-12 { + -webkit-box-flex: 0; + flex: 0 0 100%; + max-width: 100% +} + +.order-first { + -webkit-box-ordinal-group: 0; + order: -1 +} + +.order-last { + -webkit-box-ordinal-group: 14; + order: 13 +} + +.order-0 { + -webkit-box-ordinal-group: 1; + order: 0 +} + +.order-1 { + -webkit-box-ordinal-group: 2; + order: 1 +} + +.order-2 { + -webkit-box-ordinal-group: 3; + order: 2 +} + +.order-3 { + -webkit-box-ordinal-group: 4; + order: 3 +} + +.order-4 { + -webkit-box-ordinal-group: 5; + order: 4 +} + +.order-5 { + -webkit-box-ordinal-group: 6; + order: 5 +} + +.order-6 { + -webkit-box-ordinal-group: 7; + order: 6 +} + +.order-7 { + -webkit-box-ordinal-group: 8; + order: 7 +} + +.order-8 { + -webkit-box-ordinal-group: 9; + order: 8 +} + +.order-9 { + -webkit-box-ordinal-group: 10; + order: 9 +} + +.order-10 { + -webkit-box-ordinal-group: 11; + order: 10 +} + +.order-11 { + -webkit-box-ordinal-group: 12; + order: 11 +} + +.order-12 { + -webkit-box-ordinal-group: 13; + order: 12 +} + +.offset-1 { + margin-left: 8.33333% +} + +.offset-2 { + margin-left: 16.66667% +} + +.offset-3 { + margin-left: 25% +} + +.offset-4 { + margin-left: 33.33333% +} + +.offset-5 { + margin-left: 41.66667% +} + +.offset-6 { + margin-left: 50% +} + +.offset-7 { + margin-left: 58.33333% +} + +.offset-8 { + margin-left: 66.66667% +} + +.offset-9 { + margin-left: 75% +} + +.offset-10 { + margin-left: 83.33333% +} + +.offset-11 { + margin-left: 91.66667% +} + +@media (min-width:576px) { + .col-sm { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + max-width: 100% + } + + .col-sm-auto { + -webkit-box-flex: 0; + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-sm-1 { + -webkit-box-flex: 0; + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-sm-2 { + -webkit-box-flex: 0; + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-sm-3 { + -webkit-box-flex: 0; + flex: 0 0 25%; + max-width: 25% + } + + .col-sm-4 { + -webkit-box-flex: 0; + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-sm-5 { + -webkit-box-flex: 0; + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-sm-6 { + -webkit-box-flex: 0; + flex: 0 0 50%; + max-width: 50% + } + + .col-sm-7 { + -webkit-box-flex: 0; + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-sm-8 { + -webkit-box-flex: 0; + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-sm-9 { + -webkit-box-flex: 0; + flex: 0 0 75%; + max-width: 75% + } + + .col-sm-10 { + -webkit-box-flex: 0; + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-sm-11 { + -webkit-box-flex: 0; + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-sm-12 { + -webkit-box-flex: 0; + flex: 0 0 100%; + max-width: 100% + } + + .order-sm-first { + -webkit-box-ordinal-group: 0; + order: -1 + } + + .order-sm-last { + -webkit-box-ordinal-group: 14; + order: 13 + } + + .order-sm-0 { + -webkit-box-ordinal-group: 1; + order: 0 + } + + .order-sm-1 { + -webkit-box-ordinal-group: 2; + order: 1 + } + + .order-sm-2 { + -webkit-box-ordinal-group: 3; + order: 2 + } + + .order-sm-3 { + -webkit-box-ordinal-group: 4; + order: 3 + } + + .order-sm-4 { + -webkit-box-ordinal-group: 5; + order: 4 + } + + .order-sm-5 { + -webkit-box-ordinal-group: 6; + order: 5 + } + + .order-sm-6 { + -webkit-box-ordinal-group: 7; + order: 6 + } + + .order-sm-7 { + -webkit-box-ordinal-group: 8; + order: 7 + } + + .order-sm-8 { + -webkit-box-ordinal-group: 9; + order: 8 + } + + .order-sm-9 { + -webkit-box-ordinal-group: 10; + order: 9 + } + + .order-sm-10 { + -webkit-box-ordinal-group: 11; + order: 10 + } + + .order-sm-11 { + -webkit-box-ordinal-group: 12; + order: 11 + } + + .order-sm-12 { + -webkit-box-ordinal-group: 13; + order: 12 + } + + .offset-sm-0 { + margin-left: 0 + } + + .offset-sm-1 { + margin-left: 8.33333% + } + + .offset-sm-2 { + margin-left: 16.66667% + } + + .offset-sm-3 { + margin-left: 25% + } + + .offset-sm-4 { + margin-left: 33.33333% + } + + .offset-sm-5 { + margin-left: 41.66667% + } + + .offset-sm-6 { + margin-left: 50% + } + + .offset-sm-7 { + margin-left: 58.33333% + } + + .offset-sm-8 { + margin-left: 66.66667% + } + + .offset-sm-9 { + margin-left: 75% + } + + .offset-sm-10 { + margin-left: 83.33333% + } + + .offset-sm-11 { + margin-left: 91.66667% + } + +} + +@media (min-width:768px) { + .col-md { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + max-width: 100% + } + + .col-md-auto { + -webkit-box-flex: 0; + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-md-1 { + -webkit-box-flex: 0; + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-md-2 { + -webkit-box-flex: 0; + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-md-3 { + -webkit-box-flex: 0; + flex: 0 0 25%; + max-width: 25% + } + + .col-md-4 { + -webkit-box-flex: 0; + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-md-5 { + -webkit-box-flex: 0; + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-md-6 { + -webkit-box-flex: 0; + flex: 0 0 50%; + max-width: 50% + } + + .col-md-7 { + -webkit-box-flex: 0; + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-md-8 { + -webkit-box-flex: 0; + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-md-9 { + -webkit-box-flex: 0; + flex: 0 0 75%; + max-width: 75% + } + + .col-md-10 { + -webkit-box-flex: 0; + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-md-11 { + -webkit-box-flex: 0; + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-md-12 { + -webkit-box-flex: 0; + flex: 0 0 100%; + max-width: 100% + } + + .order-md-first { + -webkit-box-ordinal-group: 0; + order: -1 + } + + .order-md-last { + -webkit-box-ordinal-group: 14; + order: 13 + } + + .order-md-0 { + -webkit-box-ordinal-group: 1; + order: 0 + } + + .order-md-1 { + -webkit-box-ordinal-group: 2; + order: 1 + } + + .order-md-2 { + -webkit-box-ordinal-group: 3; + order: 2 + } + + .order-md-3 { + -webkit-box-ordinal-group: 4; + order: 3 + } + + .order-md-4 { + -webkit-box-ordinal-group: 5; + order: 4 + } + + .order-md-5 { + -webkit-box-ordinal-group: 6; + order: 5 + } + + .order-md-6 { + -webkit-box-ordinal-group: 7; + order: 6 + } + + .order-md-7 { + -webkit-box-ordinal-group: 8; + order: 7 + } + + .order-md-8 { + -webkit-box-ordinal-group: 9; + order: 8 + } + + .order-md-9 { + -webkit-box-ordinal-group: 10; + order: 9 + } + + .order-md-10 { + -webkit-box-ordinal-group: 11; + order: 10 + } + + .order-md-11 { + -webkit-box-ordinal-group: 12; + order: 11 + } + + .order-md-12 { + -webkit-box-ordinal-group: 13; + order: 12 + } + + .offset-md-0 { + margin-left: 0 + } + + .offset-md-1 { + margin-left: 8.33333% + } + + .offset-md-2 { + margin-left: 16.66667% + } + + .offset-md-3 { + margin-left: 25% + } + + .offset-md-4 { + margin-left: 33.33333% + } + + .offset-md-5 { + margin-left: 41.66667% + } + + .offset-md-6 { + margin-left: 50% + } + + .offset-md-7 { + margin-left: 58.33333% + } + + .offset-md-8 { + margin-left: 66.66667% + } + + .offset-md-9 { + margin-left: 75% + } + + .offset-md-10 { + margin-left: 83.33333% + } + + .offset-md-11 { + margin-left: 91.66667% + } + +} + +@media (min-width:992px) { + .col-lg { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + max-width: 100% + } + + .col-lg-auto { + -webkit-box-flex: 0; + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-lg-1 { + -webkit-box-flex: 0; + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-lg-2 { + -webkit-box-flex: 0; + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-lg-3 { + -webkit-box-flex: 0; + flex: 0 0 25%; + max-width: 25% + } + + .col-lg-4 { + -webkit-box-flex: 0; + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-lg-5 { + -webkit-box-flex: 0; + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-lg-6 { + -webkit-box-flex: 0; + flex: 0 0 50%; + max-width: 50% + } + + .col-lg-7 { + -webkit-box-flex: 0; + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-lg-8 { + -webkit-box-flex: 0; + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-lg-9 { + -webkit-box-flex: 0; + flex: 0 0 75%; + max-width: 75% + } + + .col-lg-10 { + -webkit-box-flex: 0; + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-lg-11 { + -webkit-box-flex: 0; + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-lg-12 { + -webkit-box-flex: 0; + flex: 0 0 100%; + max-width: 100% + } + + .order-lg-first { + -webkit-box-ordinal-group: 0; + order: -1 + } + + .order-lg-last { + -webkit-box-ordinal-group: 14; + order: 13 + } + + .order-lg-0 { + -webkit-box-ordinal-group: 1; + order: 0 + } + + .order-lg-1 { + -webkit-box-ordinal-group: 2; + order: 1 + } + + .order-lg-2 { + -webkit-box-ordinal-group: 3; + order: 2 + } + + .order-lg-3 { + -webkit-box-ordinal-group: 4; + order: 3 + } + + .order-lg-4 { + -webkit-box-ordinal-group: 5; + order: 4 + } + + .order-lg-5 { + -webkit-box-ordinal-group: 6; + order: 5 + } + + .order-lg-6 { + -webkit-box-ordinal-group: 7; + order: 6 + } + + .order-lg-7 { + -webkit-box-ordinal-group: 8; + order: 7 + } + + .order-lg-8 { + -webkit-box-ordinal-group: 9; + order: 8 + } + + .order-lg-9 { + -webkit-box-ordinal-group: 10; + order: 9 + } + + .order-lg-10 { + -webkit-box-ordinal-group: 11; + order: 10 + } + + .order-lg-11 { + -webkit-box-ordinal-group: 12; + order: 11 + } + + .order-lg-12 { + -webkit-box-ordinal-group: 13; + order: 12 + } + + .offset-lg-0 { + margin-left: 0 + } + + .offset-lg-1 { + margin-left: 8.33333% + } + + .offset-lg-2 { + margin-left: 16.66667% + } + + .offset-lg-3 { + margin-left: 25% + } + + .offset-lg-4 { + margin-left: 33.33333% + } + + .offset-lg-5 { + margin-left: 41.66667% + } + + .offset-lg-6 { + margin-left: 50% + } + + .offset-lg-7 { + margin-left: 58.33333% + } + + .offset-lg-8 { + margin-left: 66.66667% + } + + .offset-lg-9 { + margin-left: 75% + } + + .offset-lg-10 { + margin-left: 83.33333% + } + + .offset-lg-11 { + margin-left: 91.66667% + } + +} + +@media (min-width:1200px) { + .col-xl { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + max-width: 100% + } + + .col-xl-auto { + -webkit-box-flex: 0; + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-xl-1 { + -webkit-box-flex: 0; + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-xl-2 { + -webkit-box-flex: 0; + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-xl-3 { + -webkit-box-flex: 0; + flex: 0 0 25%; + max-width: 25% + } + + .col-xl-4 { + -webkit-box-flex: 0; + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-xl-5 { + -webkit-box-flex: 0; + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-xl-6 { + -webkit-box-flex: 0; + flex: 0 0 50%; + max-width: 50% + } + + .col-xl-7 { + -webkit-box-flex: 0; + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-xl-8 { + -webkit-box-flex: 0; + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-xl-9 { + -webkit-box-flex: 0; + flex: 0 0 75%; + max-width: 75% + } + + .col-xl-10 { + -webkit-box-flex: 0; + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-xl-11 { + -webkit-box-flex: 0; + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-xl-12 { + -webkit-box-flex: 0; + flex: 0 0 100%; + max-width: 100% + } + + .order-xl-first { + -webkit-box-ordinal-group: 0; + order: -1 + } + + .order-xl-last { + -webkit-box-ordinal-group: 14; + order: 13 + } + + .order-xl-0 { + -webkit-box-ordinal-group: 1; + order: 0 + } + + .order-xl-1 { + -webkit-box-ordinal-group: 2; + order: 1 + } + + .order-xl-2 { + -webkit-box-ordinal-group: 3; + order: 2 + } + + .order-xl-3 { + -webkit-box-ordinal-group: 4; + order: 3 + } + + .order-xl-4 { + -webkit-box-ordinal-group: 5; + order: 4 + } + + .order-xl-5 { + -webkit-box-ordinal-group: 6; + order: 5 + } + + .order-xl-6 { + -webkit-box-ordinal-group: 7; + order: 6 + } + + .order-xl-7 { + -webkit-box-ordinal-group: 8; + order: 7 + } + + .order-xl-8 { + -webkit-box-ordinal-group: 9; + order: 8 + } + + .order-xl-9 { + -webkit-box-ordinal-group: 10; + order: 9 + } + + .order-xl-10 { + -webkit-box-ordinal-group: 11; + order: 10 + } + + .order-xl-11 { + -webkit-box-ordinal-group: 12; + order: 11 + } + + .order-xl-12 { + -webkit-box-ordinal-group: 13; + order: 12 + } + + .offset-xl-0 { + margin-left: 0 + } + + .offset-xl-1 { + margin-left: 8.33333% + } + + .offset-xl-2 { + margin-left: 16.66667% + } + + .offset-xl-3 { + margin-left: 25% + } + + .offset-xl-4 { + margin-left: 33.33333% + } + + .offset-xl-5 { + margin-left: 41.66667% + } + + .offset-xl-6 { + margin-left: 50% + } + + .offset-xl-7 { + margin-left: 58.33333% + } + + .offset-xl-8 { + margin-left: 66.66667% + } + + .offset-xl-9 { + margin-left: 75% + } + + .offset-xl-10 { + margin-left: 83.33333% + } + + .offset-xl-11 { + margin-left: 91.66667% + } + +} + +.table { + width: 100%; + margin-bottom: 1rem; + color: #212529 +} + +.table td, +.table th { + padding: 10px 15px; + vertical-align: top; + border-top: 1px solid #f2f4f9 +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #f2f4f9 +} + +.table tbody+tbody { + border-top: 2px solid #f2f4f9 +} + +.table-sm td, +.table-sm th { + padding: 10px 15px +} + +.table-bordered { + border: 1px solid #f2f4f9 +} + +.table-bordered td, +.table-bordered th { + border: 1px solid #f2f4f9 +} + +.table-bordered thead td, +.table-bordered thead th { + border-bottom-width: 2px +} + +.table-borderless tbody+tbody, +.table-borderless td, +.table-borderless th, +.table-borderless thead th { + border: 0 +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: #f6f7f9 +} + +.table-hover tbody tr:hover { + color: #212529; + background-color: #f6f7f9 +} + +.table-primary, +.table-primary>td, +.table-primary>th { + background-color: #b9d7b9 +} + +.table-primary tbody+tbody, +.table-primary td, +.table-primary th, +.table-primary thead th { + border-color: #7cb57e +} + +.table-hover .table-primary:hover { + background-color: #a9cea9 +} + +.table-hover .table-primary:hover>td, +.table-hover .table-primary:hover>th { + background-color: #a9cea9 +} + +.table-secondary, +.table-secondary>td, +.table-secondary>th { + background-color: #dbdbdb +} + +.table-secondary tbody+tbody, +.table-secondary td, +.table-secondary th, +.table-secondary thead th { + border-color: #bdbdbd +} + +.table-hover .table-secondary:hover { + background-color: #cecece +} + +.table-hover .table-secondary:hover>td, +.table-hover .table-secondary:hover>th { + background-color: #cecece +} + +.table-success, +.table-success>td, +.table-success>th { + background-color: #b8f6e1 +} + +.table-success tbody+tbody, +.table-success td, +.table-success th, +.table-success thead th { + border-color: #7aefc7 +} + +.table-hover .table-success:hover { + background-color: #a1f3d7 +} + +.table-hover .table-success:hover>td, +.table-hover .table-success:hover>th { + background-color: #a1f3d7 +} + +.table-info, +.table-info>td, +.table-info>th { + background-color: #d6d3fc +} + +.table-info tbody+tbody, +.table-info td, +.table-info th, +.table-info thead th { + border-color: #b3adfa +} + +.table-hover .table-info:hover { + background-color: #c0bbfa +} + +.table-hover .table-info:hover>td, +.table-hover .table-info:hover>th { + background-color: #c0bbfa +} + +.table-warning, +.table-warning>td, +.table-warning>th { + background-color: #fbdcd2 +} + +.table-warning tbody+tbody, +.table-warning td, +.table-warning th, +.table-warning thead th { + border-color: #f7beac +} + +.table-hover .table-warning:hover { + background-color: #f9cabb +} + +.table-hover .table-warning:hover>td, +.table-hover .table-warning:hover>th { + background-color: #f9cabb +} + +.table-danger, +.table-danger>td, +.table-danger>th { + background-color: #ffd2d4 +} + +.table-danger tbody+tbody, +.table-danger td, +.table-danger th, +.table-danger thead th { + border-color: #ffacaf +} + +.table-hover .table-danger:hover { + background-color: #ffb9bc +} + +.table-hover .table-danger:hover>td, +.table-hover .table-danger:hover>th { + background-color: #ffb9bc +} + +.table-light, +.table-light>td, +.table-light>th { + background-color: #f6f6f6 +} + +.table-light tbody+tbody, +.table-light td, +.table-light th, +.table-light thead th { + border-color: #eee +} + +.table-hover .table-light:hover { + background-color: #e9e9e9 +} + +.table-hover .table-light:hover>td, +.table-hover .table-light:hover>th { + background-color: #e9e9e9 +} + +.table-dark, +.table-dark>td, +.table-dark>th { + background-color: #d8d9da +} + +.table-dark tbody+tbody, +.table-dark td, +.table-dark th, +.table-dark thead th { + border-color: #b7b8ba +} + +.table-hover .table-dark:hover { + background-color: #cbccce +} + +.table-hover .table-dark:hover>td, +.table-hover .table-dark:hover>th { + background-color: #cbccce +} + +.table-white, +.table-white>td, +.table-white>th { + background-color: #fff +} + +.table-white tbody+tbody, +.table-white td, +.table-white th, +.table-white thead th { + border-color: #fff +} + +.table-hover .table-white:hover { + background-color: #f2f2f2 +} + +.table-hover .table-white:hover>td, +.table-hover .table-white:hover>th { + background-color: #f2f2f2 +} + +.table-orange, +.table-orange>td, +.table-orange>th { + background-color: #ffe6b8 +} + +.table-orange tbody+tbody, +.table-orange td, +.table-orange th, +.table-orange thead th { + border-color: #ffd17a +} + +.table-hover .table-orange:hover { + background-color: #ffdd9f +} + +.table-hover .table-orange:hover>td, +.table-hover .table-orange:hover>th { + background-color: #ffdd9f +} + +.table-active, +.table-active>td, +.table-active>th { + background-color: rgba(0, 0, 0, .075) +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, .075) +} + +.table-hover .table-active:hover>td, +.table-hover .table-active:hover>th { + background-color: rgba(0, 0, 0, .075) +} + +.table .thead-dark th { + color: #fff; + background-color: #343a40; + border-color: #454d55 +} + +.table .thead-light th { + color: #495057; + background-color: #e1e4e6; + border-color: #f2f4f9 +} + +.table-dark { + color: #fff; + background-color: #343a40 +} + +.table-dark td, +.table-dark th, +.table-dark thead th { + border-color: #454d55 +} + +.table-dark.table-bordered { + border: 0 +} + +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, .05) +} + +.table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, .075) +} + +@media (max-width:575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-sm>.table-bordered { + border: 0 + } + +} + +@media (max-width:767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-md>.table-bordered { + border: 0 + } + +} + +@media (max-width:991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-lg>.table-bordered { + border: 0 + } + +} + +@media (max-width:1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-xl>.table-bordered { + border: 0 + } + +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch +} + +.table-responsive>.table-bordered { + border: 0 +} + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + .75rem + 2px); + padding: .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6c757d; + background-color: #f6f7f9; + background-clip: padding-box; + border: 1px solid #f0f2f5; + border-radius: .25rem; + -webkit-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .form-control { + -webkit-transition: none; + transition: none + } + +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0 +} + +.form-control:focus { + color: #495057; + background-color: #f6f7f9; + border-color: #d7dee5; + outline: 0; + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.form-control::-webkit-input-placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control::-ms-input-placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control::placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control:disabled, +.form-control[readonly] { + background-color: #f8f9fa; + opacity: 1 +} + +select.form-control:focus::-ms-value { + color: #6c757d; + background-color: #f6f7f9 +} + +.form-control-file, +.form-control-range { + display: block; + width: 100% +} + +.col-form-label { + padding-top: calc(.375rem + 1px); + padding-bottom: calc(.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5 +} + +.col-form-label-lg { + padding-top: calc(.5rem + 1px); + padding-bottom: calc(.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5 +} + +.col-form-label-sm { + padding-top: calc(.25rem + 1px); + padding-bottom: calc(.25rem + 1px); + font-size: .875rem; + line-height: 1.5 +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: .375rem; + padding-bottom: .375rem; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0 +} + +.form-control-plaintext.form-control-lg, +.form-control-plaintext.form-control-sm { + padding-right: 0; + padding-left: 0 +} + +.form-control-sm { + height: calc(1.5em + .5rem + 2px); + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +select.form-control[multiple], +select.form-control[size] { + height: auto +} + +textarea.form-control { + height: auto +} + +.form-group { + margin-bottom: 1rem +} + +.form-text { + display: block; + margin-top: .25rem +} + +.form-row { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px +} + +.form-row>.col, +.form-row>[class*=col-] { + padding-right: 5px; + padding-left: 5px +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem +} + +.form-check-input { + position: absolute; + margin-top: .3rem; + margin-left: -1.25rem +} + +.form-check-input:disabled~.form-check-label { + color: #adb5bd +} + +.form-check-label { + margin-bottom: 0 +} + +.form-check-inline { + display: -webkit-inline-box; + display: inline-flex; + -webkit-box-align: center; + align-items: center; + padding-left: 0; + margin-right: .75rem +} + +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: .3125rem; + margin-left: 0 +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: .25rem; + font-size: 80%; + color: #28a745 +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: .25rem .5rem; + margin-top: .1rem; + font-size: .875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(40, 167, 69, .9); + border-radius: .25rem +} + +.form-control.is-valid, +.was-validated .form-control:valid { + border-color: #28a745; + padding-right: calc(1.5em + .75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: center right calc(.375em + .1875rem); + background-size: calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-control.is-valid:focus, +.was-validated .form-control:valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) +} + +.form-control.is-valid~.valid-feedback, +.form-control.is-valid~.valid-tooltip, +.was-validated .form-control:valid~.valid-feedback, +.was-validated .form-control:valid~.valid-tooltip { + display: block +} + +.was-validated textarea.form-control:valid, +textarea.form-control.is-valid { + padding-right: calc(1.5em + .75rem); + background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) +} + +.custom-select.is-valid, +.was-validated .custom-select:valid { + border-color: #28a745; + padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) +} + +.custom-select.is-valid:focus, +.was-validated .custom-select:valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) +} + +.custom-select.is-valid~.valid-feedback, +.custom-select.is-valid~.valid-tooltip, +.was-validated .custom-select:valid~.valid-feedback, +.was-validated .custom-select:valid~.valid-tooltip { + display: block +} + +.form-control-file.is-valid~.valid-feedback, +.form-control-file.is-valid~.valid-tooltip, +.was-validated .form-control-file:valid~.valid-feedback, +.was-validated .form-control-file:valid~.valid-tooltip { + display: block +} + +.form-check-input.is-valid~.form-check-label, +.was-validated .form-check-input:valid~.form-check-label { + color: #28a745 +} + +.form-check-input.is-valid~.valid-feedback, +.form-check-input.is-valid~.valid-tooltip, +.was-validated .form-check-input:valid~.valid-feedback, +.was-validated .form-check-input:valid~.valid-tooltip { + display: block +} + +.custom-control-input.is-valid~.custom-control-label, +.was-validated .custom-control-input:valid~.custom-control-label { + color: #28a745 +} + +.custom-control-input.is-valid~.custom-control-label::before, +.was-validated .custom-control-input:valid~.custom-control-label::before { + border-color: #28a745 +} + +.custom-control-input.is-valid~.valid-feedback, +.custom-control-input.is-valid~.valid-tooltip, +.was-validated .custom-control-input:valid~.valid-feedback, +.was-validated .custom-control-input:valid~.valid-tooltip { + display: block +} + +.custom-control-input.is-valid:checked~.custom-control-label::before, +.was-validated .custom-control-input:valid:checked~.custom-control-label::before { + border-color: #34ce57; + background-color: #34ce57 +} + +.custom-control-input.is-valid:focus~.custom-control-label::before, +.was-validated .custom-control-input:valid:focus~.custom-control-label::before { + box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) +} + +.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before, +.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before { + border-color: #28a745 +} + +.custom-file-input.is-valid~.custom-file-label, +.was-validated .custom-file-input:valid~.custom-file-label { + border-color: #28a745 +} + +.custom-file-input.is-valid~.valid-feedback, +.custom-file-input.is-valid~.valid-tooltip, +.was-validated .custom-file-input:valid~.valid-feedback, +.was-validated .custom-file-input:valid~.valid-tooltip { + display: block +} + +.custom-file-input.is-valid:focus~.custom-file-label, +.was-validated .custom-file-input:valid:focus~.custom-file-label { + border-color: #28a745; + box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: .25rem; + font-size: 80%; + color: #dc3545 +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: .25rem .5rem; + margin-top: .1rem; + font-size: .875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(220, 53, 69, .9); + border-radius: .25rem +} + +.form-control.is-invalid, +.was-validated .form-control:invalid { + border-color: #dc3545; + padding-right: calc(1.5em + .75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E"); + background-repeat: no-repeat; + background-position: center right calc(.375em + .1875rem); + background-size: calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-control.is-invalid:focus, +.was-validated .form-control:invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) +} + +.form-control.is-invalid~.invalid-feedback, +.form-control.is-invalid~.invalid-tooltip, +.was-validated .form-control:invalid~.invalid-feedback, +.was-validated .form-control:invalid~.invalid-tooltip { + display: block +} + +.was-validated textarea.form-control:invalid, +textarea.form-control.is-invalid { + padding-right: calc(1.5em + .75rem); + background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) +} + +.custom-select.is-invalid, +.was-validated .custom-select:invalid { + border-color: #dc3545; + padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) +} + +.custom-select.is-invalid:focus, +.was-validated .custom-select:invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) +} + +.custom-select.is-invalid~.invalid-feedback, +.custom-select.is-invalid~.invalid-tooltip, +.was-validated .custom-select:invalid~.invalid-feedback, +.was-validated .custom-select:invalid~.invalid-tooltip { + display: block +} + +.form-control-file.is-invalid~.invalid-feedback, +.form-control-file.is-invalid~.invalid-tooltip, +.was-validated .form-control-file:invalid~.invalid-feedback, +.was-validated .form-control-file:invalid~.invalid-tooltip { + display: block +} + +.form-check-input.is-invalid~.form-check-label, +.was-validated .form-check-input:invalid~.form-check-label { + color: #dc3545 +} + +.form-check-input.is-invalid~.invalid-feedback, +.form-check-input.is-invalid~.invalid-tooltip, +.was-validated .form-check-input:invalid~.invalid-feedback, +.was-validated .form-check-input:invalid~.invalid-tooltip { + display: block +} + +.custom-control-input.is-invalid~.custom-control-label, +.was-validated .custom-control-input:invalid~.custom-control-label { + color: #dc3545 +} + +.custom-control-input.is-invalid~.custom-control-label::before, +.was-validated .custom-control-input:invalid~.custom-control-label::before { + border-color: #dc3545 +} + +.custom-control-input.is-invalid~.invalid-feedback, +.custom-control-input.is-invalid~.invalid-tooltip, +.was-validated .custom-control-input:invalid~.invalid-feedback, +.was-validated .custom-control-input:invalid~.invalid-tooltip { + display: block +} + +.custom-control-input.is-invalid:checked~.custom-control-label::before, +.was-validated .custom-control-input:invalid:checked~.custom-control-label::before { + border-color: #e4606d; + background-color: #e4606d +} + +.custom-control-input.is-invalid:focus~.custom-control-label::before, +.was-validated .custom-control-input:invalid:focus~.custom-control-label::before { + box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) +} + +.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before, +.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before { + border-color: #dc3545 +} + +.custom-file-input.is-invalid~.custom-file-label, +.was-validated .custom-file-input:invalid~.custom-file-label { + border-color: #dc3545 +} + +.custom-file-input.is-invalid~.invalid-feedback, +.custom-file-input.is-invalid~.invalid-tooltip, +.was-validated .custom-file-input:invalid~.invalid-feedback, +.was-validated .custom-file-input:invalid~.invalid-tooltip { + display: block +} + +.custom-file-input.is-invalid:focus~.custom-file-label, +.was-validated .custom-file-input:invalid:focus~.custom-file-label { + border-color: #dc3545; + box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) +} + +.form-inline { + display: -webkit-box; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row wrap; + -webkit-box-align: center; + align-items: center +} + +.form-inline .form-check { + width: 100% +} + +@media (min-width:576px) { + .form-inline label { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + margin-bottom: 0 + } + + .form-inline .form-group { + display: -webkit-box; + display: flex; + -webkit-box-flex: 0; + flex: 0 0 auto; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row wrap; + -webkit-box-align: center; + align-items: center; + margin-bottom: 0 + } + + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle + } + + .form-inline .form-control-plaintext { + display: inline-block + } + + .form-inline .custom-select, + .form-inline .input-group { + width: auto + } + + .form-inline .form-check { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + width: auto; + padding-left: 0 + } + + .form-inline .form-check-input { + position: relative; + flex-shrink: 0; + margin-top: 0; + margin-right: .25rem; + margin-left: 0 + } + + .form-inline .custom-control { + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center + } + + .form-inline .custom-control-label { + margin-bottom: 0 + } + +} + +.btn { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: .375rem .75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: .25rem; + -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .btn { + -webkit-transition: none; + transition: none + } + +} + +.btn:hover { + color: #212529; + text-decoration: none +} + +.btn.focus, +.btn:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.btn.disabled, +.btn:disabled { + opacity: .65 +} + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none +} + +.btn-primary { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-primary:hover { + color: #fff; + background-color: #034b04; + border-color: #023f03 +} + +.btn-primary.focus, +.btn-primary:focus { + box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5) +} + +.btn-primary.disabled, +.btn-primary:disabled { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-primary:not(:disabled):not(.disabled).active, +.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle { + color: #fff; + background-color: #023f03; + border-color: #023203 +} + +.btn-primary:not(:disabled):not(.disabled).active:focus, +.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5) +} + +.btn-secondary { + color: #fff; + background-color: grey; + border-color: grey +} + +.btn-secondary:hover { + color: #fff; + background-color: #6d6d6d; + border-color: #676767 +} + +.btn-secondary.focus, +.btn-secondary:focus { + box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5) +} + +.btn-secondary.disabled, +.btn-secondary:disabled { + color: #fff; + background-color: grey; + border-color: grey +} + +.btn-secondary:not(:disabled):not(.disabled).active, +.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle { + color: #fff; + background-color: #676767; + border-color: #606060 +} + +.btn-secondary:not(:disabled):not(.disabled).active:focus, +.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5) +} + +.btn-success { + color: #fff; + background-color: #00e093; + border-color: #00e093 +} + +.btn-success:hover { + color: #fff; + background-color: #00ba7a; + border-color: #00ad72 +} + +.btn-success.focus, +.btn-success:focus { + box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5) +} + +.btn-success.disabled, +.btn-success:disabled { + color: #fff; + background-color: #00e093; + border-color: #00e093 +} + +.btn-success:not(:disabled):not(.disabled).active, +.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle { + color: #fff; + background-color: #00ad72; + border-color: #00a069 +} + +.btn-success:not(:disabled):not(.disabled).active:focus, +.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5) +} + +.btn-info { + color: #fff; + background-color: #6c61f6; + border-color: #6c61f6 +} + +.btn-info:hover { + color: #fff; + background-color: #4a3df4; + border-color: #3f31f3 +} + +.btn-info.focus, +.btn-info:focus { + box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5) +} + +.btn-info.disabled, +.btn-info:disabled { + color: #fff; + background-color: #6c61f6; + border-color: #6c61f6 +} + +.btn-info:not(:disabled):not(.disabled).active, +.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle { + color: #fff; + background-color: #3f31f3; + border-color: #3425f3 +} + +.btn-info:not(:disabled):not(.disabled).active:focus, +.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5) +} + +.btn-warning { + color: #212529; + background-color: #f0825f; + border-color: #f0825f +} + +.btn-warning:hover { + color: #fff; + background-color: #ed673c; + border-color: #ec5e30 +} + +.btn-warning.focus, +.btn-warning:focus { + box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5) +} + +.btn-warning.disabled, +.btn-warning:disabled { + color: #212529; + background-color: #f0825f; + border-color: #f0825f +} + +.btn-warning:not(:disabled):not(.disabled).active, +.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle { + color: #fff; + background-color: #ec5e30; + border-color: #eb5425 +} + +.btn-warning:not(:disabled):not(.disabled).active:focus, +.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5) +} + +.btn-danger { + color: #fff; + background-color: #ff5f66; + border-color: #ff5f66 +} + +.btn-danger:hover { + color: #fff; + background-color: #ff3941; + border-color: #ff2c35 +} + +.btn-danger.focus, +.btn-danger:focus { + box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5) +} + +.btn-danger.disabled, +.btn-danger:disabled { + color: #fff; + background-color: #ff5f66; + border-color: #ff5f66 +} + +.btn-danger:not(:disabled):not(.disabled).active, +.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle { + color: #fff; + background-color: #ff2c35; + border-color: #ff1f29 +} + +.btn-danger:not(:disabled):not(.disabled).active:focus, +.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5) +} + +.btn-light { + color: #212529; + background-color: #dfdfdf; + border-color: #dfdfdf +} + +.btn-light:hover { + color: #212529; + background-color: #ccc; + border-color: #c6c6c6 +} + +.btn-light.focus, +.btn-light:focus { + box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5) +} + +.btn-light.disabled, +.btn-light:disabled { + color: #212529; + background-color: #dfdfdf; + border-color: #dfdfdf +} + +.btn-light:not(:disabled):not(.disabled).active, +.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle { + color: #212529; + background-color: #c6c6c6; + border-color: #bfbfbf +} + +.btn-light:not(:disabled):not(.disabled).active:focus, +.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5) +} + +.btn-dark { + color: #fff; + background-color: #74767b; + border-color: #74767b +} + +.btn-dark:hover { + color: #fff; + background-color: #616367; + border-color: #5b5d61 +} + +.btn-dark.focus, +.btn-dark:focus { + box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5) +} + +.btn-dark.disabled, +.btn-dark:disabled { + color: #fff; + background-color: #74767b; + border-color: #74767b +} + +.btn-dark:not(:disabled):not(.disabled).active, +.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle { + color: #fff; + background-color: #5b5d61; + border-color: #55575a +} + +.btn-dark:not(:disabled):not(.disabled).active:focus, +.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5) +} + +.btn-white { + color: #212529; + background-color: #fff; + border-color: #fff +} + +.btn-white:hover { + color: #212529; + background-color: #ececec; + border-color: #e6e6e6 +} + +.btn-white.focus, +.btn-white:focus { + box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5) +} + +.btn-white.disabled, +.btn-white:disabled { + color: #212529; + background-color: #fff; + border-color: #fff +} + +.btn-white:not(:disabled):not(.disabled).active, +.btn-white:not(:disabled):not(.disabled):active,.show>.btn-white.dropdown-toggle { + color: #212529; + background-color: #e6e6e6; + border-color: #dfdfdf +} + +.btn-white:not(:disabled):not(.disabled).active:focus, +.btn-white:not(:disabled):not(.disabled):active:focus,.show>.btn-white.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5) +} + +.btn-orange { + color: #212529; + background-color: #ffa600; + border-color: #ffa600 +} + +.btn-orange:hover { + color: #fff; + background-color: #d98d00; + border-color: #cc8500 +} + +.btn-orange.focus, +.btn-orange:focus { + box-shadow: 0 0 0 .2rem rgba(222, 147, 6, .5) +} + +.btn-orange.disabled, +.btn-orange:disabled { + color: #212529; + background-color: #ffa600; + border-color: #ffa600 +} + +.btn-orange:not(:disabled):not(.disabled).active, +.btn-orange:not(:disabled):not(.disabled):active,.show>.btn-orange.dropdown-toggle { + color: #fff; + background-color: #cc8500; + border-color: #bf7d00 +} + +.btn-orange:not(:disabled):not(.disabled).active:focus, +.btn-orange:not(:disabled):not(.disabled):active:focus,.show>.btn-orange.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(222, 147, 6, .5) +} + +.btn-outline-primary { + color: #047006; + border-color: #047006 +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-outline-primary.focus, +.btn-outline-primary:focus { + box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) +} + +.btn-outline-primary.disabled, +.btn-outline-primary:disabled { + color: #047006; + background-color: transparent +} + +.btn-outline-primary:not(:disabled):not(.disabled).active, +.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) +} + +.btn-outline-secondary { + color: grey; + border-color: grey +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: grey; + border-color: grey +} + +.btn-outline-secondary.focus, +.btn-outline-secondary:focus { + box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) +} + +.btn-outline-secondary.disabled, +.btn-outline-secondary:disabled { + color: grey; + background-color: transparent +} + +.btn-outline-secondary:not(:disabled):not(.disabled).active, +.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: grey; + border-color: grey +} + +.btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) +} + +.btn-outline-success { + color: #00e093; + border-color: #00e093 +} + +.btn-outline-success:hover { + color: #fff; + background-color: #00e093; + border-color: #00e093 +} + +.btn-outline-success.focus, +.btn-outline-success:focus { + box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) +} + +.btn-outline-success.disabled, +.btn-outline-success:disabled { + color: #00e093; + background-color: transparent +} + +.btn-outline-success:not(:disabled):not(.disabled).active, +.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #00e093; + border-color: #00e093 +} + +.btn-outline-success:not(:disabled):not(.disabled).active:focus, +.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) +} + +.btn-outline-info { + color: #6c61f6; + border-color: #6c61f6 +} + +.btn-outline-info:hover { + color: #fff; + background-color: #6c61f6; + border-color: #6c61f6 +} + +.btn-outline-info.focus, +.btn-outline-info:focus { + box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) +} + +.btn-outline-info.disabled, +.btn-outline-info:disabled { + color: #6c61f6; + background-color: transparent +} + +.btn-outline-info:not(:disabled):not(.disabled).active, +.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #6c61f6; + border-color: #6c61f6 +} + +.btn-outline-info:not(:disabled):not(.disabled).active:focus, +.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) +} + +.btn-outline-warning { + color: #f0825f; + border-color: #f0825f +} + +.btn-outline-warning:hover { + color: #212529; + background-color: #f0825f; + border-color: #f0825f +} + +.btn-outline-warning.focus, +.btn-outline-warning:focus { + box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) +} + +.btn-outline-warning.disabled, +.btn-outline-warning:disabled { + color: #f0825f; + background-color: transparent +} + +.btn-outline-warning:not(:disabled):not(.disabled).active, +.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #f0825f; + border-color: #f0825f +} + +.btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) +} + +.btn-outline-danger { + color: #ff5f66; + border-color: #ff5f66 +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #ff5f66; + border-color: #ff5f66 +} + +.btn-outline-danger.focus, +.btn-outline-danger:focus { + box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) +} + +.btn-outline-danger.disabled, +.btn-outline-danger:disabled { + color: #ff5f66; + background-color: transparent +} + +.btn-outline-danger:not(:disabled):not(.disabled).active, +.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #ff5f66; + border-color: #ff5f66 +} + +.btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) +} + +.btn-outline-light { + color: #dfdfdf; + border-color: #dfdfdf +} + +.btn-outline-light:hover { + color: #212529; + background-color: #dfdfdf; + border-color: #dfdfdf +} + +.btn-outline-light.focus, +.btn-outline-light:focus { + box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) +} + +.btn-outline-light.disabled, +.btn-outline-light:disabled { + color: #dfdfdf; + background-color: transparent +} + +.btn-outline-light:not(:disabled):not(.disabled).active, +.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #dfdfdf; + border-color: #dfdfdf +} + +.btn-outline-light:not(:disabled):not(.disabled).active:focus, +.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) +} + +.btn-outline-dark { + color: #74767b; + border-color: #74767b +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #74767b; + border-color: #74767b +} + +.btn-outline-dark.focus, +.btn-outline-dark:focus { + box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) +} + +.btn-outline-dark.disabled, +.btn-outline-dark:disabled { + color: #74767b; + background-color: transparent +} + +.btn-outline-dark:not(:disabled):not(.disabled).active, +.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #74767b; + border-color: #74767b +} + +.btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) +} + +.btn-outline-white { + color: #fff; + border-color: #fff +} + +.btn-outline-white:hover { + color: #212529; + background-color: #fff; + border-color: #fff +} + +.btn-outline-white.focus, +.btn-outline-white:focus { + box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) +} + +.btn-outline-white.disabled, +.btn-outline-white:disabled { + color: #fff; + background-color: transparent +} + +.btn-outline-white:not(:disabled):not(.disabled).active, +.btn-outline-white:not(:disabled):not(.disabled):active,.show>.btn-outline-white.dropdown-toggle { + color: #212529; + background-color: #fff; + border-color: #fff +} + +.btn-outline-white:not(:disabled):not(.disabled).active:focus, +.btn-outline-white:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-white.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) +} + +.btn-outline-orange { + color: #ffa600; + border-color: #ffa600 +} + +.btn-outline-orange:hover { + color: #212529; + background-color: #ffa600; + border-color: #ffa600 +} + +.btn-outline-orange.focus, +.btn-outline-orange:focus { + box-shadow: 0 0 0 .2rem rgba(255, 166, 0, .5) +} + +.btn-outline-orange.disabled, +.btn-outline-orange:disabled { + color: #ffa600; + background-color: transparent +} + +.btn-outline-orange:not(:disabled):not(.disabled).active, +.btn-outline-orange:not(:disabled):not(.disabled):active,.show>.btn-outline-orange.dropdown-toggle { + color: #212529; + background-color: #ffa600; + border-color: #ffa600 +} + +.btn-outline-orange:not(:disabled):not(.disabled).active:focus, +.btn-outline-orange:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-orange.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(255, 166, 0, .5) +} + +.btn-link { + font-weight: 400; + color: #047006; + text-decoration: none +} + +.btn-link:hover { + color: #012602; + text-decoration: underline +} + +.btn-link.focus, +.btn-link:focus { + text-decoration: underline; + box-shadow: none +} + +.btn-link.disabled, +.btn-link:disabled { + color: #6c757d; + pointer-events: none +} + +.btn-group-lg>.btn, +.btn-lg { + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +.btn-group-sm>.btn, +.btn-sm { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.btn-block { + display: block; + width: 100% +} + +.btn-block+.btn-block { + margin-top: .5rem +} + +input[type=button].btn-block, +input[type=reset].btn-block, +input[type=submit].btn-block { + width: 100% +} + +.fade { + -webkit-transition: opacity .15s linear; + transition: opacity .15s linear +} + +@media (prefers-reduced-motion:reduce) { + .fade { + -webkit-transition: none; + transition: none + } + +} + +.fade:not(.show) { + opacity: 0 +} + +.collapse:not(.show) { + display: none +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height .35s ease; + transition: height .35s ease +} + +@media (prefers-reduced-motion:reduce) { + .collapsing { + -webkit-transition: none; + transition: none + } + +} + +.dropdown, +.dropleft, +.dropright, +.dropup { + position: relative +} + +.dropdown-toggle { + white-space: nowrap +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: 'http://www.w3.org/2000/svg'; + border-top: .3em solid; + border-right: .3em solid transparent; + border-bottom: 0; + border-left: .3em solid transparent +} + +.dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: .5rem 0; + margin: .125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: .25rem +} + +.dropdown-menu-left { + right: auto; + left: 0 +} + +.dropdown-menu-right { + right: 0; + left: auto +} + +@media (min-width:576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0 + } + + .dropdown-menu-sm-right { + right: 0; + left: auto + } + +} + +@media (min-width:768px) { + .dropdown-menu-md-left { + right: auto; + left: 0 + } + + .dropdown-menu-md-right { + right: 0; + left: auto + } + +} + +@media (min-width:992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0 + } + + .dropdown-menu-lg-right { + right: 0; + left: auto + } + +} + +@media (min-width:1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0 + } + + .dropdown-menu-xl-right { + right: 0; + left: auto + } + +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: .125rem +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: '0 0 8 8'; + border-top: 0; + border-right: .3em solid transparent; + border-bottom: .3em solid; + border-left: .3em solid transparent +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: .125rem +} + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: '%2328a745'; + border-top: .3em solid transparent; + border-right: 0; + border-bottom: .3em solid transparent; + border-left: .3em solid +} + +.dropright .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropright .dropdown-toggle::after { + vertical-align: 0 +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: .125rem +} + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z' +} + +.dropleft .dropdown-toggle::after { + display: none +} + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: .255em; + vertical-align: .255em; + content: 'http://www.w3.org/2000/svg'; + border-top: .3em solid transparent; + border-right: .3em solid; + border-bottom: .3em solid transparent +} + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropleft .dropdown-toggle::before { + vertical-align: 0 +} + +.dropdown-menu[x-placement^=bottom], +.dropdown-menu[x-placement^=left], +.dropdown-menu[x-placement^=right], +.dropdown-menu[x-placement^=top] { + right: auto; + bottom: auto +} + +.dropdown-divider { + height: 0; + margin: .5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef +} + +.dropdown-item { + display: block; + width: 100%; + padding: .25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0 +} + +.dropdown-item:focus, +.dropdown-item:hover { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa +} + +.dropdown-item.active, +.dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #007bff +} + +.dropdown-item.disabled, +.dropdown-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: transparent +} + +.dropdown-menu.show { + display: block +} + +.dropdown-header { + display: block; + padding: .5rem 1.5rem; + margin-bottom: 0; + font-size: .875rem; + color: #6c757d; + white-space: nowrap +} + +.dropdown-item-text { + display: block; + padding: .25rem 1.5rem; + color: #212529 +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: -webkit-inline-box; + display: inline-flex; + vertical-align: middle +} + +.btn-group-vertical>.btn, +.btn-group>.btn { + position: relative; + -webkit-box-flex: 1; + flex: 1 1 auto +} + +.btn-group-vertical>.btn:hover, +.btn-group>.btn:hover { + z-index: 1 +} + +.btn-group-vertical>.btn.active, +.btn-group-vertical>.btn:active, +.btn-group-vertical>.btn:focus, +.btn-group>.btn.active, +.btn-group>.btn:active, +.btn-group>.btn:focus { + z-index: 1 +} + +.btn-toolbar { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + -webkit-box-pack: start; + justify-content: flex-start +} + +.btn-toolbar .input-group { + width: auto +} + +.btn-group>.btn-group:not(:first-child), +.btn-group>.btn:not(:first-child) { + margin-left: -1px +} + +.btn-group>.btn-group:not(:last-child)>.btn, +.btn-group>.btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn-group:not(:first-child)>.btn, +.btn-group>.btn:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.dropdown-toggle-split { + padding-right: .5625rem; + padding-left: .5625rem +} + +.dropdown-toggle-split::after, +.dropright .dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after { + margin-left: 0 +} + +.dropleft .dropdown-toggle-split::before { + margin-right: 0 +} + +.btn-group-sm>.btn+.dropdown-toggle-split, +.btn-sm+.dropdown-toggle-split { + padding-right: .375rem; + padding-left: .375rem +} + +.btn-group-lg>.btn+.dropdown-toggle-split, +.btn-lg+.dropdown-toggle-split { + padding-right: .75rem; + padding-left: .75rem +} + +.btn-group-vertical { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + -webkit-box-align: start; + align-items: flex-start; + -webkit-box-pack: center; + justify-content: center +} + +.btn-group-vertical>.btn, +.btn-group-vertical>.btn-group { + width: 100% +} + +.btn-group-vertical>.btn-group:not(:first-child), +.btn-group-vertical>.btn:not(:first-child) { + margin-top: -1px +} + +.btn-group-vertical>.btn-group:not(:last-child)>.btn, +.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn-group:not(:first-child)>.btn, +.btn-group-vertical>.btn:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.btn-group-toggle>.btn, +.btn-group-toggle>.btn-group>.btn { + margin-bottom: 0 +} + +.btn-group-toggle>.btn input[type=checkbox], +.btn-group-toggle>.btn input[type=radio], +.btn-group-toggle>.btn-group>.btn input[type=checkbox], +.btn-group-toggle>.btn-group>.btn input[type=radio] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none +} + +.input-group { + position: relative; + display: -webkit-box; + display: flex; + flex-wrap: wrap; + -webkit-box-align: stretch; + align-items: stretch; + width: 100% +} + +.input-group>.custom-file, +.input-group>.custom-select, +.input-group>.form-control, +.input-group>.form-control-plaintext { + position: relative; + -webkit-box-flex: 1; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0 +} + +.input-group>.custom-file+.custom-file, +.input-group>.custom-file+.custom-select, +.input-group>.custom-file+.form-control, +.input-group>.custom-select+.custom-file, +.input-group>.custom-select+.custom-select, +.input-group>.custom-select+.form-control, +.input-group>.form-control+.custom-file, +.input-group>.form-control+.custom-select, +.input-group>.form-control+.form-control, +.input-group>.form-control-plaintext+.custom-file, +.input-group>.form-control-plaintext+.custom-select, +.input-group>.form-control-plaintext+.form-control { + margin-left: -1px +} + +.input-group>.custom-file .custom-file-input:focus~.custom-file-label, +.input-group>.custom-select:focus, +.input-group>.form-control:focus { + z-index: 3 +} + +.input-group>.custom-file .custom-file-input:focus { + z-index: 4 +} + +.input-group>.custom-select:not(:last-child), +.input-group>.form-control:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group>.custom-select:not(:first-child), +.input-group>.form-control:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group>.custom-file { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center +} + +.input-group>.custom-file:not(:last-child) .custom-file-label, +.input-group>.custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group>.custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group-append, +.input-group-prepend { + display: -webkit-box; + display: flex +} + +.input-group-append .btn, +.input-group-prepend .btn { + position: relative; + z-index: 2 +} + +.input-group-append .btn:focus, +.input-group-prepend .btn:focus { + z-index: 3 +} + +.input-group-append .btn+.btn, +.input-group-append .btn+.input-group-text, +.input-group-append .input-group-text+.btn, +.input-group-append .input-group-text+.input-group-text, +.input-group-prepend .btn+.btn, +.input-group-prepend .btn+.input-group-text, +.input-group-prepend .input-group-text+.btn, +.input-group-prepend .input-group-text+.input-group-text { + margin-left: -1px +} + +.input-group-prepend { + margin-right: -1px +} + +.input-group-append { + margin-left: -1px +} + +.input-group-text { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + padding: .375rem .75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6c757d; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #f0f2f5; + border-radius: .25rem +} + +.input-group-text input[type=checkbox], +.input-group-text input[type=radio] { + margin-top: 0 +} + +.input-group-lg>.custom-select, +.input-group-lg>.form-control:not(textarea) { + height: calc(1.5em + 1rem + 2px) +} + +.input-group-lg>.custom-select, +.input-group-lg>.form-control, +.input-group-lg>.input-group-append>.btn, +.input-group-lg>.input-group-append>.input-group-text, +.input-group-lg>.input-group-prepend>.btn, +.input-group-lg>.input-group-prepend>.input-group-text { + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +.input-group-sm>.custom-select, +.input-group-sm>.form-control:not(textarea) { + height: calc(1.5em + .5rem + 2px) +} + +.input-group-sm>.custom-select, +.input-group-sm>.form-control, +.input-group-sm>.input-group-append>.btn, +.input-group-sm>.input-group-append>.input-group-text, +.input-group-sm>.input-group-prepend>.btn, +.input-group-sm>.input-group-prepend>.input-group-text { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.input-group-lg>.custom-select, +.input-group-sm>.custom-select { + padding-right: 1.75rem +} + +.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle), +.input-group>.input-group-append:last-child>.input-group-text:not(:last-child), +.input-group>.input-group-append:not(:last-child)>.btn, +.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group>.input-group-append>.btn, +.input-group>.input-group-append>.input-group-text, +.input-group>.input-group-prepend:first-child>.btn:not(:first-child), +.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child), +.input-group>.input-group-prepend:not(:first-child)>.btn, +.input-group>.input-group-prepend:not(:first-child)>.input-group-text { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.custom-control { + position: relative; + display: block; + min-height: 1.7rem; + padding-left: 1.9rem +} + +.custom-control-inline { + display: -webkit-inline-box; + display: inline-flex; + margin-right: 1rem +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0 +} + +.custom-control-input:checked~.custom-control-label::before { + color: #fff; + border-color: #00e093; + background-color: #00e093 +} + +.custom-control-input:focus~.custom-control-label::before { + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-control-input:focus:not(:checked)~.custom-control-label::before { + border-color: #80bdff +} + +.custom-control-input:not(:disabled):active~.custom-control-label::before { + color: #fff; + background-color: #b3d7ff; + border-color: #b3d7ff +} + +.custom-control-input:disabled~.custom-control-label { + color: #6c757d +} + +.custom-control-input:disabled~.custom-control-label::before { + background-color: #e9ecef +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top +} + +.custom-control-label::before { + position: absolute; + top: .15rem; + left: -1.9rem; + display: block; + width: 1.4rem; + height: 1.4rem; + pointer-events: none; + content: '0 0 4 5'; + background-color: #fff; + border: #e1e5f1 solid 1px +} + +.custom-control-label::after { + position: absolute; + top: .15rem; + left: -1.9rem; + display: block; + width: 1.4rem; + height: 1.4rem; + content: '%23343a40'; + background: no-repeat 50%/50% 50% +} + +.custom-checkbox .custom-control-label::before { + border-radius: .25rem +} + +.custom-checkbox .custom-control-input:checked~.custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") +} + +.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before { + border-color: #007bff; + background-color: #007bff +} + +.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3c/svg%3e") +} + +.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before { + background-color: rgba(0, 123, 255, .5) +} + +.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before { + background-color: rgba(0, 123, 255, .5) +} + +.custom-radio .custom-control-label::before { + border-radius: 50% +} + +.custom-radio .custom-control-input:checked~.custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3ccircle r=!string!fill=!string!/%3e%3c/svg%3e") +} + +.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before { + background-color: rgba(0, 123, 255, .5) +} + +.custom-switch { + padding-left: 2.8rem +} + +.custom-switch .custom-control-label::before { + left: -2.8rem; + width: 2.3rem; + pointer-events: all; + border-radius: 25px +} + +.custom-switch .custom-control-label::after { + top: calc(.15rem + 2px); + left: calc(-2.8rem + 2px); + width: 1.1rem; + height: 1.1rem; + background-color: #e1e5f1; + border-radius: 25px; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out; + transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .custom-switch .custom-control-label::after { + -webkit-transition: none; + transition: none + } + +} + +.custom-switch .custom-control-input:checked~.custom-control-label::after { + background-color: #fff; + -webkit-transform: translateX(.9rem); + transform: translateX(.9rem) +} + +.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before { + background-color: rgba(0, 123, 255, .5) +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + .75rem + 2px); + padding: .375rem 1.75rem .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: .25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.custom-select:focus { + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-select:focus::-ms-value { + color: #6c757d; + background-color: #f6f7f9 +} + +.custom-select[multiple], +.custom-select[size]:not([size='M2 0L0 2h4zm0 5L0 3h4z']) { + height: auto; + padding-right: .75rem; + background-image: none +} + +.custom-select:disabled { + color: #6c757d; + background-color: #e9ecef +} + +.custom-select::-ms-expand { + display: none +} + +.custom-select-sm { + height: calc(1.5em + .5rem + 2px); + padding-top: .25rem; + padding-bottom: .25rem; + padding-left: .5rem; + font-size: .875rem +} + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: .5rem; + padding-bottom: .5rem; + padding-left: 1rem; + font-size: 1.25rem +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + .75rem + 2px); + margin-bottom: 0 +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + .75rem + 2px); + margin: 0; + opacity: 0 +} + +.custom-file-input:focus~.custom-file-label { + border-color: #80bdff; + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-file-input:disabled~.custom-file-label { + background-color: #e9ecef +} + +.custom-file-input:lang(en)~.custom-file-label::after { + content: 'http://www.w3.org/2000/svg' +} + +.custom-file-input~.custom-file-label[data-browse]::after { + content: attr(data-browse) +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + .75rem + 2px); + padding: .375rem .75rem; + font-weight: 400; + line-height: 1.5; + color: #6c757d; + background-color: #f6f7f9; + border: 1px solid #f0f2f5; + border-radius: .25rem +} + +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + .75rem); + padding: .375rem .75rem; + line-height: 1.5; + color: #495057; + content: '0 0 8 8'; + background-color: #e9ecef; + border-left: inherit; + border-radius: 0 .25rem .25rem 0 +} + +.custom-range { + width: 100%; + height: calc(1rem + .4rem); + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.custom-range:focus { + outline: 0 +} + +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-range::-moz-focus-outer { + border: 0 +} + +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -.25rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -webkit-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion:reduce) { + .custom-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none + } + +} + +.custom-range::-webkit-slider-thumb:active { + background-color: #b3d7ff +} + +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem +} + +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -moz-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion:reduce) { + .custom-range::-moz-range-thumb { + -webkit-transition: none; + transition: none + } + +} + +.custom-range::-moz-range-thumb:active { + background-color: #b3d7ff +} + +.custom-range::-moz-range-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem +} + +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: .2rem; + margin-left: .2rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + appearance: none +} + +@media (prefers-reduced-motion:reduce) { + .custom-range::-ms-thumb { + -webkit-transition: none; + transition: none + } + +} + +.custom-range::-ms-thumb:active { + background-color: #b3d7ff +} + +.custom-range::-ms-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: .5rem +} + +.custom-range::-ms-fill-lower { + background-color: #dee2e6; + border-radius: 1rem +} + +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; + border-radius: 1rem +} + +.custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd +} + +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default +} + +.custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd +} + +.custom-range:disabled::-moz-range-track { + cursor: default +} + +.custom-range:disabled::-ms-thumb { + background-color: #adb5bd +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + -webkit-transition: none; + transition: none + } + +} + +.nav { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.nav-link { + display: block; + padding: .5rem 1rem +} + +.nav-link:focus, +.nav-link:hover { + text-decoration: none +} + +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6 +} + +.nav-tabs .nav-item { + margin-bottom: -1px +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 2px; + border-top-right-radius: 2px +} + +.nav-tabs .nav-link:focus, +.nav-tabs .nav-link:hover { + border-color: #e9ecef #e9ecef #dee2e6 +} + +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent +} + +.nav-tabs .nav-item.show .nav-link, +.nav-tabs .nav-link.active { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.nav-pills .nav-link { + border-radius: 2px +} + +.nav-pills .nav-link.active, +.nav-pills .show>.nav-link { + color: #fff; + background-color: #007bff +} + +.nav-fill .nav-item { + -webkit-box-flex: 1; + flex: 1 1 auto; + text-align: center +} + +.nav-justified .nav-item { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + text-align: center +} + +.tab-content>.tab-pane { + display: none +} + +.tab-content>.active { + display: block +} + +.navbar { + position: relative; + display: -webkit-box; + display: flex; + flex-wrap: wrap; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: justify; + justify-content: space-between; + padding: .5rem 1rem +} + +.navbar>.container, +.navbar>.container-fluid { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: justify; + justify-content: space-between +} + +.navbar-brand { + display: inline-block; + padding-top: .3125rem; + padding-bottom: .3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap +} + +.navbar-brand:focus, +.navbar-brand:hover { + text-decoration: none +} + +.navbar-nav { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0 +} + +.navbar-nav .dropdown-menu { + position: static; + float: none +} + +.navbar-text { + display: inline-block; + padding-top: .5rem; + padding-bottom: .5rem +} + +.navbar-collapse { + flex-basis: 100%; + -webkit-box-flex: 1; + flex-grow: 1; + -webkit-box-align: center; + align-items: center +} + +.navbar-toggler { + padding: .25rem .75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: .25rem +} + +.navbar-toggler:focus, +.navbar-toggler:hover { + text-decoration: none +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: '%2328a745'; + background: no-repeat center center; + background-size: 100% 100% +} + +@media (max-width:575.98px) { + .navbar-expand-sm>.container, + .navbar-expand-sm>.container-fluid { + padding-right: 0; + padding-left: 0 + } + +} + +@media (min-width:576px) { + .navbar-expand-sm { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row nowrap; + -webkit-box-pack: start; + justify-content: flex-start + } + + .navbar-expand-sm .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-sm>.container, + .navbar-expand-sm>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-sm .navbar-collapse { + display: -webkit-box !important; + display: flex !important; + flex-basis: auto + } + + .navbar-expand-sm .navbar-toggler { + display: none + } + +} + +@media (max-width:767.98px) { + .navbar-expand-md>.container, + .navbar-expand-md>.container-fluid { + padding-right: 0; + padding-left: 0 + } + +} + +@media (min-width:768px) { + .navbar-expand-md { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row nowrap; + -webkit-box-pack: start; + justify-content: flex-start + } + + .navbar-expand-md .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-md .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-md>.container, + .navbar-expand-md>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-md .navbar-collapse { + display: -webkit-box !important; + display: flex !important; + flex-basis: auto + } + + .navbar-expand-md .navbar-toggler { + display: none + } + +} + +@media (max-width:991.98px) { + .navbar-expand-lg>.container, + .navbar-expand-lg>.container-fluid { + padding-right: 0; + padding-left: 0 + } + +} + +@media (min-width:992px) { + .navbar-expand-lg { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row nowrap; + -webkit-box-pack: start; + justify-content: flex-start + } + + .navbar-expand-lg .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-lg>.container, + .navbar-expand-lg>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-lg .navbar-collapse { + display: -webkit-box !important; + display: flex !important; + flex-basis: auto + } + + .navbar-expand-lg .navbar-toggler { + display: none + } + +} + +@media (max-width:1199.98px) { + .navbar-expand-xl>.container, + .navbar-expand-xl>.container-fluid { + padding-right: 0; + padding-left: 0 + } + +} + +@media (min-width:1200px) { + .navbar-expand-xl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row nowrap; + -webkit-box-pack: start; + justify-content: flex-start + } + + .navbar-expand-xl .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-xl>.container, + .navbar-expand-xl>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-xl .navbar-collapse { + display: -webkit-box !important; + display: flex !important; + flex-basis: auto + } + + .navbar-expand-xl .navbar-toggler { + display: none + } + +} + +.navbar-expand { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row nowrap; + -webkit-box-pack: start; + justify-content: flex-start +} + +.navbar-expand>.container, +.navbar-expand>.container-fluid { + padding-right: 0; + padding-left: 0 +} + +.navbar-expand .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem +} + +.navbar-expand>.container, +.navbar-expand>.container-fluid { + flex-wrap: nowrap +} + +.navbar-expand .navbar-collapse { + display: -webkit-box !important; + display: flex !important; + flex-basis: auto +} + +.navbar-expand .navbar-toggler { + display: none +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-brand:focus, +.navbar-light .navbar-brand:hover { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, .5) +} + +.navbar-light .navbar-nav .nav-link:focus, +.navbar-light .navbar-nav .nav-link:hover { + color: rgba(0, 0, 0, .7) +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, .3) +} + +.navbar-light .navbar-nav .active>.nav-link, +.navbar-light .navbar-nav .nav-link.active, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .show>.nav-link { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, .5); + border-color: rgba(0, 0, 0, .1) +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e") +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, .5) +} + +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-text a:focus, +.navbar-light .navbar-text a:hover { + color: rgba(0, 0, 0, .9) +} + +.navbar-dark .navbar-brand { + color: #fff +} + +.navbar-dark .navbar-brand:focus, +.navbar-dark .navbar-brand:hover { + color: #fff +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, .5) +} + +.navbar-dark .navbar-nav .nav-link:focus, +.navbar-dark .navbar-nav .nav-link:hover { + color: rgba(255, 255, 255, .75) +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, .25) +} + +.navbar-dark .navbar-nav .active>.nav-link, +.navbar-dark .navbar-nav .nav-link.active, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .show>.nav-link { + color: #fff +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, .5); + border-color: rgba(255, 255, 255, .1) +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e") +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, .5) +} + +.navbar-dark .navbar-text a { + color: #fff +} + +.navbar-dark .navbar-text a:focus, +.navbar-dark .navbar-text a:hover { + color: #fff +} + +.card { + position: relative; + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(238, 238, 238, .75); + border-radius: .25rem +} + +.card>hr { + margin-right: 0; + margin-left: 0 +} + +.card>.list-group:first-child .list-group-item:first-child { + border-top-left-radius: .25rem; + border-top-right-radius: .25rem +} + +.card>.list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: .25rem; + border-bottom-left-radius: .25rem +} + +.card-body { + -webkit-box-flex: 1; + flex: 1 1 auto; + padding: 1.25rem +} + +.card-title { + margin-bottom: .75rem +} + +.card-subtitle { + margin-top: -.375rem; + margin-bottom: 0 +} + +.card-text:last-child { + margin-bottom: 0 +} + +.card-link:hover { + text-decoration: none +} + +.card-link+.card-link { + margin-left: 1.25rem +} + +.card-header { + padding: .75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, .03); + border-bottom: 1px solid rgba(238, 238, 238, .75) +} + +.card-header:first-child { + border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0 +} + +.card-header+.list-group .list-group-item:first-child { + border-top: 0 +} + +.card-footer { + padding: .75rem 1.25rem; + background-color: rgba(0, 0, 0, .03); + border-top: 1px solid rgba(238, 238, 238, .75) +} + +.card-footer:last-child { + border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px) +} + +.card-header-tabs { + margin-right: -.625rem; + margin-bottom: -.75rem; + margin-left: -.625rem; + border-bottom: 0 +} + +.card-header-pills { + margin-right: -.625rem; + margin-left: -.625rem +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem +} + +.card-img { + width: 100%; + border-radius: calc(.25rem - 1px) +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(.25rem - 1px); + border-top-right-radius: calc(.25rem - 1px) +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(.25rem - 1px); + border-bottom-left-radius: calc(.25rem - 1px) +} + +.card-deck { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column +} + +.card-deck .card { + margin-bottom: 15px +} + +@media (min-width:576px) { + .card-deck { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px + } + + .card-deck .card { + display: -webkit-box; + display: flex; + -webkit-box-flex: 1; + flex: 1 0 0%; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px + } + +} + +.card-group { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column +} + +.card-group>.card { + margin-bottom: 15px +} + +@media (min-width:576px) { + .card-group { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row wrap + } + + .card-group>.card { + -webkit-box-flex: 1; + flex: 1 0 0%; + margin-bottom: 0 + } + + .card-group>.card+.card { + margin-left: 0; + border-left: 0 + } + + .card-group>.card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 + } + + .card-group>.card:not(:last-child) .card-header, + .card-group>.card:not(:last-child) .card-img-top { + border-top-right-radius: 0 + } + + .card-group>.card:not(:last-child) .card-footer, + .card-group>.card:not(:last-child) .card-img-bottom { + border-bottom-right-radius: 0 + } + + .card-group>.card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 + } + + .card-group>.card:not(:first-child) .card-header, + .card-group>.card:not(:first-child) .card-img-top { + border-top-left-radius: 0 + } + + .card-group>.card:not(:first-child) .card-footer, + .card-group>.card:not(:first-child) .card-img-bottom { + border-bottom-left-radius: 0 + } + +} + +.card-columns .card { + margin-bottom: .75rem +} + +@media (min-width:576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1 + } + + .card-columns .card { + display: inline-block; + width: 100% + } + +} + +.accordion>.card { + overflow: hidden +} + +.accordion>.card:not(:first-of-type) .card-header:first-child { + border-radius: 0 +} + +.accordion>.card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0 +} + +.accordion>.card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.accordion>.card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.accordion>.card .card-header { + margin-bottom: -1px +} + +.breadcrumb { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + padding: .75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #f7f9fa; + border-radius: .25rem +} + +.breadcrumb-item+.breadcrumb-item { + padding-left: .5rem +} + +.breadcrumb-item+.breadcrumb-item::before { + display: inline-block; + padding-right: .5rem; + color: #a8a9ad; + content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z' +} + +.breadcrumb-item+.breadcrumb-item:hover::before { + text-decoration: underline +} + +.breadcrumb-item+.breadcrumb-item:hover::before { + text-decoration: none +} + +.breadcrumb-item.active { + color: #6c757d +} + +.pagination { + display: -webkit-box; + display: flex; + padding-left: 0; + list-style: none; + border-radius: 2px +} + +.page-link { + position: relative; + display: block; + padding: .5rem .75rem; + margin-left: -1px; + line-height: 1.25; + color: #007bff; + background-color: #fff; + border: 1px solid #dee2e6 +} + +.page-link:hover { + z-index: 2; + color: #0056b3; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6 +} + +.page-link:focus { + z-index: 2; + outline: 0; + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px +} + +.page-item:last-child .page-link { + border-top-right-radius: 2px; + border-bottom-right-radius: 2px +} + +.page-item.active .page-link { + z-index: 1; + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6 +} + +.pagination-lg .page-link { + padding: .75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5 +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px +} + +.pagination-sm .page-link { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5 +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: .2rem; + border-bottom-left-radius: .2rem +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: .2rem; + border-bottom-right-radius: .2rem +} + +.badge { + display: inline-block; + padding: .45rem 1rem; + font-size: 80%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25rem; + -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .badge { + -webkit-transition: none; + transition: none + } + +} + +a.badge:focus, +a.badge:hover { + text-decoration: none +} + +.badge:empty { + display: none +} + +.btn .badge { + position: relative; + top: -1px +} + +.badge-pill { + padding-right: .5rem; + padding-left: .5rem; + border-radius: 10rem +} + +.badge-primary { + color: #fff; + background-color: #047006 +} + +a.badge-primary:focus, +a.badge-primary:hover { + color: #fff; + background-color: #023f03 +} + +a.badge-primary.focus, +a.badge-primary:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) +} + +.badge-secondary { + color: #fff; + background-color: grey +} + +a.badge-secondary:focus, +a.badge-secondary:hover { + color: #fff; + background-color: #676767 +} + +a.badge-secondary.focus, +a.badge-secondary:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) +} + +.badge-success { + color: #fff; + background-color: #00e093 +} + +a.badge-success:focus, +a.badge-success:hover { + color: #fff; + background-color: #00ad72 +} + +a.badge-success.focus, +a.badge-success:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) +} + +.badge-info { + color: #fff; + background-color: #6c61f6 +} + +a.badge-info:focus, +a.badge-info:hover { + color: #fff; + background-color: #3f31f3 +} + +a.badge-info.focus, +a.badge-info:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) +} + +.badge-warning { + color: #212529; + background-color: #f0825f +} + +a.badge-warning:focus, +a.badge-warning:hover { + color: #212529; + background-color: #ec5e30 +} + +a.badge-warning.focus, +a.badge-warning:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) +} + +.badge-danger { + color: #fff; + background-color: #ff5f66 +} + +a.badge-danger:focus, +a.badge-danger:hover { + color: #fff; + background-color: #ff2c35 +} + +a.badge-danger.focus, +a.badge-danger:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) +} + +.badge-light { + color: #212529; + background-color: #dfdfdf +} + +a.badge-light:focus, +a.badge-light:hover { + color: #212529; + background-color: #c6c6c6 +} + +a.badge-light.focus, +a.badge-light:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) +} + +.badge-dark { + color: #fff; + background-color: #74767b +} + +a.badge-dark:focus, +a.badge-dark:hover { + color: #fff; + background-color: #5b5d61 +} + +a.badge-dark.focus, +a.badge-dark:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) +} + +.badge-white { + color: #212529; + background-color: #fff +} + +a.badge-white:focus, +a.badge-white:hover { + color: #212529; + background-color: #e6e6e6 +} + +a.badge-white.focus, +a.badge-white:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) +} + +.badge-orange { + color: #212529; + background-color: #ffa600 +} + +a.badge-orange:focus, +a.badge-orange:hover { + color: #212529; + background-color: #cc8500 +} + +a.badge-orange.focus, +a.badge-orange:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(255, 166, 0, .5) +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 6px +} + +@media (min-width:576px) { + .jumbotron { + padding: 4rem 2rem + } + +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0 +} + +.alert { + position: relative; + padding: 1.15rem 1.15rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 2px +} + +.alert-heading { + color: inherit +} + +.alert-link { + font-weight: 700 +} + +.alert-dismissible { + padding-right: 3.8rem +} + +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 1.15rem 1.15rem; + color: inherit +} + +.alert-primary { + color: #023a03; + background-color: #cde2cd; + border-color: #b9d7b9 +} + +.alert-primary hr { + border-top-color: #a9cea9 +} + +.alert-primary .alert-link { + color: #000900 +} + +.alert-secondary { + color: #434343; + background-color: #e6e6e6; + border-color: #dbdbdb +} + +.alert-secondary hr { + border-top-color: #cecece +} + +.alert-secondary .alert-link { + color: #2a2a2a +} + +.alert-success { + color: #00744c; + background-color: #ccf9e9; + border-color: #b8f6e1 +} + +.alert-success hr { + border-top-color: #a1f3d7 +} + +.alert-success .alert-link { + color: #00412b +} + +.alert-info { + color: #383280; + background-color: #e2dffd; + border-color: #d6d3fc +} + +.alert-info hr { + border-top-color: #c0bbfa +} + +.alert-info .alert-link { + color: #28245b +} + +.alert-warning { + color: #7d4431; + background-color: #fce6df; + border-color: #fbdcd2 +} + +.alert-warning hr { + border-top-color: #f9cabb +} + +.alert-warning .alert-link { + color: #583023 +} + +.alert-danger { + color: #853135; + background-color: #ffdfe0; + border-color: #ffd2d4 +} + +.alert-danger hr { + border-top-color: #ffb9bc +} + +.alert-danger .alert-link { + color: #602326 +} + +.alert-light { + color: #747474; + background-color: #f9f9f9; + border-color: #f6f6f6 +} + +.alert-light hr { + border-top-color: #e9e9e9 +} + +.alert-light .alert-link { + color: #5b5b5b +} + +.alert-dark { + color: #3c3d40; + background-color: #e3e4e5; + border-color: #d8d9da +} + +.alert-dark hr { + border-top-color: #cbccce +} + +.alert-dark .alert-link { + color: #232426 +} + +.alert-white { + color: #858585; + background-color: #fff; + border-color: #fff +} + +.alert-white hr { + border-top-color: #f2f2f2 +} + +.alert-white .alert-link { + color: #6c6c6c +} + +.alert-orange { + color: #855600; + background-color: #ffedcc; + border-color: #ffe6b8 +} + +.alert-orange hr { + border-top-color: #ffdd9f +} + +.alert-orange .alert-link { + color: #523500 +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0 + } + + to { + background-position: 0 0 + } + +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0 + } + + to { + background-position: 0 0 + } + +} + +.progress { + display: -webkit-box; + display: flex; + height: 1rem; + overflow: hidden; + font-size: .75rem; + background-color: #f3f5f7; + border-radius: 2px +} + +.progress-bar { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + -webkit-box-pack: center; + justify-content: center; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #007bff; + -webkit-transition: width .6s ease; + transition: width .6s ease +} + +@media (prefers-reduced-motion:reduce) { + .progress-bar { + -webkit-transition: none; + transition: none + } + +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem +} + +.progress-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite +} + +@media (prefers-reduced-motion:reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none + } + +} + +.media { + display: -webkit-box; + display: flex; + -webkit-box-align: start; + align-items: flex-start +} + +.media-body { + -webkit-box-flex: 1; + flex: 1 +} + +.list-group { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + padding-left: 0; + margin-bottom: 0 +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit +} + +.list-group-item-action:focus, +.list-group-item-action:hover { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa +} + +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef +} + +.list-group-item { + position: relative; + display: block; + padding: .75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, .125) +} + +.list-group-item:first-child { + border-top-left-radius: .25rem; + border-top-right-radius: .25rem +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: .25rem +} + +.list-group-item.disabled, +.list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.list-group-horizontal { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row +} + +.list-group-horizontal .list-group-item { + margin-right: -1px; + margin-bottom: 0 +} + +.list-group-horizontal .list-group-item:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 +} + +.list-group-horizontal .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: 0 +} + +@media (min-width:576px) { + .list-group-horizontal-sm { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .list-group-horizontal-sm .list-group-item { + margin-right: -1px; + margin-bottom: 0 + } + + .list-group-horizontal-sm .list-group-item:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-sm .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: 0 + } + +} + +@media (min-width:768px) { + .list-group-horizontal-md { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .list-group-horizontal-md .list-group-item { + margin-right: -1px; + margin-bottom: 0 + } + + .list-group-horizontal-md .list-group-item:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-md .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: 0 + } + +} + +@media (min-width:992px) { + .list-group-horizontal-lg { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .list-group-horizontal-lg .list-group-item { + margin-right: -1px; + margin-bottom: 0 + } + + .list-group-horizontal-lg .list-group-item:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-lg .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: 0 + } + +} + +@media (min-width:1200px) { + .list-group-horizontal-xl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .list-group-horizontal-xl .list-group-item { + margin-right: -1px; + margin-bottom: 0 + } + + .list-group-horizontal-xl .list-group-item:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-xl .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: 0 + } + +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0 +} + +.list-group-flush .list-group-item:last-child { + margin-bottom: -1px +} + +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0 +} + +.list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; + border-bottom: 0 +} + +.list-group-item-primary { + color: #023a03; + background-color: #b9d7b9 +} + +.list-group-item-primary.list-group-item-action:focus, +.list-group-item-primary.list-group-item-action:hover { + color: #023a03; + background-color: #a9cea9 +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #023a03; + border-color: #023a03 +} + +.list-group-item-secondary { + color: #434343; + background-color: #dbdbdb +} + +.list-group-item-secondary.list-group-item-action:focus, +.list-group-item-secondary.list-group-item-action:hover { + color: #434343; + background-color: #cecece +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #434343; + border-color: #434343 +} + +.list-group-item-success { + color: #00744c; + background-color: #b8f6e1 +} + +.list-group-item-success.list-group-item-action:focus, +.list-group-item-success.list-group-item-action:hover { + color: #00744c; + background-color: #a1f3d7 +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #00744c; + border-color: #00744c +} + +.list-group-item-info { + color: #383280; + background-color: #d6d3fc +} + +.list-group-item-info.list-group-item-action:focus, +.list-group-item-info.list-group-item-action:hover { + color: #383280; + background-color: #c0bbfa +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #383280; + border-color: #383280 +} + +.list-group-item-warning { + color: #7d4431; + background-color: #fbdcd2 +} + +.list-group-item-warning.list-group-item-action:focus, +.list-group-item-warning.list-group-item-action:hover { + color: #7d4431; + background-color: #f9cabb +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #7d4431; + border-color: #7d4431 +} + +.list-group-item-danger { + color: #853135; + background-color: #ffd2d4 +} + +.list-group-item-danger.list-group-item-action:focus, +.list-group-item-danger.list-group-item-action:hover { + color: #853135; + background-color: #ffb9bc +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #853135; + border-color: #853135 +} + +.list-group-item-light { + color: #747474; + background-color: #f6f6f6 +} + +.list-group-item-light.list-group-item-action:focus, +.list-group-item-light.list-group-item-action:hover { + color: #747474; + background-color: #e9e9e9 +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #747474; + border-color: #747474 +} + +.list-group-item-dark { + color: #3c3d40; + background-color: #d8d9da +} + +.list-group-item-dark.list-group-item-action:focus, +.list-group-item-dark.list-group-item-action:hover { + color: #3c3d40; + background-color: #cbccce +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #3c3d40; + border-color: #3c3d40 +} + +.list-group-item-white { + color: #858585; + background-color: #fff +} + +.list-group-item-white.list-group-item-action:focus, +.list-group-item-white.list-group-item-action:hover { + color: #858585; + background-color: #f2f2f2 +} + +.list-group-item-white.list-group-item-action.active { + color: #fff; + background-color: #858585; + border-color: #858585 +} + +.list-group-item-orange { + color: #855600; + background-color: #ffe6b8 +} + +.list-group-item-orange.list-group-item-action:focus, +.list-group-item-orange.list-group-item-action:hover { + color: #855600; + background-color: #ffdd9f +} + +.list-group-item-orange.list-group-item-action.active { + color: #fff; + background-color: #855600; + border-color: #855600 +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5 +} + +.close:hover { + color: #000; + text-decoration: none +} + +.close:not(:disabled):not(.disabled):focus, +.close:not(:disabled):not(.disabled):hover { + opacity: .75 +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +a.close.disabled { + pointer-events: none +} + +.toast { + max-width: 350px; + overflow: hidden; + font-size: .875rem; + background-color: rgba(255, 255, 255, .85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .1); + box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .1); + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + opacity: 0; + border-radius: .25rem +} + +.toast:not(:last-child) { + margin-bottom: .75rem +} + +.toast.showing { + opacity: 1 +} + +.toast.show { + display: block; + opacity: 1 +} + +.toast.hide { + display: none +} + +.toast-header { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + padding: .25rem .75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, .85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, .05) +} + +.toast-body { + padding: .75rem +} + +.modal-open { + overflow: hidden +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0 +} + +.modal-dialog { + position: relative; + width: auto; + margin: .5rem; + pointer-events: none +} + +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + transition: -webkit-transform .3s ease-out; + transition: transform .3s ease-out; + transition: transform .3s ease-out, -webkit-transform .3s ease-out; + -webkit-transform: translate(0, -50px); + transform: translate(0, -50px) +} + +@media (prefers-reduced-motion:reduce) { + .modal.fade .modal-dialog { + -webkit-transition: none; + transition: none + } + +} + +.modal.show .modal-dialog { + -webkit-transform: none; + transform: none +} + +.modal-dialog-scrollable { + display: -webkit-box; + display: flex; + max-height: calc(100% - 1rem) +} + +.modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden +} + +.modal-dialog-scrollable .modal-footer, +.modal-dialog-scrollable .modal-header { + flex-shrink: 0 +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto +} + +.modal-dialog-centered { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + min-height: calc(100% - 1rem) +} + +.modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + content: 'http://www.w3.org/2000/svg' +} + +.modal-dialog-centered.modal-dialog-scrollable { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + -webkit-box-pack: center; + justify-content: center; + height: 100% +} + +.modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none +} + +.modal-dialog-centered.modal-dialog-scrollable::before { + content: none +} + +.modal-content { + position: relative; + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: .3rem; + outline: 0 +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000 +} + +.modal-backdrop.fade { + opacity: 0 +} + +.modal-backdrop.show { + opacity: .8 +} + +.modal-header { + display: -webkit-box; + display: flex; + -webkit-box-align: start; + align-items: flex-start; + -webkit-box-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: .3rem; + border-top-right-radius: .3rem +} + +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5 +} + +.modal-body { + position: relative; + -webkit-box-flex: 1; + flex: 1 1 auto; + padding: 1rem +} + +.modal-footer { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: end; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: .3rem; + border-bottom-left-radius: .3rem +} + +.modal-footer>:not(:first-child) { + margin-left: .25rem +} + +.modal-footer>:not(:last-child) { + margin-right: .25rem +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll +} + +@media (min-width:576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto + } + + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem) + } + + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem) + } + + .modal-dialog-centered { + min-height: calc(100% - 3.5rem) + } + + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem) + } + + .modal-sm { + max-width: 300px + } + +} + +@media (min-width:992px) { + .modal-lg, + .modal-xl { + max-width: 800px + } + +} + +@media (min-width:1200px) { + .modal-xl { + max-width: 1140px + } + +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.7; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: .875rem; + word-wrap: break-word; + opacity: 0 +} + +.tooltip.show { + opacity: .9 +} + +.tooltip .arrow { + position: absolute; + display: block; + width: .8rem; + height: .4rem +} + +.tooltip .arrow::before { + position: absolute; + content: '%23dc3545'; + border-color: transparent; + border-style: solid +} + +.bs-tooltip-auto[x-placement^=top], +.bs-tooltip-top { + padding: .4rem 0 +} + +.bs-tooltip-auto[x-placement^=top] .arrow, +.bs-tooltip-top .arrow { + bottom: 0 +} + +.bs-tooltip-auto[x-placement^=top] .arrow::before, +.bs-tooltip-top .arrow::before { + top: 0; + border-width: .4rem .4rem 0; + border-top-color: #000 +} + +.bs-tooltip-auto[x-placement^=right], +.bs-tooltip-right { + padding: 0 .4rem +} + +.bs-tooltip-auto[x-placement^=right] .arrow, +.bs-tooltip-right .arrow { + left: 0; + width: .4rem; + height: .8rem +} + +.bs-tooltip-auto[x-placement^=right] .arrow::before, +.bs-tooltip-right .arrow::before { + right: 0; + border-width: .4rem .4rem .4rem 0; + border-right-color: #000 +} + +.bs-tooltip-auto[x-placement^=bottom], +.bs-tooltip-bottom { + padding: .4rem 0 +} + +.bs-tooltip-auto[x-placement^=bottom] .arrow, +.bs-tooltip-bottom .arrow { + top: 0 +} + +.bs-tooltip-auto[x-placement^=bottom] .arrow::before, +.bs-tooltip-bottom .arrow::before { + bottom: 0; + border-width: 0 .4rem .4rem; + border-bottom-color: #000 +} + +.bs-tooltip-auto[x-placement^=left], +.bs-tooltip-left { + padding: 0 .4rem +} + +.bs-tooltip-auto[x-placement^=left] .arrow, +.bs-tooltip-left .arrow { + right: 0; + width: .4rem; + height: .8rem +} + +.bs-tooltip-auto[x-placement^=left] .arrow::before, +.bs-tooltip-left .arrow::before { + left: 0; + border-width: .4rem 0 .4rem .4rem; + border-left-color: #000 +} + +.tooltip-inner { + max-width: 200px; + padding: .25rem .5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: .25rem +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.7; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: .875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: .3rem +} + +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: .5rem; + margin: 0 6px +} + +.popover .arrow::after, +.popover .arrow::before { + position: absolute; + display: block; + content: '-2 -2 7 7'; + border-color: transparent; + border-style: solid +} + +.bs-popover-auto[x-placement^=top], +.bs-popover-top { + margin-bottom: .5rem +} + +.bs-popover-auto[x-placement^=top]>.arrow, +.bs-popover-top>.arrow { + bottom: calc((.5rem + 1px) * -1) +} + +.bs-popover-auto[x-placement^=top]>.arrow::before, +.bs-popover-top>.arrow::before { + bottom: 0; + border-width: .5rem .5rem 0; + border-top-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[x-placement^=top]>.arrow::after, +.bs-popover-top>.arrow::after { + bottom: 1px; + border-width: .5rem .5rem 0; + border-top-color: #fff +} + +.bs-popover-auto[x-placement^=right], +.bs-popover-right { + margin-left: .5rem +} + +.bs-popover-auto[x-placement^=right]>.arrow, +.bs-popover-right>.arrow { + left: calc((.5rem + 1px) * -1); + width: .5rem; + height: 1rem; + margin: 6px 0 +} + +.bs-popover-auto[x-placement^=right]>.arrow::before, +.bs-popover-right>.arrow::before { + left: 0; + border-width: .5rem .5rem .5rem 0; + border-right-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[x-placement^=right]>.arrow::after, +.bs-popover-right>.arrow::after { + left: 1px; + border-width: .5rem .5rem .5rem 0; + border-right-color: #fff +} + +.bs-popover-auto[x-placement^=bottom], +.bs-popover-bottom { + margin-top: .5rem +} + +.bs-popover-auto[x-placement^=bottom]>.arrow, +.bs-popover-bottom>.arrow { + top: calc((.5rem + 1px) * -1) +} + +.bs-popover-auto[x-placement^=bottom]>.arrow::before, +.bs-popover-bottom>.arrow::before { + top: 0; + border-width: 0 .5rem .5rem .5rem; + border-bottom-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[x-placement^=bottom]>.arrow::after, +.bs-popover-bottom>.arrow::after { + top: 1px; + border-width: 0 .5rem .5rem .5rem; + border-bottom-color: #fff +} + +.bs-popover-auto[x-placement^=bottom] .popover-header::before, +.bs-popover-bottom .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -.5rem; + content: '%23dc3545'; + border-bottom: 1px solid #f7f7f7 +} + +.bs-popover-auto[x-placement^=left], +.bs-popover-left { + margin-right: .5rem +} + +.bs-popover-auto[x-placement^=left]>.arrow, +.bs-popover-left>.arrow { + right: calc((.5rem + 1px) * -1); + width: .5rem; + height: 1rem; + margin: 6px 0 +} + +.bs-popover-auto[x-placement^=left]>.arrow::before, +.bs-popover-left>.arrow::before { + right: 0; + border-width: .5rem 0 .5rem .5rem; + border-left-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[x-placement^=left]>.arrow::after, +.bs-popover-left>.arrow::after { + right: 1px; + border-width: .5rem 0 .5rem .5rem; + border-left-color: #fff +} + +.popover-header { + padding: .5rem .75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(6px - 1px); + border-top-right-radius: calc(6px - 1px) +} + +.popover-header:empty { + display: none +} + +.popover-body { + padding: .5rem .75rem; + color: #212529 +} + +.carousel { + position: relative +} + +.carousel.pointer-event { + touch-action: pan-y +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} + +.carousel-inner::after { + display: block; + clear: both; + content: 'M0 0l3 3m0-3L0 3' +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transition: -webkit-transform .6s ease-in-out; + transition: -webkit-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + transition: transform .6s ease-in-out, -webkit-transform .6s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .carousel-item { + -webkit-transition: none; + transition: none + } + +} + +.carousel-item-next, +.carousel-item-prev, +.carousel-item.active { + display: block +} + +.active.carousel-item-right, +.carousel-item-next:not(.carousel-item-left) { + -webkit-transform: translateX(100%); + transform: translateX(100%) +} + +.active.carousel-item-left, +.carousel-item-prev:not(.carousel-item-right) { + -webkit-transform: translateX(-100%); + transform: translateX(-100%) +} + +.carousel-fade .carousel-item { + opacity: 0; + -webkit-transition-property: opacity; + transition-property: opacity; + -webkit-transform: none; + transform: none +} + +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right, +.carousel-fade .carousel-item.active { + z-index: 1; + opacity: 1 +} + +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + -webkit-transition: 0s .6s opacity; + transition: 0s .6s opacity +} + +@media (prefers-reduced-motion:reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + -webkit-transition: none; + transition: none + } + +} + +.carousel-control-next, +.carousel-control-prev { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: .5; + -webkit-transition: opacity .15s ease; + transition: opacity .15s ease +} + +@media (prefers-reduced-motion:reduce) { + .carousel-control-next, + .carousel-control-prev { + -webkit-transition: none; + transition: none + } + +} + +.carousel-control-next:focus, +.carousel-control-next:hover, +.carousel-control-prev:focus, +.carousel-control-prev:hover { + color: #fff; + text-decoration: none; + outline: 0; + opacity: .9 +} + +.carousel-control-prev { + left: 0 +} + +.carousel-control-next { + right: 0 +} + +.carousel-control-next-icon, +.carousel-control-prev-icon { + display: inline-block; + width: 20px; + height: 20px; + background: no-repeat 50%/100% 100% +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e") +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e") +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: -webkit-box; + display: flex; + -webkit-box-pack: center; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none +} + +.carousel-indicators li { + box-sizing: content-box; + -webkit-box-flex: 0; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + -webkit-transition: opacity .6s ease; + transition: opacity .6s ease +} + +@media (prefers-reduced-motion:reduce) { + .carousel-indicators li { + -webkit-transition: none; + transition: none + } + +} + +.carousel-indicators .active { + opacity: 1 +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center +} + +@-webkit-keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } + +} + +@keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } + +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: .25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: spinner-border .75s linear infinite; + animation: spinner-border .75s linear infinite +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: .2em +} + +@-webkit-keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0) + } + + 50% { + opacity: 1 + } + +} + +@keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0) + } + + 50% { + opacity: 1 + } + +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: spinner-grow .75s linear infinite; + animation: spinner-grow .75s linear infinite +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem +} + +.align-baseline { + vertical-align: baseline !important +} + +.align-top { + vertical-align: top !important +} + +.align-middle { + vertical-align: middle !important +} + +.align-bottom { + vertical-align: bottom !important +} + +.align-text-bottom { + vertical-align: text-bottom !important +} + +.align-text-top { + vertical-align: text-top !important +} + +.bg-primary { + background-color: #047006 !important +} + +a.bg-primary:focus, +a.bg-primary:hover, +button.bg-primary:focus, +button.bg-primary:hover { + background-color: #023f03 !important +} + +.bg-secondary { + background-color: grey !important +} + +a.bg-secondary:focus, +a.bg-secondary:hover, +button.bg-secondary:focus, +button.bg-secondary:hover { + background-color: #676767 !important +} + +.bg-success { + background-color: #00e093 !important +} + +a.bg-success:focus, +a.bg-success:hover, +button.bg-success:focus, +button.bg-success:hover { + background-color: #00ad72 !important +} + +.bg-info { + background-color: #6c61f6 !important +} + +a.bg-info:focus, +a.bg-info:hover, +button.bg-info:focus, +button.bg-info:hover { + background-color: #3f31f3 !important +} + +.bg-warning { + background-color: #f0825f !important +} + +a.bg-warning:focus, +a.bg-warning:hover, +button.bg-warning:focus, +button.bg-warning:hover { + background-color: #ec5e30 !important +} + +.bg-danger { + background-color: #ff5f66 !important +} + +a.bg-danger:focus, +a.bg-danger:hover, +button.bg-danger:focus, +button.bg-danger:hover { + background-color: #ff2c35 !important +} + +.bg-light { + background-color: #dfdfdf !important +} + +a.bg-light:focus, +a.bg-light:hover, +button.bg-light:focus, +button.bg-light:hover { + background-color: #c6c6c6 !important +} + +.bg-dark { + background-color: #74767b !important +} + +a.bg-dark:focus, +a.bg-dark:hover, +button.bg-dark:focus, +button.bg-dark:hover { + background-color: #5b5d61 !important +} + +.bg-white { + background-color: #fff !important +} + +a.bg-white:focus, +a.bg-white:hover, +button.bg-white:focus, +button.bg-white:hover { + background-color: #e6e6e6 !important +} + +.bg-orange { + background-color: #ffa600 !important +} + +a.bg-orange:focus, +a.bg-orange:hover, +button.bg-orange:focus, +button.bg-orange:hover { + background-color: #cc8500 !important +} + +.bg-white { + background-color: #fff !important +} + +.bg-transparent { + background-color: transparent !important +} + +.border { + border: 1px solid #f2f4f9 !important +} + +.border-top { + border-top: 1px solid #f2f4f9 !important +} + +.border-right { + border-right: 1px solid #f2f4f9 !important +} + +.border-bottom { + border-bottom: 1px solid #f2f4f9 !important +} + +.border-left { + border-left: 1px solid #f2f4f9 !important +} + +.border-0 { + border: 0 !important +} + +.border-top-0 { + border-top: 0 !important +} + +.border-right-0 { + border-right: 0 !important +} + +.border-bottom-0 { + border-bottom: 0 !important +} + +.border-left-0 { + border-left: 0 !important +} + +.border-primary { + border-color: #047006 !important +} + +.border-secondary { + border-color: grey !important +} + +.border-success { + border-color: #00e093 !important +} + +.border-info { + border-color: #6c61f6 !important +} + +.border-warning { + border-color: #f0825f !important +} + +.border-danger { + border-color: #ff5f66 !important +} + +.border-light { + border-color: #dfdfdf !important +} + +.border-dark { + border-color: #74767b !important +} + +.border-white { + border-color: #fff !important +} + +.border-orange { + border-color: #ffa600 !important +} + +.border-white { + border-color: #fff !important +} + +.rounded-sm { + border-radius: .2rem !important +} + +.rounded { + border-radius: 2px !important +} + +.rounded-top { + border-top-left-radius: 2px !important; + border-top-right-radius: 2px !important +} + +.rounded-right { + border-top-right-radius: 2px !important; + border-bottom-right-radius: 2px !important +} + +.rounded-bottom { + border-bottom-right-radius: 2px !important; + border-bottom-left-radius: 2px !important +} + +.rounded-left { + border-top-left-radius: 2px !important; + border-bottom-left-radius: 2px !important +} + +.rounded-lg { + border-radius: 6px !important +} + +.rounded-circle { + border-radius: 50% !important +} + +.rounded-pill { + border-radius: 50rem !important +} + +.rounded-0 { + border-radius: 0 !important +} + +.clearfix::after { + display: block; + clear: both; + content: '.5' +} + +.d-none { + display: none !important +} + +.d-inline { + display: inline !important +} + +.d-inline-block { + display: inline-block !important +} + +.d-block { + display: block !important +} + +.d-table { + display: table !important +} + +.d-table-row { + display: table-row !important +} + +.d-table-cell { + display: table-cell !important +} + +.d-flex { + display: -webkit-box !important; + display: flex !important +} + +.d-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important +} + +@media (min-width:576px) { + .d-sm-none { + display: none !important + } + + .d-sm-inline { + display: inline !important + } + + .d-sm-inline-block { + display: inline-block !important + } + + .d-sm-block { + display: block !important + } + + .d-sm-table { + display: table !important + } + + .d-sm-table-row { + display: table-row !important + } + + .d-sm-table-cell { + display: table-cell !important + } + + .d-sm-flex { + display: -webkit-box !important; + display: flex !important + } + + .d-sm-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important + } + +} + +@media (min-width:768px) { + .d-md-none { + display: none !important + } + + .d-md-inline { + display: inline !important + } + + .d-md-inline-block { + display: inline-block !important + } + + .d-md-block { + display: block !important + } + + .d-md-table { + display: table !important + } + + .d-md-table-row { + display: table-row !important + } + + .d-md-table-cell { + display: table-cell !important + } + + .d-md-flex { + display: -webkit-box !important; + display: flex !important + } + + .d-md-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important + } + +} + +@media (min-width:992px) { + .d-lg-none { + display: none !important + } + + .d-lg-inline { + display: inline !important + } + + .d-lg-inline-block { + display: inline-block !important + } + + .d-lg-block { + display: block !important + } + + .d-lg-table { + display: table !important + } + + .d-lg-table-row { + display: table-row !important + } + + .d-lg-table-cell { + display: table-cell !important + } + + .d-lg-flex { + display: -webkit-box !important; + display: flex !important + } + + .d-lg-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important + } + +} + +@media (min-width:1200px) { + .d-xl-none { + display: none !important + } + + .d-xl-inline { + display: inline !important + } + + .d-xl-inline-block { + display: inline-block !important + } + + .d-xl-block { + display: block !important + } + + .d-xl-table { + display: table !important + } + + .d-xl-table-row { + display: table-row !important + } + + .d-xl-table-cell { + display: table-cell !important + } + + .d-xl-flex { + display: -webkit-box !important; + display: flex !important + } + + .d-xl-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important + } + +} + +@media print { + .d-print-none { + display: none !important + } + + .d-print-inline { + display: inline !important + } + + .d-print-inline-block { + display: inline-block !important + } + + .d-print-block { + display: block !important + } + + .d-print-table { + display: table !important + } + + .d-print-table-row { + display: table-row !important + } + + .d-print-table-cell { + display: table-cell !important + } + + .d-print-flex { + display: -webkit-box !important; + display: flex !important + } + + .d-print-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important + } + +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden +} + +.embed-responsive::before { + display: block; + content: '3' +} + +.embed-responsive .embed-responsive-item, +.embed-responsive embed, +.embed-responsive iframe, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0 +} + +.embed-responsive-21by9::before { + padding-top: 42.85714% +} + +.embed-responsive-16by9::before { + padding-top: 56.25% +} + +.embed-responsive-4by3::before { + padding-top: 75% +} + +.embed-responsive-1by1::before { + padding-top: 100% +} + +.embed-responsive-21by9::before { + padding-top: 42.85714% +} + +.embed-responsive-16by9::before { + padding-top: 56.25% +} + +.embed-responsive-4by3::before { + padding-top: 75% +} + +.embed-responsive-1by1::before { + padding-top: 100% +} + +.flex-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + flex-direction: row !important +} + +.flex-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + flex-direction: column !important +} + +.flex-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + flex-direction: row-reverse !important +} + +.flex-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + flex-direction: column-reverse !important +} + +.flex-wrap { + flex-wrap: wrap !important +} + +.flex-nowrap { + flex-wrap: nowrap !important +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important +} + +.flex-fill { + -webkit-box-flex: 1 !important; + flex: 1 1 auto !important +} + +.flex-grow-0 { + -webkit-box-flex: 0 !important; + flex-grow: 0 !important +} + +.flex-grow-1 { + -webkit-box-flex: 1 !important; + flex-grow: 1 !important +} + +.flex-shrink-0 { + flex-shrink: 0 !important +} + +.flex-shrink-1 { + flex-shrink: 1 !important +} + +.justify-content-start { + -webkit-box-pack: start !important; + justify-content: flex-start !important +} + +.justify-content-end { + -webkit-box-pack: end !important; + justify-content: flex-end !important +} + +.justify-content-center { + -webkit-box-pack: center !important; + justify-content: center !important +} + +.justify-content-between { + -webkit-box-pack: justify !important; + justify-content: space-between !important +} + +.justify-content-around { + justify-content: space-around !important +} + +.align-items-start { + -webkit-box-align: start !important; + align-items: flex-start !important +} + +.align-items-end { + -webkit-box-align: end !important; + align-items: flex-end !important +} + +.align-items-center { + -webkit-box-align: center !important; + align-items: center !important +} + +.align-items-baseline { + -webkit-box-align: baseline !important; + align-items: baseline !important +} + +.align-items-stretch { + -webkit-box-align: stretch !important; + align-items: stretch !important +} + +.align-content-start { + align-content: flex-start !important +} + +.align-content-end { + align-content: flex-end !important +} + +.align-content-center { + align-content: center !important +} + +.align-content-between { + align-content: space-between !important +} + +.align-content-around { + align-content: space-around !important +} + +.align-content-stretch { + align-content: stretch !important +} + +.align-self-auto { + align-self: auto !important +} + +.align-self-start { + align-self: flex-start !important +} + +.align-self-end { + align-self: flex-end !important +} + +.align-self-center { + align-self: center !important +} + +.align-self-baseline { + align-self: baseline !important +} + +.align-self-stretch { + align-self: stretch !important +} + +@media (min-width:576px) { + .flex-sm-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + flex-direction: row !important + } + + .flex-sm-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + flex-direction: column !important + } + + .flex-sm-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + flex-direction: row-reverse !important + } + + .flex-sm-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + flex-direction: column-reverse !important + } + + .flex-sm-wrap { + flex-wrap: wrap !important + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-sm-fill { + -webkit-box-flex: 1 !important; + flex: 1 1 auto !important + } + + .flex-sm-grow-0 { + -webkit-box-flex: 0 !important; + flex-grow: 0 !important + } + + .flex-sm-grow-1 { + -webkit-box-flex: 1 !important; + flex-grow: 1 !important + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-sm-start { + -webkit-box-pack: start !important; + justify-content: flex-start !important + } + + .justify-content-sm-end { + -webkit-box-pack: end !important; + justify-content: flex-end !important + } + + .justify-content-sm-center { + -webkit-box-pack: center !important; + justify-content: center !important + } + + .justify-content-sm-between { + -webkit-box-pack: justify !important; + justify-content: space-between !important + } + + .justify-content-sm-around { + justify-content: space-around !important + } + + .align-items-sm-start { + -webkit-box-align: start !important; + align-items: flex-start !important + } + + .align-items-sm-end { + -webkit-box-align: end !important; + align-items: flex-end !important + } + + .align-items-sm-center { + -webkit-box-align: center !important; + align-items: center !important + } + + .align-items-sm-baseline { + -webkit-box-align: baseline !important; + align-items: baseline !important + } + + .align-items-sm-stretch { + -webkit-box-align: stretch !important; + align-items: stretch !important + } + + .align-content-sm-start { + align-content: flex-start !important + } + + .align-content-sm-end { + align-content: flex-end !important + } + + .align-content-sm-center { + align-content: center !important + } + + .align-content-sm-between { + align-content: space-between !important + } + + .align-content-sm-around { + align-content: space-around !important + } + + .align-content-sm-stretch { + align-content: stretch !important + } + + .align-self-sm-auto { + align-self: auto !important + } + + .align-self-sm-start { + align-self: flex-start !important + } + + .align-self-sm-end { + align-self: flex-end !important + } + + .align-self-sm-center { + align-self: center !important + } + + .align-self-sm-baseline { + align-self: baseline !important + } + + .align-self-sm-stretch { + align-self: stretch !important + } + +} + +@media (min-width:768px) { + .flex-md-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + flex-direction: row !important + } + + .flex-md-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + flex-direction: column !important + } + + .flex-md-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + flex-direction: row-reverse !important + } + + .flex-md-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + flex-direction: column-reverse !important + } + + .flex-md-wrap { + flex-wrap: wrap !important + } + + .flex-md-nowrap { + flex-wrap: nowrap !important + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-md-fill { + -webkit-box-flex: 1 !important; + flex: 1 1 auto !important + } + + .flex-md-grow-0 { + -webkit-box-flex: 0 !important; + flex-grow: 0 !important + } + + .flex-md-grow-1 { + -webkit-box-flex: 1 !important; + flex-grow: 1 !important + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-md-start { + -webkit-box-pack: start !important; + justify-content: flex-start !important + } + + .justify-content-md-end { + -webkit-box-pack: end !important; + justify-content: flex-end !important + } + + .justify-content-md-center { + -webkit-box-pack: center !important; + justify-content: center !important + } + + .justify-content-md-between { + -webkit-box-pack: justify !important; + justify-content: space-between !important + } + + .justify-content-md-around { + justify-content: space-around !important + } + + .align-items-md-start { + -webkit-box-align: start !important; + align-items: flex-start !important + } + + .align-items-md-end { + -webkit-box-align: end !important; + align-items: flex-end !important + } + + .align-items-md-center { + -webkit-box-align: center !important; + align-items: center !important + } + + .align-items-md-baseline { + -webkit-box-align: baseline !important; + align-items: baseline !important + } + + .align-items-md-stretch { + -webkit-box-align: stretch !important; + align-items: stretch !important + } + + .align-content-md-start { + align-content: flex-start !important + } + + .align-content-md-end { + align-content: flex-end !important + } + + .align-content-md-center { + align-content: center !important + } + + .align-content-md-between { + align-content: space-between !important + } + + .align-content-md-around { + align-content: space-around !important + } + + .align-content-md-stretch { + align-content: stretch !important + } + + .align-self-md-auto { + align-self: auto !important + } + + .align-self-md-start { + align-self: flex-start !important + } + + .align-self-md-end { + align-self: flex-end !important + } + + .align-self-md-center { + align-self: center !important + } + + .align-self-md-baseline { + align-self: baseline !important + } + + .align-self-md-stretch { + align-self: stretch !important + } + +} + +@media (min-width:992px) { + .flex-lg-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + flex-direction: row !important + } + + .flex-lg-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + flex-direction: column !important + } + + .flex-lg-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + flex-direction: row-reverse !important + } + + .flex-lg-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + flex-direction: column-reverse !important + } + + .flex-lg-wrap { + flex-wrap: wrap !important + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-lg-fill { + -webkit-box-flex: 1 !important; + flex: 1 1 auto !important + } + + .flex-lg-grow-0 { + -webkit-box-flex: 0 !important; + flex-grow: 0 !important + } + + .flex-lg-grow-1 { + -webkit-box-flex: 1 !important; + flex-grow: 1 !important + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-lg-start { + -webkit-box-pack: start !important; + justify-content: flex-start !important + } + + .justify-content-lg-end { + -webkit-box-pack: end !important; + justify-content: flex-end !important + } + + .justify-content-lg-center { + -webkit-box-pack: center !important; + justify-content: center !important + } + + .justify-content-lg-between { + -webkit-box-pack: justify !important; + justify-content: space-between !important + } + + .justify-content-lg-around { + justify-content: space-around !important + } + + .align-items-lg-start { + -webkit-box-align: start !important; + align-items: flex-start !important + } + + .align-items-lg-end { + -webkit-box-align: end !important; + align-items: flex-end !important + } + + .align-items-lg-center { + -webkit-box-align: center !important; + align-items: center !important + } + + .align-items-lg-baseline { + -webkit-box-align: baseline !important; + align-items: baseline !important + } + + .align-items-lg-stretch { + -webkit-box-align: stretch !important; + align-items: stretch !important + } + + .align-content-lg-start { + align-content: flex-start !important + } + + .align-content-lg-end { + align-content: flex-end !important + } + + .align-content-lg-center { + align-content: center !important + } + + .align-content-lg-between { + align-content: space-between !important + } + + .align-content-lg-around { + align-content: space-around !important + } + + .align-content-lg-stretch { + align-content: stretch !important + } + + .align-self-lg-auto { + align-self: auto !important + } + + .align-self-lg-start { + align-self: flex-start !important + } + + .align-self-lg-end { + align-self: flex-end !important + } + + .align-self-lg-center { + align-self: center !important + } + + .align-self-lg-baseline { + align-self: baseline !important + } + + .align-self-lg-stretch { + align-self: stretch !important + } + +} + +@media (min-width:1200px) { + .flex-xl-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + flex-direction: row !important + } + + .flex-xl-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + flex-direction: column !important + } + + .flex-xl-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + flex-direction: row-reverse !important + } + + .flex-xl-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + flex-direction: column-reverse !important + } + + .flex-xl-wrap { + flex-wrap: wrap !important + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-xl-fill { + -webkit-box-flex: 1 !important; + flex: 1 1 auto !important + } + + .flex-xl-grow-0 { + -webkit-box-flex: 0 !important; + flex-grow: 0 !important + } + + .flex-xl-grow-1 { + -webkit-box-flex: 1 !important; + flex-grow: 1 !important + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-xl-start { + -webkit-box-pack: start !important; + justify-content: flex-start !important + } + + .justify-content-xl-end { + -webkit-box-pack: end !important; + justify-content: flex-end !important + } + + .justify-content-xl-center { + -webkit-box-pack: center !important; + justify-content: center !important + } + + .justify-content-xl-between { + -webkit-box-pack: justify !important; + justify-content: space-between !important + } + + .justify-content-xl-around { + justify-content: space-around !important + } + + .align-items-xl-start { + -webkit-box-align: start !important; + align-items: flex-start !important + } + + .align-items-xl-end { + -webkit-box-align: end !important; + align-items: flex-end !important + } + + .align-items-xl-center { + -webkit-box-align: center !important; + align-items: center !important + } + + .align-items-xl-baseline { + -webkit-box-align: baseline !important; + align-items: baseline !important + } + + .align-items-xl-stretch { + -webkit-box-align: stretch !important; + align-items: stretch !important + } + + .align-content-xl-start { + align-content: flex-start !important + } + + .align-content-xl-end { + align-content: flex-end !important + } + + .align-content-xl-center { + align-content: center !important + } + + .align-content-xl-between { + align-content: space-between !important + } + + .align-content-xl-around { + align-content: space-around !important + } + + .align-content-xl-stretch { + align-content: stretch !important + } + + .align-self-xl-auto { + align-self: auto !important + } + + .align-self-xl-start { + align-self: flex-start !important + } + + .align-self-xl-end { + align-self: flex-end !important + } + + .align-self-xl-center { + align-self: center !important + } + + .align-self-xl-baseline { + align-self: baseline !important + } + + .align-self-xl-stretch { + align-self: stretch !important + } + +} + +.float-left { + float: left !important +} + +.float-right { + float: right !important +} + +.float-none { + float: none !important +} + +@media (min-width:576px) { + .float-sm-left { + float: left !important + } + + .float-sm-right { + float: right !important + } + + .float-sm-none { + float: none !important + } + +} + +@media (min-width:768px) { + .float-md-left { + float: left !important + } + + .float-md-right { + float: right !important + } + + .float-md-none { + float: none !important + } + +} + +@media (min-width:992px) { + .float-lg-left { + float: left !important + } + + .float-lg-right { + float: right !important + } + + .float-lg-none { + float: none !important + } + +} + +@media (min-width:1200px) { + .float-xl-left { + float: left !important + } + + .float-xl-right { + float: right !important + } + + .float-xl-none { + float: none !important + } + +} + +.overflow-auto { + overflow: auto !important +} + +.overflow-hidden { + overflow: hidden !important +} + +.position-static { + position: static !important +} + +.position-relative { + position: relative !important +} + +.position-absolute { + position: absolute !important +} + +.position-fixed { + position: fixed !important +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030 +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030 +} + +@supports ((position:-webkit-sticky) or (position:sticky)) { + .sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } + +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0 +} + +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal +} + +.shadow-sm { + box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important +} + +.shadow { + box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15) !important +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, .175) !important +} + +.shadow-none { + box-shadow: none !important +} + +.w-25 { + width: 25% !important +} + +.w-50 { + width: 50% !important +} + +.w-75 { + width: 75% !important +} + +.w-100 { + width: 100% !important +} + +.w-auto { + width: auto !important +} + +.h-25 { + height: 25% !important +} + +.h-50 { + height: 50% !important +} + +.h-75 { + height: 75% !important +} + +.h-100 { + height: 100% !important +} + +.h-auto { + height: auto !important +} + +.mw-100 { + max-width: 100% !important +} + +.mh-100 { + max-height: 100% !important +} + +.min-vw-100 { + min-width: 100vw !important +} + +.min-vh-100 { + min-height: 100vh !important +} + +.vw-100 { + width: 100vw !important +} + +.vh-100 { + height: 100vh !important +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: '.5'; + background-color: rgba(0, 0, 0, 0) +} + +.m-0 { + margin: 0 !important +} + +.mt-0, +.my-0 { + margin-top: 0 !important +} + +.mr-0, +.mx-0 { + margin-right: 0 !important +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important +} + +.ml-0, +.mx-0 { + margin-left: 0 !important +} + +.m-1 { + margin: .25rem !important +} + +.mt-1, +.my-1 { + margin-top: .25rem !important +} + +.mr-1, +.mx-1 { + margin-right: .25rem !important +} + +.mb-1, +.my-1 { + margin-bottom: .25rem !important +} + +.ml-1, +.mx-1 { + margin-left: .25rem !important +} + +.m-2 { + margin: .5rem !important +} + +.mt-2, +.my-2 { + margin-top: .5rem !important +} + +.mr-2, +.mx-2 { + margin-right: .5rem !important +} + +.mb-2, +.my-2 { + margin-bottom: .5rem !important +} + +.ml-2, +.mx-2 { + margin-left: .5rem !important +} + +.m-3 { + margin: 1rem !important +} + +.mt-3, +.my-3 { + margin-top: 1rem !important +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important +} + +.m-4 { + margin: 1.5rem !important +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important +} + +.m-5 { + margin: 3rem !important +} + +.mt-5, +.my-5 { + margin-top: 3rem !important +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important +} + +.p-0 { + padding: 0 !important +} + +.pt-0, +.py-0 { + padding-top: 0 !important +} + +.pr-0, +.px-0 { + padding-right: 0 !important +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important +} + +.pl-0, +.px-0 { + padding-left: 0 !important +} + +.p-1 { + padding: .25rem !important +} + +.pt-1, +.py-1 { + padding-top: .25rem !important +} + +.pr-1, +.px-1 { + padding-right: .25rem !important +} + +.pb-1, +.py-1 { + padding-bottom: .25rem !important +} + +.pl-1, +.px-1 { + padding-left: .25rem !important +} + +.p-2 { + padding: .5rem !important +} + +.pt-2, +.py-2 { + padding-top: .5rem !important +} + +.pr-2, +.px-2 { + padding-right: .5rem !important +} + +.pb-2, +.py-2 { + padding-bottom: .5rem !important +} + +.pl-2, +.px-2 { + padding-left: .5rem !important +} + +.p-3 { + padding: 1rem !important +} + +.pt-3, +.py-3 { + padding-top: 1rem !important +} + +.pr-3, +.px-3 { + padding-right: 1rem !important +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important +} + +.pl-3, +.px-3 { + padding-left: 1rem !important +} + +.p-4 { + padding: 1.5rem !important +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important +} + +.p-5 { + padding: 3rem !important +} + +.pt-5, +.py-5 { + padding-top: 3rem !important +} + +.pr-5, +.px-5 { + padding-right: 3rem !important +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important +} + +.pl-5, +.px-5 { + padding-left: 3rem !important +} + +.m-n1 { + margin: -.25rem !important +} + +.mt-n1, +.my-n1 { + margin-top: -.25rem !important +} + +.mr-n1, +.mx-n1 { + margin-right: -.25rem !important +} + +.mb-n1, +.my-n1 { + margin-bottom: -.25rem !important +} + +.ml-n1, +.mx-n1 { + margin-left: -.25rem !important +} + +.m-n2 { + margin: -.5rem !important +} + +.mt-n2, +.my-n2 { + margin-top: -.5rem !important +} + +.mr-n2, +.mx-n2 { + margin-right: -.5rem !important +} + +.mb-n2, +.my-n2 { + margin-bottom: -.5rem !important +} + +.ml-n2, +.mx-n2 { + margin-left: -.5rem !important +} + +.m-n3 { + margin: -1rem !important +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important +} + +.m-n4 { + margin: -1.5rem !important +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important +} + +.m-n5 { + margin: -3rem !important +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important +} + +.m-auto { + margin: auto !important +} + +.mt-auto, +.my-auto { + margin-top: auto !important +} + +.mr-auto, +.mx-auto { + margin-right: auto !important +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important +} + +.ml-auto, +.mx-auto { + margin-left: auto !important +} + +@media (min-width:576px) { + .m-sm-0 { + margin: 0 !important + } + + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important + } + + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important + } + + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important + } + + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important + } + + .m-sm-1 { + margin: .25rem !important + } + + .mt-sm-1, + .my-sm-1 { + margin-top: .25rem !important + } + + .mr-sm-1, + .mx-sm-1 { + margin-right: .25rem !important + } + + .mb-sm-1, + .my-sm-1 { + margin-bottom: .25rem !important + } + + .ml-sm-1, + .mx-sm-1 { + margin-left: .25rem !important + } + + .m-sm-2 { + margin: .5rem !important + } + + .mt-sm-2, + .my-sm-2 { + margin-top: .5rem !important + } + + .mr-sm-2, + .mx-sm-2 { + margin-right: .5rem !important + } + + .mb-sm-2, + .my-sm-2 { + margin-bottom: .5rem !important + } + + .ml-sm-2, + .mx-sm-2 { + margin-left: .5rem !important + } + + .m-sm-3 { + margin: 1rem !important + } + + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important + } + + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important + } + + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important + } + + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important + } + + .m-sm-4 { + margin: 1.5rem !important + } + + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important + } + + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important + } + + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important + } + + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important + } + + .m-sm-5 { + margin: 3rem !important + } + + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important + } + + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important + } + + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important + } + + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important + } + + .p-sm-0 { + padding: 0 !important + } + + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important + } + + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important + } + + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important + } + + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important + } + + .p-sm-1 { + padding: .25rem !important + } + + .pt-sm-1, + .py-sm-1 { + padding-top: .25rem !important + } + + .pr-sm-1, + .px-sm-1 { + padding-right: .25rem !important + } + + .pb-sm-1, + .py-sm-1 { + padding-bottom: .25rem !important + } + + .pl-sm-1, + .px-sm-1 { + padding-left: .25rem !important + } + + .p-sm-2 { + padding: .5rem !important + } + + .pt-sm-2, + .py-sm-2 { + padding-top: .5rem !important + } + + .pr-sm-2, + .px-sm-2 { + padding-right: .5rem !important + } + + .pb-sm-2, + .py-sm-2 { + padding-bottom: .5rem !important + } + + .pl-sm-2, + .px-sm-2 { + padding-left: .5rem !important + } + + .p-sm-3 { + padding: 1rem !important + } + + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important + } + + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important + } + + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important + } + + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important + } + + .p-sm-4 { + padding: 1.5rem !important + } + + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important + } + + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important + } + + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important + } + + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important + } + + .p-sm-5 { + padding: 3rem !important + } + + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important + } + + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important + } + + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important + } + + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important + } + + .m-sm-n1 { + margin: -.25rem !important + } + + .mt-sm-n1, + .my-sm-n1 { + margin-top: -.25rem !important + } + + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -.25rem !important + } + + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -.25rem !important + } + + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -.25rem !important + } + + .m-sm-n2 { + margin: -.5rem !important + } + + .mt-sm-n2, + .my-sm-n2 { + margin-top: -.5rem !important + } + + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -.5rem !important + } + + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -.5rem !important + } + + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -.5rem !important + } + + .m-sm-n3 { + margin: -1rem !important + } + + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important + } + + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important + } + + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important + } + + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important + } + + .m-sm-n4 { + margin: -1.5rem !important + } + + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important + } + + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important + } + + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important + } + + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important + } + + .m-sm-n5 { + margin: -3rem !important + } + + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important + } + + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important + } + + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important + } + + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important + } + + .m-sm-auto { + margin: auto !important + } + + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important + } + + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important + } + + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important + } + + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important + } + +} + +@media (min-width:768px) { + .m-md-0 { + margin: 0 !important + } + + .mt-md-0, + .my-md-0 { + margin-top: 0 !important + } + + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important + } + + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important + } + + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important + } + + .m-md-1 { + margin: .25rem !important + } + + .mt-md-1, + .my-md-1 { + margin-top: .25rem !important + } + + .mr-md-1, + .mx-md-1 { + margin-right: .25rem !important + } + + .mb-md-1, + .my-md-1 { + margin-bottom: .25rem !important + } + + .ml-md-1, + .mx-md-1 { + margin-left: .25rem !important + } + + .m-md-2 { + margin: .5rem !important + } + + .mt-md-2, + .my-md-2 { + margin-top: .5rem !important + } + + .mr-md-2, + .mx-md-2 { + margin-right: .5rem !important + } + + .mb-md-2, + .my-md-2 { + margin-bottom: .5rem !important + } + + .ml-md-2, + .mx-md-2 { + margin-left: .5rem !important + } + + .m-md-3 { + margin: 1rem !important + } + + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important + } + + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important + } + + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important + } + + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important + } + + .m-md-4 { + margin: 1.5rem !important + } + + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important + } + + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important + } + + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important + } + + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important + } + + .m-md-5 { + margin: 3rem !important + } + + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important + } + + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important + } + + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important + } + + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important + } + + .p-md-0 { + padding: 0 !important + } + + .pt-md-0, + .py-md-0 { + padding-top: 0 !important + } + + .pr-md-0, + .px-md-0 { + padding-right: 0 !important + } + + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important + } + + .pl-md-0, + .px-md-0 { + padding-left: 0 !important + } + + .p-md-1 { + padding: .25rem !important + } + + .pt-md-1, + .py-md-1 { + padding-top: .25rem !important + } + + .pr-md-1, + .px-md-1 { + padding-right: .25rem !important + } + + .pb-md-1, + .py-md-1 { + padding-bottom: .25rem !important + } + + .pl-md-1, + .px-md-1 { + padding-left: .25rem !important + } + + .p-md-2 { + padding: .5rem !important + } + + .pt-md-2, + .py-md-2 { + padding-top: .5rem !important + } + + .pr-md-2, + .px-md-2 { + padding-right: .5rem !important + } + + .pb-md-2, + .py-md-2 { + padding-bottom: .5rem !important + } + + .pl-md-2, + .px-md-2 { + padding-left: .5rem !important + } + + .p-md-3 { + padding: 1rem !important + } + + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important + } + + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important + } + + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important + } + + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important + } + + .p-md-4 { + padding: 1.5rem !important + } + + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important + } + + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important + } + + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important + } + + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important + } + + .p-md-5 { + padding: 3rem !important + } + + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important + } + + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important + } + + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important + } + + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important + } + + .m-md-n1 { + margin: -.25rem !important + } + + .mt-md-n1, + .my-md-n1 { + margin-top: -.25rem !important + } + + .mr-md-n1, + .mx-md-n1 { + margin-right: -.25rem !important + } + + .mb-md-n1, + .my-md-n1 { + margin-bottom: -.25rem !important + } + + .ml-md-n1, + .mx-md-n1 { + margin-left: -.25rem !important + } + + .m-md-n2 { + margin: -.5rem !important + } + + .mt-md-n2, + .my-md-n2 { + margin-top: -.5rem !important + } + + .mr-md-n2, + .mx-md-n2 { + margin-right: -.5rem !important + } + + .mb-md-n2, + .my-md-n2 { + margin-bottom: -.5rem !important + } + + .ml-md-n2, + .mx-md-n2 { + margin-left: -.5rem !important + } + + .m-md-n3 { + margin: -1rem !important + } + + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important + } + + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important + } + + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important + } + + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important + } + + .m-md-n4 { + margin: -1.5rem !important + } + + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important + } + + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important + } + + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important + } + + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important + } + + .m-md-n5 { + margin: -3rem !important + } + + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important + } + + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important + } + + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important + } + + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important + } + + .m-md-auto { + margin: auto !important + } + + .mt-md-auto, + .my-md-auto { + margin-top: auto !important + } + + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important + } + + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important + } + + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important + } + +} + +@media (min-width:992px) { + .m-lg-0 { + margin: 0 !important + } + + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important + } + + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important + } + + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important + } + + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important + } + + .m-lg-1 { + margin: .25rem !important + } + + .mt-lg-1, + .my-lg-1 { + margin-top: .25rem !important + } + + .mr-lg-1, + .mx-lg-1 { + margin-right: .25rem !important + } + + .mb-lg-1, + .my-lg-1 { + margin-bottom: .25rem !important + } + + .ml-lg-1, + .mx-lg-1 { + margin-left: .25rem !important + } + + .m-lg-2 { + margin: .5rem !important + } + + .mt-lg-2, + .my-lg-2 { + margin-top: .5rem !important + } + + .mr-lg-2, + .mx-lg-2 { + margin-right: .5rem !important + } + + .mb-lg-2, + .my-lg-2 { + margin-bottom: .5rem !important + } + + .ml-lg-2, + .mx-lg-2 { + margin-left: .5rem !important + } + + .m-lg-3 { + margin: 1rem !important + } + + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important + } + + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important + } + + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important + } + + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important + } + + .m-lg-4 { + margin: 1.5rem !important + } + + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important + } + + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important + } + + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important + } + + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important + } + + .m-lg-5 { + margin: 3rem !important + } + + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important + } + + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important + } + + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important + } + + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important + } + + .p-lg-0 { + padding: 0 !important + } + + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important + } + + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important + } + + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important + } + + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important + } + + .p-lg-1 { + padding: .25rem !important + } + + .pt-lg-1, + .py-lg-1 { + padding-top: .25rem !important + } + + .pr-lg-1, + .px-lg-1 { + padding-right: .25rem !important + } + + .pb-lg-1, + .py-lg-1 { + padding-bottom: .25rem !important + } + + .pl-lg-1, + .px-lg-1 { + padding-left: .25rem !important + } + + .p-lg-2 { + padding: .5rem !important + } + + .pt-lg-2, + .py-lg-2 { + padding-top: .5rem !important + } + + .pr-lg-2, + .px-lg-2 { + padding-right: .5rem !important + } + + .pb-lg-2, + .py-lg-2 { + padding-bottom: .5rem !important + } + + .pl-lg-2, + .px-lg-2 { + padding-left: .5rem !important + } + + .p-lg-3 { + padding: 1rem !important + } + + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important + } + + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important + } + + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important + } + + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important + } + + .p-lg-4 { + padding: 1.5rem !important + } + + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important + } + + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important + } + + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important + } + + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important + } + + .p-lg-5 { + padding: 3rem !important + } + + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important + } + + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important + } + + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important + } + + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important + } + + .m-lg-n1 { + margin: -.25rem !important + } + + .mt-lg-n1, + .my-lg-n1 { + margin-top: -.25rem !important + } + + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -.25rem !important + } + + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -.25rem !important + } + + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -.25rem !important + } + + .m-lg-n2 { + margin: -.5rem !important + } + + .mt-lg-n2, + .my-lg-n2 { + margin-top: -.5rem !important + } + + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -.5rem !important + } + + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -.5rem !important + } + + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -.5rem !important + } + + .m-lg-n3 { + margin: -1rem !important + } + + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important + } + + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important + } + + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important + } + + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important + } + + .m-lg-n4 { + margin: -1.5rem !important + } + + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important + } + + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important + } + + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important + } + + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important + } + + .m-lg-n5 { + margin: -3rem !important + } + + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important + } + + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important + } + + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important + } + + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important + } + + .m-lg-auto { + margin: auto !important + } + + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important + } + + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important + } + + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important + } + + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important + } + +} + +@media (min-width:1200px) { + .m-xl-0 { + margin: 0 !important + } + + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important + } + + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important + } + + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important + } + + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important + } + + .m-xl-1 { + margin: .25rem !important + } + + .mt-xl-1, + .my-xl-1 { + margin-top: .25rem !important + } + + .mr-xl-1, + .mx-xl-1 { + margin-right: .25rem !important + } + + .mb-xl-1, + .my-xl-1 { + margin-bottom: .25rem !important + } + + .ml-xl-1, + .mx-xl-1 { + margin-left: .25rem !important + } + + .m-xl-2 { + margin: .5rem !important + } + + .mt-xl-2, + .my-xl-2 { + margin-top: .5rem !important + } + + .mr-xl-2, + .mx-xl-2 { + margin-right: .5rem !important + } + + .mb-xl-2, + .my-xl-2 { + margin-bottom: .5rem !important + } + + .ml-xl-2, + .mx-xl-2 { + margin-left: .5rem !important + } + + .m-xl-3 { + margin: 1rem !important + } + + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important + } + + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important + } + + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important + } + + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important + } + + .m-xl-4 { + margin: 1.5rem !important + } + + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important + } + + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important + } + + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important + } + + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important + } + + .m-xl-5 { + margin: 3rem !important + } + + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important + } + + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important + } + + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important + } + + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important + } + + .p-xl-0 { + padding: 0 !important + } + + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important + } + + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important + } + + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important + } + + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important + } + + .p-xl-1 { + padding: .25rem !important + } + + .pt-xl-1, + .py-xl-1 { + padding-top: .25rem !important + } + + .pr-xl-1, + .px-xl-1 { + padding-right: .25rem !important + } + + .pb-xl-1, + .py-xl-1 { + padding-bottom: .25rem !important + } + + .pl-xl-1, + .px-xl-1 { + padding-left: .25rem !important + } + + .p-xl-2 { + padding: .5rem !important + } + + .pt-xl-2, + .py-xl-2 { + padding-top: .5rem !important + } + + .pr-xl-2, + .px-xl-2 { + padding-right: .5rem !important + } + + .pb-xl-2, + .py-xl-2 { + padding-bottom: .5rem !important + } + + .pl-xl-2, + .px-xl-2 { + padding-left: .5rem !important + } + + .p-xl-3 { + padding: 1rem !important + } + + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important + } + + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important + } + + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important + } + + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important + } + + .p-xl-4 { + padding: 1.5rem !important + } + + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important + } + + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important + } + + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important + } + + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important + } + + .p-xl-5 { + padding: 3rem !important + } + + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important + } + + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important + } + + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important + } + + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important + } + + .m-xl-n1 { + margin: -.25rem !important + } + + .mt-xl-n1, + .my-xl-n1 { + margin-top: -.25rem !important + } + + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -.25rem !important + } + + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -.25rem !important + } + + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -.25rem !important + } + + .m-xl-n2 { + margin: -.5rem !important + } + + .mt-xl-n2, + .my-xl-n2 { + margin-top: -.5rem !important + } + + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -.5rem !important + } + + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -.5rem !important + } + + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -.5rem !important + } + + .m-xl-n3 { + margin: -1rem !important + } + + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important + } + + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important + } + + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important + } + + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important + } + + .m-xl-n4 { + margin: -1.5rem !important + } + + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important + } + + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important + } + + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important + } + + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important + } + + .m-xl-n5 { + margin: -3rem !important + } + + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important + } + + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important + } + + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important + } + + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important + } + + .m-xl-auto { + margin: auto !important + } + + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important + } + + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important + } + + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important + } + + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important + } + +} + +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important +} + +.text-justify { + text-align: justify !important +} + +.text-wrap { + white-space: normal !important +} + +.text-nowrap { + white-space: nowrap !important +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.text-left { + text-align: left !important +} + +.text-right { + text-align: right !important +} + +.text-center { + text-align: center !important +} + +@media (min-width:576px) { + .text-sm-left { + text-align: left !important + } + + .text-sm-right { + text-align: right !important + } + + .text-sm-center { + text-align: center !important + } + +} + +@media (min-width:768px) { + .text-md-left { + text-align: left !important + } + + .text-md-right { + text-align: right !important + } + + .text-md-center { + text-align: center !important + } + +} + +@media (min-width:992px) { + .text-lg-left { + text-align: left !important + } + + .text-lg-right { + text-align: right !important + } + + .text-lg-center { + text-align: center !important + } + +} + +@media (min-width:1200px) { + .text-xl-left { + text-align: left !important + } + + .text-xl-right { + text-align: right !important + } + + .text-xl-center { + text-align: center !important + } + +} + +.text-lowercase { + text-transform: lowercase !important +} + +.text-uppercase { + text-transform: uppercase !important +} + +.text-capitalize { + text-transform: capitalize !important +} + +.font-weight-light { + font-weight: 300 !important +} + +.font-weight-lighter { + font-weight: lighter !important +} + +.font-weight-normal { + font-weight: 400 !important +} + +.font-weight-bold { + font-weight: 700 !important +} + +.font-weight-bolder { + font-weight: bolder !important +} + +.font-italic { + font-style: italic !important +} + +.text-white { + color: #fff !important +} + +.text-primary { + color: #047006 !important +} + +a.text-primary:focus, +a.text-primary:hover { + color: #012602 !important +} + +.text-secondary { + color: grey !important +} + +a.text-secondary:focus, +a.text-secondary:hover { + color: #5a5a5a !important +} + +.text-success { + color: #00e093 !important +} + +a.text-success:focus, +a.text-success:hover { + color: #009461 !important +} + +.text-info { + color: #6c61f6 !important +} + +a.text-info:focus, +a.text-info:hover { + color: #2919f2 !important +} + +.text-warning { + color: #f0825f !important +} + +a.text-warning:focus, +a.text-warning:hover { + color: #e94b19 !important +} + +.text-danger { + color: #ff5f66 !important +} + +a.text-danger:focus, +a.text-danger:hover { + color: #ff131d !important +} + +.text-light { + color: #dfdfdf !important +} + +a.text-light:focus, +a.text-light:hover { + color: #b9b9b9 !important +} + +.text-dark { + color: #74767b !important +} + +a.text-dark:focus, +a.text-dark:hover { + color: #4f5054 !important +} + +.text-white { + color: #fff !important +} + +a.text-white:focus, +a.text-white:hover { + color: #d9d9d9 !important +} + +.text-orange { + color: #ffa600 !important +} + +a.text-orange:focus, +a.text-orange:hover { + color: #b37400 !important +} + +.text-body { + color: #212529 !important +} + +.text-muted { + color: #adb5bd !important +} + +.text-black-50 { + color: rgba(0, 0, 0, .5) !important +} + +.text-white-50 { + color: rgba(255, 255, 255, .5) !important +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0 +} + +.text-decoration-none { + text-decoration: none !important +} + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important +} + +.text-reset { + color: inherit !important +} + +.visible { + visibility: visible !important +} + +.invisible { + visibility: hidden !important +} + +@media print { + *, + ::after, + ::before { + text-shadow: none !important; + box-shadow: none !important + } + + a:not(.btn) { + text-decoration: underline + } + + abbr[title]::after { + content: '3'attr(title) ")" + } + + pre { + white-space: pre-wrap !important + } + + blockquote, + pre { + border: 1px solid #adb5bd; + page-break-inside: avoid + } + + thead { + display: table-header-group + } + + img, + tr { + page-break-inside: avoid + } + + h2, + h3, + p { + orphans: 3; + widows: 3 + } + + h2, + h3 { + page-break-after: avoid + } + + @page { + size: a3 + } + + body { + min-width: 992px !important + } + + .container { + min-width: 992px !important + } + + .navbar { + display: none + } + + .badge { + border: 1px solid #000 + } + + .table { + border-collapse: collapse !important + } + + .table td, + .table th { + background-color: #fff !important + } + + .table-bordered td, + .table-bordered th { + border: 1px solid #dee2e6 !important + } + + .table-dark { + color: inherit + } + + .table-dark tbody+tbody, + .table-dark td, + .table-dark th, + .table-dark thead th { + border-color: #f2f4f9 + } + + .table .thead-dark th { + color: inherit; + border-color: #f2f4f9 + } + +} + +.dev-info { + position: fixed; + color: grey; + font-size: smaller; + left: 8px; + z-index: 120 +} + +.versionstring { + top: 70px; + right: 8px; + left: auto +} + +.grd-time-used { + bottom: 0 +} + +footer { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 2rem 2.5rem; + max-width: 1140px; + margin-left: auto; + margin-right: auto +} + +@media (max-width:991.98px) { + footer { + padding: 20px 0 30px 0 + } + +} + +footer ul { + margin-left: 0; + padding-left: 0 +} + +footer ul li { + display: inline-block; + padding: 0 10px 0 0; + line-height: 1 +} + +footer ul li:not(:last-child) { + margin-right: 10px; + border-right: 1px solid #f2f4f9 +} + +footer ul li a { + font-size: 14px; + font-family: Roboto, sans-serif; + font-weight: 400; + letter-spacing: .03rem; + color: #565656 +} + +@media (min-width:768px) and (max-width:991px) { + footer ul li a { + font-size: calc(14px + 0 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + footer ul li a { + font-size: calc(14px + -1 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + footer ul li a { + font-size: 13px + } + +} + +.alert { + border: none; + font-size: 14px; + font-family: Roboto, sans-serif; + font-weight: 400 +} + +@media (min-width:768px) and (max-width:991px) { + .alert { + font-size: calc(14px + 1 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .alert { + font-size: calc(15px + -1 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .alert { + font-size: 14px + } + +} + +.alert .alert-heading { + margin-top: 20px; + margin-bottom: 10px +} + +.alert .btn-dismmiss { + margin-top: 20px +} + +.alert.dismissible-alert { + position: relative; + padding-right: 40px +} + +.alert.dismissible-alert .alert-close { + position: absolute; + top: 0; + right: 0; + bottom: 0; + padding: 10px; + font-size: 18px; + display: -webkit-box; + display: flex; + cursor: pointer; + height: inherit; + -webkit-box-align: center; + align-items: center +} + +.alert-notification-wrapper { + position: fixed; + left: 17rem; + right: 0; + z-index: 999 +} + +@media (max-width:991.98px) { + .alert-notification-wrapper { + left: 0 + } + +} + +.alert-notification-wrapper.top { + top: 70px +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter { + border: 2px solid #55acee; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter i { + color: #55acee +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link { + background: 0 0; + color: #55acee +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link:hover { + color: #2795e9 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook { + border: 2px solid #0084ff; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook i { + color: #0084ff +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link { + background: 0 0; + color: #0084ff +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link:hover { + color: #006acc +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-google { + border: 2px solid #dd4b39; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-google i { + color: #dd4b39 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link { + background: 0 0; + color: #dd4b39 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link:hover { + color: #c23321 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin { + border: 2px solid #0077b5; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin i { + color: #0077b5 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link { + background: 0 0; + color: #0077b5 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link:hover { + color: #005582 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest { + border: 2px solid #bd081c; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest i { + color: #bd081c +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link { + background: 0 0; + color: #bd081c +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link:hover { + color: #8c0615 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube { + border: 2px solid #cd201f; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube i { + color: #cd201f +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link { + background: 0 0; + color: #cd201f +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link:hover { + color: #a11918 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-github { + border: 2px solid #333; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-github i { + color: #333 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link { + background: 0 0; + color: #333 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link:hover { + color: #1a1a1a +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-behance { + border: 2px solid #0454f6; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-behance i { + color: #0454f6 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link { + background: 0 0; + color: #0454f6 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link:hover { + color: #0343c4 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble { + border: 2px solid #ea4c89; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble i { + color: #ea4c89 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link { + background: 0 0; + color: #ea4c89 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link:hover { + color: #e51e6b +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit { + border: 2px solid #ed4333; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit i { + color: #ed4333 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link { + background: 0 0; + color: #ed4333 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link:hover { + color: #da2413 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram { + border: 2px solid #ff759b; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram i { + color: #ff759b +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link { + background: 0 0; + color: #ff759b +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link:hover { + color: #ff4276 +} + +.btn-inverse-primary { + background: rgba(4, 112, 6, .15); + color: #047006 +} + +.btn-inverse-primary i { + color: inherit +} + +.btn-inverse-primary:hover { + background: rgba(4, 112, 6, .8); + color: #fff +} + +.btn-inverse-secondary { + background: rgba(128, 128, 128, .15); + color: grey +} + +.btn-inverse-secondary i { + color: inherit +} + +.btn-inverse-secondary:hover { + background: rgba(128, 128, 128, .8); + color: #fff +} + +.btn-inverse-success { + background: rgba(0, 224, 147, .15); + color: #00e093 +} + +.btn-inverse-success i { + color: inherit +} + +.btn-inverse-success:hover { + background: rgba(0, 224, 147, .8); + color: #fff +} + +.btn-inverse-info { + background: rgba(108, 97, 246, .15); + color: #6c61f6 +} + +.btn-inverse-info i { + color: inherit +} + +.btn-inverse-info:hover { + background: rgba(108, 97, 246, .8); + color: #fff +} + +.btn-inverse-warning { + background: rgba(240, 130, 95, .15); + color: #f0825f +} + +.btn-inverse-warning i { + color: inherit +} + +.btn-inverse-warning:hover { + background: rgba(240, 130, 95, .8); + color: #fff +} + +.btn-inverse-danger { + background: rgba(255, 95, 102, .15); + color: #ff5f66 +} + +.btn-inverse-danger i { + color: inherit +} + +.btn-inverse-danger:hover { + background: rgba(255, 95, 102, .8); + color: #fff +} + +.btn-inverse-light { + background: rgba(223, 223, 223, .15); + color: #dfdfdf +} + +.btn-inverse-light i { + color: inherit +} + +.btn-inverse-light:hover { + background: rgba(223, 223, 223, .8); + color: #fff +} + +.btn-inverse-dark { + background: rgba(116, 118, 123, .15); + color: #74767b +} + +.btn-inverse-dark i { + color: inherit +} + +.btn-inverse-dark:hover { + background: rgba(116, 118, 123, .8); + color: #fff +} + +.btn-inverse-white { + background: rgba(255, 255, 255, .15); + color: #fff +} + +.btn-inverse-white i { + color: inherit +} + +.btn-inverse-white:hover { + background: rgba(255, 255, 255, .8); + color: #fff +} + +.btn-inverse-orange { + background: rgba(255, 166, 0, .15); + color: #ffa600 +} + +.btn-inverse-orange i { + color: inherit +} + +.btn-inverse-orange:hover { + background: rgba(255, 166, 0, .8); + color: #fff +} + +.btn:not(.social-btn-outlined).btn-twitter { + background: #55acee; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-twitter:hover { + background: #2795e9 +} + +.btn:not(.social-btn-outlined).btn-twitter.btn-link { + background: 0 0; + color: #55acee +} + +.btn:not(.social-btn-outlined).btn-twitter.btn-link:hover { + color: #2795e9 +} + +.btn:not(.social-btn-outlined).btn-facebook { + background: #0084ff; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-facebook:hover { + background: #006acc +} + +.btn:not(.social-btn-outlined).btn-facebook.btn-link { + background: 0 0; + color: #0084ff +} + +.btn:not(.social-btn-outlined).btn-facebook.btn-link:hover { + color: #006acc +} + +.btn:not(.social-btn-outlined).btn-google { + background: #dd4b39; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-google:hover { + background: #c23321 +} + +.btn:not(.social-btn-outlined).btn-google.btn-link { + background: 0 0; + color: #dd4b39 +} + +.btn:not(.social-btn-outlined).btn-google.btn-link:hover { + color: #c23321 +} + +.btn:not(.social-btn-outlined).btn-linkedin { + background: #0077b5; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-linkedin:hover { + background: #005582 +} + +.btn:not(.social-btn-outlined).btn-linkedin.btn-link { + background: 0 0; + color: #0077b5 +} + +.btn:not(.social-btn-outlined).btn-linkedin.btn-link:hover { + color: #005582 +} + +.btn:not(.social-btn-outlined).btn-pinterest { + background: #bd081c; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-pinterest:hover { + background: #8c0615 +} + +.btn:not(.social-btn-outlined).btn-pinterest.btn-link { + background: 0 0; + color: #bd081c +} + +.btn:not(.social-btn-outlined).btn-pinterest.btn-link:hover { + color: #8c0615 +} + +.btn:not(.social-btn-outlined).btn-youtube { + background: #cd201f; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-youtube:hover { + background: #a11918 +} + +.btn:not(.social-btn-outlined).btn-youtube.btn-link { + background: 0 0; + color: #cd201f +} + +.btn:not(.social-btn-outlined).btn-youtube.btn-link:hover { + color: #a11918 +} + +.btn:not(.social-btn-outlined).btn-github { + background: #333; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-github:hover { + background: #1a1a1a +} + +.btn:not(.social-btn-outlined).btn-github.btn-link { + background: 0 0; + color: #333 +} + +.btn:not(.social-btn-outlined).btn-github.btn-link:hover { + color: #1a1a1a +} + +.btn:not(.social-btn-outlined).btn-behance { + background: #0454f6; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-behance:hover { + background: #0343c4 +} + +.btn:not(.social-btn-outlined).btn-behance.btn-link { + background: 0 0; + color: #0454f6 +} + +.btn:not(.social-btn-outlined).btn-behance.btn-link:hover { + color: #0343c4 +} + +.btn:not(.social-btn-outlined).btn-dribbble { + background: #ea4c89; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-dribbble:hover { + background: #e51e6b +} + +.btn:not(.social-btn-outlined).btn-dribbble.btn-link { + background: 0 0; + color: #ea4c89 +} + +.btn:not(.social-btn-outlined).btn-dribbble.btn-link:hover { + color: #e51e6b +} + +.btn:not(.social-btn-outlined).btn-reddit { + background: #ed4333; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-reddit:hover { + background: #da2413 +} + +.btn:not(.social-btn-outlined).btn-reddit.btn-link { + background: 0 0; + color: #ed4333 +} + +.btn:not(.social-btn-outlined).btn-reddit.btn-link:hover { + color: #da2413 +} + +.btn:not(.social-btn-outlined).btn-instagram { + background: #ff759b; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-instagram:hover { + background: #ff4276 +} + +.btn:not(.social-btn-outlined).btn-instagram.btn-link { + background: 0 0; + color: #ff759b +} + +.btn:not(.social-btn-outlined).btn-instagram.btn-link:hover { + color: #ff4276 +} + +.btn-group label.btn.btn-primary:not(:disabled):not(.disabled).active { + background: #000e01 +} + +.btn-group label.btn.btn-secondary:not(:disabled):not(.disabled).active { + background: #4d4d4d +} + +.btn-group label.btn.btn-success:not(:disabled):not(.disabled).active { + background: #007a50 +} + +.btn-group label.btn.btn-info:not(:disabled):not(.disabled).active { + background: #1d0de4 +} + +.btn-group label.btn.btn-warning:not(:disabled):not(.disabled).active { + background: #d54314 +} + +.btn-group label.btn.btn-danger:not(:disabled):not(.disabled).active { + background: #f8000b +} + +.btn-group label.btn.btn-light:not(:disabled):not(.disabled).active { + background: #acacac +} + +.btn-group label.btn.btn-dark:not(:disabled):not(.disabled).active { + background: #424447 +} + +.btn-group label.btn.btn-white:not(:disabled):not(.disabled).active { + background: #ccc +} + +.btn-group label.btn.btn-orange:not(:disabled):not(.disabled).active { + background: #996400 +} + +.btn-outline-primary { + border: 2px solid #047006 +} + +.btn-outline-secondary { + border: 2px solid grey +} + +.btn-outline-success { + border: 2px solid #00e093 +} + +.btn-outline-info { + border: 2px solid #6c61f6 +} + +.btn-outline-warning { + border: 2px solid #f0825f +} + +.btn-outline-danger { + border: 2px solid #ff5f66 +} + +.btn-outline-light { + border: 2px solid #dfdfdf +} + +.btn-outline-dark { + border: 2px solid #74767b +} + +.btn-outline-white { + border: 2px solid #fff +} + +.btn-outline-orange { + border: 2px solid #ffa600 +} + +.btn-group label.btn input { + display: none +} + +.btn { + display: -webkit-inline-box; + display: inline-flex; + -webkit-box-pack: center; + justify-content: center; + -webkit-box-align: center; + align-items: center; + -webkit-transition: .3s ease; + transition: .3s ease; + -webkit-transition-property: background, color; + transition-property: background, color; + font-size: .875rem; + font-family: Roboto, sans-serif; + font-weight: 600; + letter-spacing: .03rem +} + +.btn:not([class*=btn-inverse]):not(.component-flat) { + box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2) +} + +.btn i { + font-size: 1.25rem +} + +.btn-group-lg>.btn, +.btn.btn-lg { + height: 55px; + max-height: 55px; + padding: 15px 30px; + font-size: 1.125rem +} + +.btn-group-sm>.btn, +.btn.btn-sm { + height: 35px; + max-height: 35px; + padding: 4px 15px; + font-size: .875rem +} + +.btn.btn-xs { + height: 25px; + max-height: 25px; + padding: 0 10px; + line-height: 1; + font-size: .75rem +} + +.btn.btn-xs.has-icon i, +.btn.btn-xs.has-icon span { + font-size: .8125rem; + margin-right: 5px +} + +.btn { + height: 40px; + max-height: 40px; + padding: 5px 20px +} + +.btn.active { + box-shadow: none +} + +.btn.social-icon-btn { + height: 40px; + width: 40px +} + +.btn.social-btn i { + margin-right: 10px +} + +.btn.social-btn-outlined i { + margin-right: 10px +} + +.btn.has-icon i, +.btn.has-icon span { + font-size: 1.25rem; + margin-right: 10px; + line-height: 1 +} + +.btn.btn-outline-secondary { + color: #1a1a1a; + border-color: #676767 +} + +.btn.btn-info, +.btn.btn-warning { + color: #fff +} + +.btn.btn-light { + background: #fff; + color: #000 +} + +.btn.dropdown-dotted-list { + background: #fff +} + +.btn.dropdown-toggle-split { + padding: 0 8px +} + +.btn.action-btn { + display: -webkit-inline-box; + display: inline-flex; + -webkit-box-pack: center; + justify-content: center; + -webkit-box-align: center; + align-items: center; + padding: 0; + height: 40px; + width: 40px +} + +.btn.action-btn i { + font-size: 1.25rem; + width: 26px; + display: -webkit-box; + display: flex; + -webkit-box-pack: center; + justify-content: center; + -webkit-box-align: center; + align-items: center; + line-height: 23px; + vertical-align: middle; + font-size: 1.25rem +} + +.btn.action-btn i:before { + width: inherit; + height: inherit; + line-height: inherit; + font-size: inherit +} + +.btn.action-btn.btn-xs { + height: 30px; + width: 30px +} + +.btn-group-sm>.btn.action-btn, +.btn.action-btn.btn-sm { + height: 35px; + width: 35px +} + +.btn-group-lg>.btn.action-btn, +.btn.action-btn.btn-lg { + height: 50px; + width: 50px +} + +.btn-group-lg>.btn.action-btn i, +.btn.action-btn.btn-lg i { + font-size: 1.875rem; + line-height: 24px +} + +.btn.action-btn.btn-refresh.clicked i { + color: #047006; + -webkit-animation: rotate360 .8s linear infinite; + animation: rotate360 .8s linear infinite +} + +.btn.action-btn.btn-like.clicked i { + color: #ff5f66; + -webkit-animation: bounceIn .8s linear 1; + animation: bounceIn .8s linear 1 +} + +.btn.action-btn.btn-like.clicked:hover i { + color: #fff +} + +.btn.btn-rounded { + border-radius: 50px +} + +.flag-germany { + width: 40px; + height: 28px; + background: red; + border-top: 9px solid #000; + border-bottom: 9px solid #fc0; + display: block +} + +.flag-england { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==); + background-size: cover; + width: 40px; + height: 28px; + display: block +} + +.language-active { + background-color: #f9fafb; + padding: 2px +} + +.language-inactive { + padding: 2px; + background-color: transparent +} + +.is-invalid .form-control { + background-color: rgba(240, 130, 95, .2); + border: none +} + +.is-invalid .invalid-feedback { + display: block +} + +.is-valid .form-control { + background-color: rgba(4, 112, 6, .2); + border: none +} + +.form-control { + padding-left: 20px; + padding-right: 20px; + color: rgba(16, 16, 16, .8) +} + +.form-control.placeholder { + font-weight: inherit; + color: inherit; + font-size: inherit +} + +.form-control:-moz-placeholder { + font-weight: inherit; + color: inherit; + font-size: inherit +} + +.form-control::-moz-placeholder { + font-weight: inherit; + color: inherit; + font-size: inherit +} + +.form-control:-ms-input-placeholder { + font-weight: inherit; + color: inherit; + font-size: inherit +} + +.form-control::-webkit-input-placeholder { + font-weight: inherit; + color: inherit; + font-size: inherit +} + +.form-control.is-invalid { + background-color: rgba(240, 130, 95, .2); + border: none +} + +.form-control.is-valid { + background-color: rgba(4, 112, 6, .2); + border: none +} + +.input-group-text { + background-color: #f6f7f9; + color: #101010; + border-color: #f2f4f9; + padding: 0 10px; + font-size: 17px +} + +.is-valid .input-group-text { + background-color: rgba(4, 112, 6, .2); + color: #047006 +} + +.is-invalid .input-group-text { + background-color: rgba(240, 130, 95, .2); + color: #f0825f +} + +.form-group { + margin-bottom: 20px +} + +.form-group.input-rounded .form-control { + border-radius: 25px +} + +.custom-file .custom-file-label { + padding: 8px .75rem; + height: 41px +} + +.custom-file .custom-file-label:after { + padding: 1.45rem .8rem; + line-height: 0 +} + +.custom-select, +.custom-select[multiple] { + background: #f6f7f9; + border-color: #f0f2f5; + color: rgba(16, 16, 16, .8) +} + +.custom-select option, +.custom-select[multiple] option { + background: #f6f7f9; + color: rgba(16, 16, 16, .8); + display: block; + border-bottom: 1px solid #f2f4f9; + padding: 5px 10px +} + +.custom-select option:checked, +.custom-select[multiple] option:checked { + background: #f6f7f9 +} + +.custom-select option[selected], +.custom-select[multiple] option[selected] { + background: #f6f7f9; + display: block +} + +.custom-select[multiple] { + padding: 0; + border-radius: 2px +} + +.custom-control-input:focus~.custom-control-label::before { + box-shadow: none +} + +.custom-switch .custom-control-label::after { + box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2); + background: #047006 +} + +.checkbox, +.radio { + position: relative; + display: block; + margin-top: 2px; + margin-bottom: 20px +} + +.checkbox label, +.radio label { + display: block; + padding-left: 30px; + line-height: 1.42857143; + font-size: .875rem +} + +.checkbox label input, +.radio label input { + position: absolute; + margin-left: -20px; + margin-top: 4px\9; + top: 0; + left: 0; + margin-left: 0 !important; + z-index: 1; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); + margin-top: 0 +} + +.checkbox label input:checked+.input-frame:before, +.radio label input:checked+.input-frame:before { + background-color: #fff +} + +.checkbox label input:checked+.input-frame:after, +.radio label input:checked+.input-frame:after { + color: #047006; + opacity: 1; + line-height: 1.5; + filter: alpha(opacity=100); + -webkit-transform: scale(1); + transform: scale(1) +} + +.checkbox label input:disabled+.input-frame:before, +.radio label input:disabled+.input-frame:before { + border-color: #fff +} + +.checkbox label input:disabled:checked+.input-frame:before, +.radio label input:disabled:checked+.input-frame:before { + background: #047006 +} + +.checkbox label .input-frame:before, +.radio label .input-frame:before { + position: absolute; + content: '.5'; + top: 0; + width: 19px; + height: 19px; + border-radius: 2px; + left: 0; + border: 2px solid #f2f4f9; + -webkit-transition: all; + transition: all; + -webkit-transition-duration: 250ms; + transition-duration: 250ms +} + +.checkbox label .input-frame:after, +.radio label .input-frame:after { + line-height: 1.5; + -webkit-transition: all; + transition: all; + -webkit-transition-duration: 250ms; + transition-duration: 250ms; + font-family: Material Design Icons; + opacity: 0; + filter: alpha(opacity=0); + -webkit-transform: scale(0); + transform: scale(0); + content: '3'; + position: absolute; + font-size: .9375rem; + left: 1px; + top: -2px; + color: #fff +} + +.checkbox label { + font-size: 16; + line-height: 1.5; + padding-left: 30px +} + +.checkbox label input:checked+.input-helper:before { + background-color: #fff +} + +.checkbox label input:checked+.input-helper:after { + width: 18px; + opacity: 1; + line-height: 18px; + filter: alpha(opacity=100); + -webkit-transform: scale(1); + transform: scale(1) +} + +.checkbox label input:disabled+.input-helper:before { + border-color: #f2f4f9 +} + +.checkbox label input:disabled:checked+.input-helper:after { + color: #f2f4f9 +} + +.checkbox label .input-frame:before { + position: absolute; + content: '3'; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + width: 18px; + height: 18px; + border-radius: 2px; + left: 0; + border: 2px solid #f2f4f9; + -webkit-transition: all; + transition: all; + transition-duration: 0s; + -webkit-transition-duration: 250ms; + transition-duration: 250ms +} + +.rtl .checkbox label .input-frame:before { + left: auto; + right: 0 +} + +.checkbox label .input-frame:after { + -webkit-transition: all; + transition: all; + transition-duration: 0s; + -webkit-transition-duration: 250ms; + transition-duration: 250ms; + font-family: Material Design Icons; + opacity: 0; + filter: alpha(opacity=0); + -webkit-transform: scale(0); + transform: scale(0); + content: '.5'; + position: absolute; + font-size: 15px; + font-weight: 700; + left: 0; + top: 0; + -webkit-transform: translateY(-14%); + transform: translateY(-14%); + color: #047006 +} + +.rtl .checkbox label .input-frame:after { + left: auto; + right: 0 +} + +.radio label input:checked+.input-frame:before { + background-color: #fff +} + +.radio label input:checked:disabled+.input-frame:before { + background-color: #fff; + border-color: #fff +} + +.radio label input:checked:disabled+.input-frame:after { + background-color: #047006 +} + +.radio label .input-frame:before { + border-radius: 50% +} + +.radio label .input-frame:after { + content: 'http://www.w3.org/2000/svg'; + width: 9px; + height: 9px; + background: #047006; + border-radius: 50%; + top: 5px; + left: 5px; + -webkit-transform: scale(0); + transform: scale(0) +} + +.form-inline .checkbox, +.form-inline .radio { + margin-right: 30px +} + +.form-inline .checkbox:last-child, +.form-inline .radio:last-child { + margin-right: 0 +} + +.form-inline .form-check-input { + display: none +} + +.bootstrap-tagsinput { + background: #f6f7f9; + border-color: #f0f2f5; + box-shadow: none; + min-width: 100%; + width: 100%; + max-width: 100% +} + +.bootstrap-tagsinput .tag { + display: inline-block; + background: #047006; + color: #fff; + padding: 2px 9px; + border-radius: 2px; + margin-bottom: 5px +} + +.bootstrap-tagsinput .tag:nth-child(5n+1) { + background: #047006 +} + +.bootstrap-tagsinput .tag:nth-child(5n+2) { + background: #00e093 +} + +.bootstrap-tagsinput .tag:nth-child(5n+3) { + background: #6c61f6 +} + +.bootstrap-tagsinput .tag:nth-child(5n+4) { + background: #f0825f +} + +.bootstrap-tagsinput .tag:nth-child(5n+5) { + background: #ff5f66 +} + +.page-body { + background: #fff +} + +.page-content-wrapper { + background: #f9fafb; + border-left: 1px solid #f2f4f9 +} + +@media (min-width:992px) { + .t-header .t-header-content-wrapper { + border-left: 1px solid #f2f4f9 + } + +} + +@media (min-width:768px) { + .page-body { + position: relative; + display: grid; + max-width: 100%; + grid-template-columns: 17rem calc(100vw - 17rem); + -webkit-transition: .3s; + transition: .3s + } + + .page-body .page-content-wrapper { + position: relative; + width: 100%; + min-height: 100vh; + padding: 1.5rem 2.5rem calc(90px + 1.5rem); + margin-top: 70px + } + + .page-body .page-content-wrapper .page-content-wrapper-inner { + max-width: 1140px; + margin-left: auto; + margin-right: auto + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header { + position: -webkit-sticky; + position: sticky; + top: 70px; + background: #f9fafb; + z-index: 99 + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb { + padding: 1rem 1rem 1rem 21px; + margin-left: -20px; + margin-right: -20px; + background: #f9fafb + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item { + color: #565656; + letter-spacing: .03rem; + font-family: Roboto, sans-serif; + font-weight: 500 + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item a { + color: inherit + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item.active { + color: #047006 + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-title-heading { + color: #565656; + font-size: 1.5rem; + font-family: Roboto, sans-serif; + font-weight: 500; + margin-bottom: 0 + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-description { + opacity: .7; + margin-top: 15px + } + + body.sidebar-minimized .t-header .t-header-brand-wrapper { + background: #f9fafb + } + + body.sidebar-minimized .t-header .t-header-content-wrapper { + border-left: #f9fafb + } + + body.sidebar-minimized .page-body { + grid-template-columns: 0 100% + } + + body.sidebar-minimized .page-body .sidebar .sidebar_footer { + left: -17rem + } + + body.sidebar-minimized .page-body .sidebar .nav-category-divider { + position: initial + } + +} + +@media (max-width:991.98px) { + .t-header { + width: 100vw + } + + .t-header .t-header-brand-wrapper { + background: #f9fafb; + width: 4rem; + min-width: 4rem; + max-width: 4rem + } + + .t-header .t-header-brand-wrapper a .logo { + -webkit-animation-name: menuItemFadeIn; + animation-name: menuItemFadeIn; + -webkit-animation-duration: .25s; + animation-duration: .25s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + display: none + } + + @-webkit-keyframes menuItemFadeIn { + from { + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + display: none; + opacity: 0 + } + + to { + display: block; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + + } + + @keyframes menuItemFadeIn { + from { + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + display: none; + opacity: 0 + } + + to { + display: block; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + + } + + .t-header .t-header-brand-wrapper a .logo-mini { + display: block + } + + .page-body { + display: -webkit-box; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + overflow: hidden; + max-width: 100% + } + + .page-body .sidebar { + position: relative; + left: 0; + z-index: 99; + width: 15rem; + min-width: 15rem; + max-width: 15rem; + margin-left: -15rem; + -webkit-transition-duration: .2s; + transition-duration: .2s; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-property: margin-left, width; + transition-property: margin-left, width + } + + .page-body .sidebar .sidebar_footer { + -webkit-transition-duration: .2s; + transition-duration: .2s; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-property: left; + transition-property: left; + left: -15rem + } + + .page-body .page-content-wrapper { + padding: 20px 20px; + min-width: 100vw; + margin-left: 0; + -webkit-transition-duration: .2s; + transition-duration: .2s; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-property: margin-left; + transition-property: margin-left + } + + .page-body .page-content-wrapper .viewport-header .breadcrumb { + background: 0 0; + padding-left: 0 + } + + .page-body .page-content-wrapper footer { + position: relative + } + + .page-body.sidebar-collpased .sidebar { + margin-left: 0; + min-width: 15rem + } + + .page-body.sidebar-collpased .sidebar .sidebar_footer { + left: 0 + } + +} + +@media (max-width:767.98px) { + .page-body .page-content-wrapper { + padding: 80px 20px 0 20px + } + +} + +.logo { + display: block; + margin: 0 auto; + width: 280px +} + +.logo img { + width: 100% +} + +.grid { + background: #fff; + border-radius: 6px; + box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2); + margin-bottom: 1.5rem; + border: 1px solid rgba(238, 238, 238, .75) +} + +.grid-header { + padding: 15px 20px; + margin-bottom: 15px; + font-family: Roboto, sans-serif; + font-weight: 500; + font-size: 14px; + letter-spacing: .03rem; + background: #f9fafb; + border-left: 3px solid #047006; + border-radius: 0 6px 0 0 +} + +@media (min-width:768px) and (max-width:991px) { + .grid-header { + font-size: calc(14px + 1 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .grid-header { + font-size: calc(15px + -1 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .grid-header { + font-size: 14px + } + +} + +.grid-title { + opacity: .9; + margin-bottom: 25px +} + +.close { + color: #101010 +} + +.split-header { + display: -webkit-box; + display: flex; + -webkit-box-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + align-items: center +} + +.split-header .content-wrapper { + display: -webkit-box; + display: flex +} + +.split-header .content-wrapper a i, +.split-header .content-wrapper span i { + font-size: 20px; + color: #adb5bd; + -webkit-transition: .3s ease color; + transition: .3s ease color +} + +.split-header .content-wrapper a i:hover, +.split-header .content-wrapper span i:hover { + color: #047006 +} + +.split-header .content-wrapper.v-centered { + -webkit-box-align: center; + align-items: center +} + +.split-header .content-wrapper.h-centered { + -webkit-box-pack: center; + justify-content: center +} + +.grid-body { + padding: 20px 25px 20px +} + +.card-title { + font-size: 14px; + font-family: Roboto, sans-serif; + font-weight: 500; + color: #313131; + margin-bottom: 0 +} + +@media (min-width:768px) and (max-width:991px) { + .card-title { + font-size: calc(14px + 1 * ((100vw - 768px)/ 223)) + } + +} + +@media (min-width:991px) and (max-width:1200px) { + .card-title { + font-size: calc(15px + -1 * ((100vw - 991px)/ 209)) + } + +} + +@media (min-width:1200px) { + .card-title { + font-size: 14px + } + +} + +.equel-grid { + display: -webkit-box; + display: flex; + -webkit-box-align: stretch; + align-items: stretch +} + +.equel-grid .grid { + width: 100%; + min-width: 100% +} + +.showcase_row_area { + margin-bottom: 20px +} + +.showcase_row_area .showcase_text_area { + text-align: right +} + +@media (max-width:767.98px) { + .showcase_row_area .showcase_text_area { + text-align: left + } + +} + +.showcase_row_area .showcase_content_area { + margin-bottom: -10px +} + +.showcase_row_area .showcase_content_area .btn { + margin-right: 5px; + margin-bottom: 10px +} + +.showcase_row_area:last-child { + margin-bottom: 0 +} + +.content-preview { + width: 45px; + height: 45px +} + +.content-preview.rounded { + border-radius: 100% +} + +.btn:not(.disabled),.cursor_pointer,a { + cursor: pointer +} + +.grd-positive-currency { + color: #047006 +} + +.grd-negative-currency { + color: red +} + +.color-success { + color: var(--success) +} + +.color-danger { + color: var(--danger) +} + +.color-warning { + color: var(--warning) +} + +.color-primary { + color: var(--primary) +} + +.btn-gradido-orange { + color: #fff; + background-color: #ffa600; + border-color: #ffa600 +} + +.visible-modal { + display: block +} + +.margin-top-10 { + margin-top: 10px +} + +.pull-right { + float: right +} + +.pull-right-row { + display: block; + margin-right: 10px +} + +.display-block { + display: block +} + +p.grd_small { + margin-top: 2px; + margin-bottom: 2px +} + +ul.grd-no-style { + list-style-type: none +} + +.center-ul-container ul { + padding-left: 0; + margin-bottom: 0; + text-align: center +} + +.center-ul-container ul .grd-error { + margin-top: 5px; + color: #8b0000 +} + +.grd-alert-color { + color: #ff5f66 !important +} + +.grd-success-color { + color: #047006 !important +} + +.grd-orange-color { + color: #ffa600 +} + +.hidden { + display: none +} + +.alert { + cursor: pointer +} + +.table.table-auto-break td, +.table.table-auto-break th { + white-space: pre-line +} + +.grd-passphrase-words { + cursor: pointer +} + +.authentication-theme .reset-pwd-link, +.authentication-theme .signup-link { + margin: 20px auto 0 auto; + text-align: center; + display: -webkit-box; + display: flex; + -webkit-box-pack: center; + justify-content: center +} + +.authentication-theme .reset-pwd-link a, +.authentication-theme .signup-link a { + display: inline-block; + margin-left: 10px +} + +.authentication-theme .auth_footer { + margin-top: 30px +} + +.authentication-theme.auth-style_1 { + min-height: 100vh; + width: 100%; + background: #f9fafb; + padding: 10% 0 2px 0 +} + +.authentication-theme.auth-style_1 .logo-section { + margin-bottom: 50px +} + +.authentication-theme.auth-style_1 .grid-body { + padding: 60px 15px; + padding-bottom: 80px; + position: relative +} + +.authentication-theme.auth-style_1 .grid-body .form-wrapper { + position: unset +} + +.authentication-theme.auth-style_1 .grid-body-small { + padding: 15px 5px; + position: relative +} + +.authentication-theme.auth-style_1 .signup-link { + position: absolute; + bottom: 25px; + left: 0; + right: 0 +} + +.authentication-theme.auth-style_1 .reset-pwd-link { + position: absolute; + bottom: 20px; + left: 0; + right: 0 +} + +.authentication-theme.auth-style_2 { + display: -webkit-box; + display: flex; + -webkit-box-align: stretch; + align-items: stretch; + -webkit-box-pack: center; + justify-content: center; + min-height: 100vh +} + +.authentication-theme.auth-style_2 .inner-wrapper { + width: 100% +} + +.authentication-theme.auth-style_2 .banner-section { + background: url(http://www.placehold.it/1200x800) no-repeat center; + background-size: 60%; + background-color: #fff; + display: -webkit-box; + display: flex; + -webkit-box-align: end; + align-items: flex-end +} + +.authentication-theme.auth-style_2 .banner-section .auth_footer { + padding: 20px 20px +} + +@media (max-width:767.98px) { + .authentication-theme.auth-style_2 .banner-section { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 0 + } + +} + +.authentication-theme.auth-style_2 .form-section { + background-color: #fff; + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + -webkit-box-pack: center; + justify-content: center; + -webkit-box-align: center; + align-items: center +} + +.authentication-theme.auth-style_2 .form-section .logo-section { + margin: 0 auto 50px auto +} + +.authentication-theme.auth-style_2 .form-section form { + width: 100%; + max-width: 350px; + margin: 0 auto +} + +@media (max-width:767.98px) { + .authentication-theme.auth-style_2 .form-section { + background: rgba(255, 255, 255, .96) + } + +} + +.authentication-theme.auth-style_3 { + background: url(http://www.placehold.it/1200x800) no-repeat center; + background-size: cover; + background-color: #fff; + min-height: 100vh; + height: 100%; + display: -webkit-box; + display: flex; + -webkit-box-align: stretch; + align-items: stretch; + -webkit-box-pack: center; + justify-content: center +} + +.authentication-theme.auth-style_3 .inner-wrapper { + width: 100% +} + +.authentication-theme.auth-style_3 .logo-section { + margin: 0 auto 50px auto +} + +.authentication-theme.auth-style_3 .form-section { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center +} + +.authentication-theme.auth-style_3 .form-section form { + width: 100%; + max-width: 400px; + margin: 0 auto +} + +@media (max-width:767.98px) { + .authentication-theme.auth-style_3 .form-section form { + max-width: 300px + } + +} diff --git a/community_server/webroot/css/main.css b/community_server/webroot/css/main.css new file mode 100644 index 000000000..3e16f1164 --- /dev/null +++ b/community_server/webroot/css/main.css @@ -0,0 +1,25 @@ +@charset "UTF-8"; +/* ============================================================ + + Common CSS file, importing other files. + + Datei : main.css + Datum : 2020-04-30 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ + +@import url(normalize.css); +@import url(grd_styles.css); + +/*! debug.css v0.0.3 | MIT License | https://gist.github.com/zaydek/6b2e55258734deabbd2b4a284321d6f6 */ +[debug], +[debug] * { + color: hsla(210, 100%, 100%, 0.9) !important; + background: hsla(210, 100%, 50%, 0.5) !important; + outline: solid 0.25rem hsla(210, 100%, 100%, 0.5) !important; + + box-shadow: none !important; + filter: none !important; +} diff --git a/community_server/webroot/css/materialdesignicons.min.css b/community_server/webroot/css/materialdesignicons.min.css new file mode 100644 index 000000000..07688156b --- /dev/null +++ b/community_server/webroot/css/materialdesignicons.min.css @@ -0,0 +1,2 @@ +/* MaterialDesignIcons.com */@font-face{font-family:"Material Design Icons";src:url("../fonts/materialdesignicons-webfont.eot?v=3.5.95");src:url("../fonts/materialdesignicons-webfont.eot?#iefix&v=3.5.95") format("embedded-opentype"),url("../fonts/materialdesignicons-webfont.woff2?v=3.5.95") format("woff2"),url("../fonts/materialdesignicons-webfont.woff?v=3.5.95") format("woff"),url("../fonts/materialdesignicons-webfont.ttf?v=3.5.95") format("truetype"),url("../fonts/materialdesignicons-webfont.svg?v=3.5.95#materialdesigniconsregular") format("svg");font-weight:normal;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-access-point:before{content:"\F002"}.mdi-access-point-network:before{content:"\F003"}.mdi-access-point-network-off:before{content:"\FBBD"}.mdi-account:before{content:"\F004"}.mdi-account-alert:before{content:"\F005"}.mdi-account-alert-outline:before{content:"\FB2C"}.mdi-account-arrow-left:before{content:"\FB2D"}.mdi-account-arrow-left-outline:before{content:"\FB2E"}.mdi-account-arrow-right:before{content:"\FB2F"}.mdi-account-arrow-right-outline:before{content:"\FB30"}.mdi-account-badge:before{content:"\FD83"}.mdi-account-badge-alert:before{content:"\FD84"}.mdi-account-badge-alert-outline:before{content:"\FD85"}.mdi-account-badge-outline:before{content:"\FD86"}.mdi-account-box:before{content:"\F006"}.mdi-account-box-multiple:before{content:"\F933"}.mdi-account-box-outline:before{content:"\F007"}.mdi-account-card-details:before{content:"\F5D2"}.mdi-account-card-details-outline:before{content:"\FD87"}.mdi-account-check:before{content:"\F008"}.mdi-account-check-outline:before{content:"\FBBE"}.mdi-account-child:before{content:"\FA88"}.mdi-account-child-circle:before{content:"\FA89"}.mdi-account-circle:before{content:"\F009"}.mdi-account-circle-outline:before{content:"\FB31"}.mdi-account-clock:before{content:"\FB32"}.mdi-account-clock-outline:before{content:"\FB33"}.mdi-account-convert:before{content:"\F00A"}.mdi-account-details:before{content:"\F631"}.mdi-account-edit:before{content:"\F6BB"}.mdi-account-group:before{content:"\F848"}.mdi-account-group-outline:before{content:"\FB34"}.mdi-account-heart:before{content:"\F898"}.mdi-account-heart-outline:before{content:"\FBBF"}.mdi-account-key:before{content:"\F00B"}.mdi-account-key-outline:before{content:"\FBC0"}.mdi-account-minus:before{content:"\F00D"}.mdi-account-minus-outline:before{content:"\FAEB"}.mdi-account-multiple:before{content:"\F00E"}.mdi-account-multiple-check:before{content:"\F8C4"}.mdi-account-multiple-minus:before{content:"\F5D3"}.mdi-account-multiple-minus-outline:before{content:"\FBC1"}.mdi-account-multiple-outline:before{content:"\F00F"}.mdi-account-multiple-plus:before{content:"\F010"}.mdi-account-multiple-plus-outline:before{content:"\F7FF"}.mdi-account-network:before{content:"\F011"}.mdi-account-network-outline:before{content:"\FBC2"}.mdi-account-off:before{content:"\F012"}.mdi-account-off-outline:before{content:"\FBC3"}.mdi-account-outline:before{content:"\F013"}.mdi-account-plus:before{content:"\F014"}.mdi-account-plus-outline:before{content:"\F800"}.mdi-account-question:before{content:"\FB35"}.mdi-account-question-outline:before{content:"\FB36"}.mdi-account-remove:before{content:"\F015"}.mdi-account-remove-outline:before{content:"\FAEC"}.mdi-account-search:before{content:"\F016"}.mdi-account-search-outline:before{content:"\F934"}.mdi-account-settings:before{content:"\F630"}.mdi-account-star:before{content:"\F017"}.mdi-account-star-outline:before{content:"\FBC4"}.mdi-account-supervisor:before{content:"\FA8A"}.mdi-account-supervisor-circle:before{content:"\FA8B"}.mdi-account-switch:before{content:"\F019"}.mdi-account-tie:before{content:"\FCBF"}.mdi-accusoft:before{content:"\F849"}.mdi-adchoices:before{content:"\FD1E"}.mdi-adjust:before{content:"\F01A"}.mdi-adobe:before{content:"\F935"}.mdi-air-conditioner:before{content:"\F01B"}.mdi-air-filter:before{content:"\FD1F"}.mdi-air-horn:before{content:"\FD88"}.mdi-air-purifier:before{content:"\FD20"}.mdi-airbag:before{content:"\FBC5"}.mdi-airballoon:before{content:"\F01C"}.mdi-airplane:before{content:"\F01D"}.mdi-airplane-landing:before{content:"\F5D4"}.mdi-airplane-off:before{content:"\F01E"}.mdi-airplane-takeoff:before{content:"\F5D5"}.mdi-airplay:before{content:"\F01F"}.mdi-airport:before{content:"\F84A"}.mdi-alarm:before{content:"\F020"}.mdi-alarm-bell:before{content:"\F78D"}.mdi-alarm-check:before{content:"\F021"}.mdi-alarm-light:before{content:"\F78E"}.mdi-alarm-light-outline:before{content:"\FBC6"}.mdi-alarm-multiple:before{content:"\F022"}.mdi-alarm-off:before{content:"\F023"}.mdi-alarm-plus:before{content:"\F024"}.mdi-alarm-snooze:before{content:"\F68D"}.mdi-album:before{content:"\F025"}.mdi-alert:before{content:"\F026"}.mdi-alert-box:before{content:"\F027"}.mdi-alert-box-outline:before{content:"\FCC0"}.mdi-alert-circle:before{content:"\F028"}.mdi-alert-circle-outline:before{content:"\F5D6"}.mdi-alert-decagram:before{content:"\F6BC"}.mdi-alert-decagram-outline:before{content:"\FCC1"}.mdi-alert-octagon:before{content:"\F029"}.mdi-alert-octagon-outline:before{content:"\FCC2"}.mdi-alert-octagram:before{content:"\F766"}.mdi-alert-octagram-outline:before{content:"\FCC3"}.mdi-alert-outline:before{content:"\F02A"}.mdi-alien:before{content:"\F899"}.mdi-all-inclusive:before{content:"\F6BD"}.mdi-alpha:before{content:"\F02B"}.mdi-alpha-a:before{content:"\41"}.mdi-alpha-a-box:before{content:"\FAED"}.mdi-alpha-a-box-outline:before{content:"\FBC7"}.mdi-alpha-a-circle:before{content:"\FBC8"}.mdi-alpha-a-circle-outline:before{content:"\FBC9"}.mdi-alpha-b:before{content:"\42"}.mdi-alpha-b-box:before{content:"\FAEE"}.mdi-alpha-b-box-outline:before{content:"\FBCA"}.mdi-alpha-b-circle:before{content:"\FBCB"}.mdi-alpha-b-circle-outline:before{content:"\FBCC"}.mdi-alpha-c:before{content:"\43"}.mdi-alpha-c-box:before{content:"\FAEF"}.mdi-alpha-c-box-outline:before{content:"\FBCD"}.mdi-alpha-c-circle:before{content:"\FBCE"}.mdi-alpha-c-circle-outline:before{content:"\FBCF"}.mdi-alpha-d:before{content:"\44"}.mdi-alpha-d-box:before{content:"\FAF0"}.mdi-alpha-d-box-outline:before{content:"\FBD0"}.mdi-alpha-d-circle:before{content:"\FBD1"}.mdi-alpha-d-circle-outline:before{content:"\FBD2"}.mdi-alpha-e:before{content:"\45"}.mdi-alpha-e-box:before{content:"\FAF1"}.mdi-alpha-e-box-outline:before{content:"\FBD3"}.mdi-alpha-e-circle:before{content:"\FBD4"}.mdi-alpha-e-circle-outline:before{content:"\FBD5"}.mdi-alpha-f:before{content:"\46"}.mdi-alpha-f-box:before{content:"\FAF2"}.mdi-alpha-f-box-outline:before{content:"\FBD6"}.mdi-alpha-f-circle:before{content:"\FBD7"}.mdi-alpha-f-circle-outline:before{content:"\FBD8"}.mdi-alpha-g:before{content:"\47"}.mdi-alpha-g-box:before{content:"\FAF3"}.mdi-alpha-g-box-outline:before{content:"\FBD9"}.mdi-alpha-g-circle:before{content:"\FBDA"}.mdi-alpha-g-circle-outline:before{content:"\FBDB"}.mdi-alpha-h:before{content:"\48"}.mdi-alpha-h-box:before{content:"\FAF4"}.mdi-alpha-h-box-outline:before{content:"\FBDC"}.mdi-alpha-h-circle:before{content:"\FBDD"}.mdi-alpha-h-circle-outline:before{content:"\FBDE"}.mdi-alpha-i:before{content:"\49"}.mdi-alpha-i-box:before{content:"\FAF5"}.mdi-alpha-i-box-outline:before{content:"\FBDF"}.mdi-alpha-i-circle:before{content:"\FBE0"}.mdi-alpha-i-circle-outline:before{content:"\FBE1"}.mdi-alpha-j:before{content:"\4A"}.mdi-alpha-j-box:before{content:"\FAF6"}.mdi-alpha-j-box-outline:before{content:"\FBE2"}.mdi-alpha-j-circle:before{content:"\FBE3"}.mdi-alpha-j-circle-outline:before{content:"\FBE4"}.mdi-alpha-k:before{content:"\4B"}.mdi-alpha-k-box:before{content:"\FAF7"}.mdi-alpha-k-box-outline:before{content:"\FBE5"}.mdi-alpha-k-circle:before{content:"\FBE6"}.mdi-alpha-k-circle-outline:before{content:"\FBE7"}.mdi-alpha-l:before{content:"\4C"}.mdi-alpha-l-box:before{content:"\FAF8"}.mdi-alpha-l-box-outline:before{content:"\FBE8"}.mdi-alpha-l-circle:before{content:"\FBE9"}.mdi-alpha-l-circle-outline:before{content:"\FBEA"}.mdi-alpha-m:before{content:"\4D"}.mdi-alpha-m-box:before{content:"\FAF9"}.mdi-alpha-m-box-outline:before{content:"\FBEB"}.mdi-alpha-m-circle:before{content:"\FBEC"}.mdi-alpha-m-circle-outline:before{content:"\FBED"}.mdi-alpha-n:before{content:"\4E"}.mdi-alpha-n-box:before{content:"\FAFA"}.mdi-alpha-n-box-outline:before{content:"\FBEE"}.mdi-alpha-n-circle:before{content:"\FBEF"}.mdi-alpha-n-circle-outline:before{content:"\FBF0"}.mdi-alpha-o:before{content:"\4F"}.mdi-alpha-o-box:before{content:"\FAFB"}.mdi-alpha-o-box-outline:before{content:"\FBF1"}.mdi-alpha-o-circle:before{content:"\FBF2"}.mdi-alpha-o-circle-outline:before{content:"\FBF3"}.mdi-alpha-p:before{content:"\50"}.mdi-alpha-p-box:before{content:"\FAFC"}.mdi-alpha-p-box-outline:before{content:"\FBF4"}.mdi-alpha-p-circle:before{content:"\FBF5"}.mdi-alpha-p-circle-outline:before{content:"\FBF6"}.mdi-alpha-q:before{content:"\51"}.mdi-alpha-q-box:before{content:"\FAFD"}.mdi-alpha-q-box-outline:before{content:"\FBF7"}.mdi-alpha-q-circle:before{content:"\FBF8"}.mdi-alpha-q-circle-outline:before{content:"\FBF9"}.mdi-alpha-r:before{content:"\52"}.mdi-alpha-r-box:before{content:"\FAFE"}.mdi-alpha-r-box-outline:before{content:"\FBFA"}.mdi-alpha-r-circle:before{content:"\FBFB"}.mdi-alpha-r-circle-outline:before{content:"\FBFC"}.mdi-alpha-s:before{content:"\53"}.mdi-alpha-s-box:before{content:"\FAFF"}.mdi-alpha-s-box-outline:before{content:"\FBFD"}.mdi-alpha-s-circle:before{content:"\FBFE"}.mdi-alpha-s-circle-outline:before{content:"\FBFF"}.mdi-alpha-t:before{content:"\54"}.mdi-alpha-t-box:before{content:"\FB00"}.mdi-alpha-t-box-outline:before{content:"\FC00"}.mdi-alpha-t-circle:before{content:"\FC01"}.mdi-alpha-t-circle-outline:before{content:"\FC02"}.mdi-alpha-u:before{content:"\55"}.mdi-alpha-u-box:before{content:"\FB01"}.mdi-alpha-u-box-outline:before{content:"\FC03"}.mdi-alpha-u-circle:before{content:"\FC04"}.mdi-alpha-u-circle-outline:before{content:"\FC05"}.mdi-alpha-v:before{content:"\56"}.mdi-alpha-v-box:before{content:"\FB02"}.mdi-alpha-v-box-outline:before{content:"\FC06"}.mdi-alpha-v-circle:before{content:"\FC07"}.mdi-alpha-v-circle-outline:before{content:"\FC08"}.mdi-alpha-w:before{content:"\57"}.mdi-alpha-w-box:before{content:"\FB03"}.mdi-alpha-w-box-outline:before{content:"\FC09"}.mdi-alpha-w-circle:before{content:"\FC0A"}.mdi-alpha-w-circle-outline:before{content:"\FC0B"}.mdi-alpha-x:before{content:"\58"}.mdi-alpha-x-box:before{content:"\FB04"}.mdi-alpha-x-box-outline:before{content:"\FC0C"}.mdi-alpha-x-circle:before{content:"\FC0D"}.mdi-alpha-x-circle-outline:before{content:"\FC0E"}.mdi-alpha-y:before{content:"\59"}.mdi-alpha-y-box:before{content:"\FB05"}.mdi-alpha-y-box-outline:before{content:"\FC0F"}.mdi-alpha-y-circle:before{content:"\FC10"}.mdi-alpha-y-circle-outline:before{content:"\FC11"}.mdi-alpha-z:before{content:"\5A"}.mdi-alpha-z-box:before{content:"\FB06"}.mdi-alpha-z-box-outline:before{content:"\FC12"}.mdi-alpha-z-circle:before{content:"\FC13"}.mdi-alpha-z-circle-outline:before{content:"\FC14"}.mdi-alphabetical:before{content:"\F02C"}.mdi-altimeter:before{content:"\F5D7"}.mdi-amazon:before{content:"\F02D"}.mdi-amazon-alexa:before{content:"\F8C5"}.mdi-amazon-drive:before{content:"\F02E"}.mdi-ambulance:before{content:"\F02F"}.mdi-ammunition:before{content:"\FCC4"}.mdi-ampersand:before{content:"\FA8C"}.mdi-amplifier:before{content:"\F030"}.mdi-anchor:before{content:"\F031"}.mdi-android:before{content:"\F032"}.mdi-android-auto:before{content:"\FA8D"}.mdi-android-debug-bridge:before{content:"\F033"}.mdi-android-head:before{content:"\F78F"}.mdi-android-messages:before{content:"\FD21"}.mdi-android-studio:before{content:"\F034"}.mdi-angle-acute:before{content:"\F936"}.mdi-angle-obtuse:before{content:"\F937"}.mdi-angle-right:before{content:"\F938"}.mdi-angular:before{content:"\F6B1"}.mdi-angularjs:before{content:"\F6BE"}.mdi-animation:before{content:"\F5D8"}.mdi-animation-outline:before{content:"\FA8E"}.mdi-animation-play:before{content:"\F939"}.mdi-animation-play-outline:before{content:"\FA8F"}.mdi-anvil:before{content:"\F89A"}.mdi-apple:before{content:"\F035"}.mdi-apple-finder:before{content:"\F036"}.mdi-apple-icloud:before{content:"\F038"}.mdi-apple-ios:before{content:"\F037"}.mdi-apple-keyboard-caps:before{content:"\F632"}.mdi-apple-keyboard-command:before{content:"\F633"}.mdi-apple-keyboard-control:before{content:"\F634"}.mdi-apple-keyboard-option:before{content:"\F635"}.mdi-apple-keyboard-shift:before{content:"\F636"}.mdi-apple-safari:before{content:"\F039"}.mdi-application:before{content:"\F614"}.mdi-application-export:before{content:"\FD89"}.mdi-application-import:before{content:"\FD8A"}.mdi-apps:before{content:"\F03B"}.mdi-apps-box:before{content:"\FD22"}.mdi-arch:before{content:"\F8C6"}.mdi-archive:before{content:"\F03C"}.mdi-arrange-bring-forward:before{content:"\F03D"}.mdi-arrange-bring-to-front:before{content:"\F03E"}.mdi-arrange-send-backward:before{content:"\F03F"}.mdi-arrange-send-to-back:before{content:"\F040"}.mdi-arrow-all:before{content:"\F041"}.mdi-arrow-bottom-left:before{content:"\F042"}.mdi-arrow-bottom-left-bold-outline:before{content:"\F9B6"}.mdi-arrow-bottom-left-thick:before{content:"\F9B7"}.mdi-arrow-bottom-right:before{content:"\F043"}.mdi-arrow-bottom-right-bold-outline:before{content:"\F9B8"}.mdi-arrow-bottom-right-thick:before{content:"\F9B9"}.mdi-arrow-collapse:before{content:"\F615"}.mdi-arrow-collapse-all:before{content:"\F044"}.mdi-arrow-collapse-down:before{content:"\F791"}.mdi-arrow-collapse-horizontal:before{content:"\F84B"}.mdi-arrow-collapse-left:before{content:"\F792"}.mdi-arrow-collapse-right:before{content:"\F793"}.mdi-arrow-collapse-up:before{content:"\F794"}.mdi-arrow-collapse-vertical:before{content:"\F84C"}.mdi-arrow-decision:before{content:"\F9BA"}.mdi-arrow-decision-auto:before{content:"\F9BB"}.mdi-arrow-decision-auto-outline:before{content:"\F9BC"}.mdi-arrow-decision-outline:before{content:"\F9BD"}.mdi-arrow-down:before{content:"\F045"}.mdi-arrow-down-bold:before{content:"\F72D"}.mdi-arrow-down-bold-box:before{content:"\F72E"}.mdi-arrow-down-bold-box-outline:before{content:"\F72F"}.mdi-arrow-down-bold-circle:before{content:"\F047"}.mdi-arrow-down-bold-circle-outline:before{content:"\F048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\F049"}.mdi-arrow-down-bold-outline:before{content:"\F9BE"}.mdi-arrow-down-box:before{content:"\F6BF"}.mdi-arrow-down-circle:before{content:"\FCB7"}.mdi-arrow-down-circle-outline:before{content:"\FCB8"}.mdi-arrow-down-drop-circle:before{content:"\F04A"}.mdi-arrow-down-drop-circle-outline:before{content:"\F04B"}.mdi-arrow-down-thick:before{content:"\F046"}.mdi-arrow-expand:before{content:"\F616"}.mdi-arrow-expand-all:before{content:"\F04C"}.mdi-arrow-expand-down:before{content:"\F795"}.mdi-arrow-expand-horizontal:before{content:"\F84D"}.mdi-arrow-expand-left:before{content:"\F796"}.mdi-arrow-expand-right:before{content:"\F797"}.mdi-arrow-expand-up:before{content:"\F798"}.mdi-arrow-expand-vertical:before{content:"\F84E"}.mdi-arrow-left:before{content:"\F04D"}.mdi-arrow-left-bold:before{content:"\F730"}.mdi-arrow-left-bold-box:before{content:"\F731"}.mdi-arrow-left-bold-box-outline:before{content:"\F732"}.mdi-arrow-left-bold-circle:before{content:"\F04F"}.mdi-arrow-left-bold-circle-outline:before{content:"\F050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\F051"}.mdi-arrow-left-bold-outline:before{content:"\F9BF"}.mdi-arrow-left-box:before{content:"\F6C0"}.mdi-arrow-left-circle:before{content:"\FCB9"}.mdi-arrow-left-circle-outline:before{content:"\FCBA"}.mdi-arrow-left-drop-circle:before{content:"\F052"}.mdi-arrow-left-drop-circle-outline:before{content:"\F053"}.mdi-arrow-left-right-bold-outline:before{content:"\F9C0"}.mdi-arrow-left-thick:before{content:"\F04E"}.mdi-arrow-right:before{content:"\F054"}.mdi-arrow-right-bold:before{content:"\F733"}.mdi-arrow-right-bold-box:before{content:"\F734"}.mdi-arrow-right-bold-box-outline:before{content:"\F735"}.mdi-arrow-right-bold-circle:before{content:"\F056"}.mdi-arrow-right-bold-circle-outline:before{content:"\F057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\F058"}.mdi-arrow-right-bold-outline:before{content:"\F9C1"}.mdi-arrow-right-box:before{content:"\F6C1"}.mdi-arrow-right-circle:before{content:"\FCBB"}.mdi-arrow-right-circle-outline:before{content:"\FCBC"}.mdi-arrow-right-drop-circle:before{content:"\F059"}.mdi-arrow-right-drop-circle-outline:before{content:"\F05A"}.mdi-arrow-right-thick:before{content:"\F055"}.mdi-arrow-split-horizontal:before{content:"\F93A"}.mdi-arrow-split-vertical:before{content:"\F93B"}.mdi-arrow-top-left:before{content:"\F05B"}.mdi-arrow-top-left-bold-outline:before{content:"\F9C2"}.mdi-arrow-top-left-thick:before{content:"\F9C3"}.mdi-arrow-top-right:before{content:"\F05C"}.mdi-arrow-top-right-bold-outline:before{content:"\F9C4"}.mdi-arrow-top-right-thick:before{content:"\F9C5"}.mdi-arrow-up:before{content:"\F05D"}.mdi-arrow-up-bold:before{content:"\F736"}.mdi-arrow-up-bold-box:before{content:"\F737"}.mdi-arrow-up-bold-box-outline:before{content:"\F738"}.mdi-arrow-up-bold-circle:before{content:"\F05F"}.mdi-arrow-up-bold-circle-outline:before{content:"\F060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\F061"}.mdi-arrow-up-bold-outline:before{content:"\F9C6"}.mdi-arrow-up-box:before{content:"\F6C2"}.mdi-arrow-up-circle:before{content:"\FCBD"}.mdi-arrow-up-circle-outline:before{content:"\FCBE"}.mdi-arrow-up-down-bold-outline:before{content:"\F9C7"}.mdi-arrow-up-drop-circle:before{content:"\F062"}.mdi-arrow-up-drop-circle-outline:before{content:"\F063"}.mdi-arrow-up-thick:before{content:"\F05E"}.mdi-artist:before{content:"\F802"}.mdi-artist-outline:before{content:"\FCC5"}.mdi-artstation:before{content:"\FB37"}.mdi-aspect-ratio:before{content:"\FA23"}.mdi-assistant:before{content:"\F064"}.mdi-asterisk:before{content:"\F6C3"}.mdi-at:before{content:"\F065"}.mdi-atlassian:before{content:"\F803"}.mdi-atm:before{content:"\FD23"}.mdi-atom:before{content:"\F767"}.mdi-attachment:before{content:"\F066"}.mdi-audio-video:before{content:"\F93C"}.mdi-audiobook:before{content:"\F067"}.mdi-augmented-reality:before{content:"\F84F"}.mdi-auto-fix:before{content:"\F068"}.mdi-auto-upload:before{content:"\F069"}.mdi-autorenew:before{content:"\F06A"}.mdi-av-timer:before{content:"\F06B"}.mdi-axe:before{content:"\F8C7"}.mdi-axis:before{content:"\FD24"}.mdi-axis-arrow:before{content:"\FD25"}.mdi-axis-arrow-lock:before{content:"\FD26"}.mdi-axis-lock:before{content:"\FD27"}.mdi-axis-x-arrow:before{content:"\FD28"}.mdi-axis-x-arrow-lock:before{content:"\FD29"}.mdi-axis-x-rotate-clockwise:before{content:"\FD2A"}.mdi-axis-x-rotate-counterclockwise:before{content:"\FD2B"}.mdi-axis-x-y-arrow-lock:before{content:"\FD2C"}.mdi-axis-y-arrow:before{content:"\FD2D"}.mdi-axis-y-arrow-lock:before{content:"\FD2E"}.mdi-axis-y-rotate-clockwise:before{content:"\FD2F"}.mdi-axis-y-rotate-counterclockwise:before{content:"\FD30"}.mdi-axis-z-arrow:before{content:"\FD31"}.mdi-axis-z-arrow-lock:before{content:"\FD32"}.mdi-axis-z-rotate-clockwise:before{content:"\FD33"}.mdi-axis-z-rotate-counterclockwise:before{content:"\FD34"}.mdi-azure:before{content:"\F804"}.mdi-babel:before{content:"\FA24"}.mdi-baby:before{content:"\F06C"}.mdi-baby-buggy:before{content:"\F68E"}.mdi-backburger:before{content:"\F06D"}.mdi-backspace:before{content:"\F06E"}.mdi-backspace-outline:before{content:"\FB38"}.mdi-backup-restore:before{content:"\F06F"}.mdi-badminton:before{content:"\F850"}.mdi-balloon:before{content:"\FA25"}.mdi-ballot:before{content:"\F9C8"}.mdi-ballot-outline:before{content:"\F9C9"}.mdi-ballot-recount:before{content:"\FC15"}.mdi-ballot-recount-outline:before{content:"\FC16"}.mdi-bandage:before{content:"\FD8B"}.mdi-bandcamp:before{content:"\F674"}.mdi-bank:before{content:"\F070"}.mdi-bank-minus:before{content:"\FD8C"}.mdi-bank-plus:before{content:"\FD8D"}.mdi-bank-remove:before{content:"\FD8E"}.mdi-bank-transfer:before{content:"\FA26"}.mdi-bank-transfer-in:before{content:"\FA27"}.mdi-bank-transfer-out:before{content:"\FA28"}.mdi-barcode:before{content:"\F071"}.mdi-barcode-scan:before{content:"\F072"}.mdi-barley:before{content:"\F073"}.mdi-barley-off:before{content:"\FB39"}.mdi-barn:before{content:"\FB3A"}.mdi-barrel:before{content:"\F074"}.mdi-baseball:before{content:"\F851"}.mdi-baseball-bat:before{content:"\F852"}.mdi-basecamp:before{content:"\F075"}.mdi-basket:before{content:"\F076"}.mdi-basket-fill:before{content:"\F077"}.mdi-basket-unfill:before{content:"\F078"}.mdi-basketball:before{content:"\F805"}.mdi-basketball-hoop:before{content:"\FC17"}.mdi-basketball-hoop-outline:before{content:"\FC18"}.mdi-bat:before{content:"\FB3B"}.mdi-battery:before{content:"\F079"}.mdi-battery-10:before{content:"\F07A"}.mdi-battery-10-bluetooth:before{content:"\F93D"}.mdi-battery-20:before{content:"\F07B"}.mdi-battery-20-bluetooth:before{content:"\F93E"}.mdi-battery-30:before{content:"\F07C"}.mdi-battery-30-bluetooth:before{content:"\F93F"}.mdi-battery-40:before{content:"\F07D"}.mdi-battery-40-bluetooth:before{content:"\F940"}.mdi-battery-50:before{content:"\F07E"}.mdi-battery-50-bluetooth:before{content:"\F941"}.mdi-battery-60:before{content:"\F07F"}.mdi-battery-60-bluetooth:before{content:"\F942"}.mdi-battery-70:before{content:"\F080"}.mdi-battery-70-bluetooth:before{content:"\F943"}.mdi-battery-80:before{content:"\F081"}.mdi-battery-80-bluetooth:before{content:"\F944"}.mdi-battery-90:before{content:"\F082"}.mdi-battery-90-bluetooth:before{content:"\F945"}.mdi-battery-alert:before{content:"\F083"}.mdi-battery-alert-bluetooth:before{content:"\F946"}.mdi-battery-bluetooth:before{content:"\F947"}.mdi-battery-bluetooth-variant:before{content:"\F948"}.mdi-battery-charging:before{content:"\F084"}.mdi-battery-charging-10:before{content:"\F89B"}.mdi-battery-charging-100:before{content:"\F085"}.mdi-battery-charging-20:before{content:"\F086"}.mdi-battery-charging-30:before{content:"\F087"}.mdi-battery-charging-40:before{content:"\F088"}.mdi-battery-charging-50:before{content:"\F89C"}.mdi-battery-charging-60:before{content:"\F089"}.mdi-battery-charging-70:before{content:"\F89D"}.mdi-battery-charging-80:before{content:"\F08A"}.mdi-battery-charging-90:before{content:"\F08B"}.mdi-battery-charging-outline:before{content:"\F89E"}.mdi-battery-charging-wireless:before{content:"\F806"}.mdi-battery-charging-wireless-10:before{content:"\F807"}.mdi-battery-charging-wireless-20:before{content:"\F808"}.mdi-battery-charging-wireless-30:before{content:"\F809"}.mdi-battery-charging-wireless-40:before{content:"\F80A"}.mdi-battery-charging-wireless-50:before{content:"\F80B"}.mdi-battery-charging-wireless-60:before{content:"\F80C"}.mdi-battery-charging-wireless-70:before{content:"\F80D"}.mdi-battery-charging-wireless-80:before{content:"\F80E"}.mdi-battery-charging-wireless-90:before{content:"\F80F"}.mdi-battery-charging-wireless-alert:before{content:"\F810"}.mdi-battery-charging-wireless-outline:before{content:"\F811"}.mdi-battery-minus:before{content:"\F08C"}.mdi-battery-negative:before{content:"\F08D"}.mdi-battery-outline:before{content:"\F08E"}.mdi-battery-plus:before{content:"\F08F"}.mdi-battery-positive:before{content:"\F090"}.mdi-battery-unknown:before{content:"\F091"}.mdi-battery-unknown-bluetooth:before{content:"\F949"}.mdi-battlenet:before{content:"\FB3C"}.mdi-beach:before{content:"\F092"}.mdi-beaker:before{content:"\FCC6"}.mdi-beaker-outline:before{content:"\F68F"}.mdi-beats:before{content:"\F097"}.mdi-bed-empty:before{content:"\F89F"}.mdi-beer:before{content:"\F098"}.mdi-behance:before{content:"\F099"}.mdi-bell:before{content:"\F09A"}.mdi-bell-alert:before{content:"\FD35"}.mdi-bell-circle:before{content:"\FD36"}.mdi-bell-circle-outline:before{content:"\FD37"}.mdi-bell-off:before{content:"\F09B"}.mdi-bell-off-outline:before{content:"\FA90"}.mdi-bell-outline:before{content:"\F09C"}.mdi-bell-plus:before{content:"\F09D"}.mdi-bell-plus-outline:before{content:"\FA91"}.mdi-bell-ring:before{content:"\F09E"}.mdi-bell-ring-outline:before{content:"\F09F"}.mdi-bell-sleep:before{content:"\F0A0"}.mdi-bell-sleep-outline:before{content:"\FA92"}.mdi-beta:before{content:"\F0A1"}.mdi-betamax:before{content:"\F9CA"}.mdi-bible:before{content:"\F0A2"}.mdi-bike:before{content:"\F0A3"}.mdi-billiards:before{content:"\FB3D"}.mdi-billiards-rack:before{content:"\FB3E"}.mdi-bing:before{content:"\F0A4"}.mdi-binoculars:before{content:"\F0A5"}.mdi-bio:before{content:"\F0A6"}.mdi-biohazard:before{content:"\F0A7"}.mdi-bitbucket:before{content:"\F0A8"}.mdi-bitcoin:before{content:"\F812"}.mdi-black-mesa:before{content:"\F0A9"}.mdi-blackberry:before{content:"\F0AA"}.mdi-blender:before{content:"\FCC7"}.mdi-blender-software:before{content:"\F0AB"}.mdi-blinds:before{content:"\F0AC"}.mdi-block-helper:before{content:"\F0AD"}.mdi-blogger:before{content:"\F0AE"}.mdi-blood-bag:before{content:"\FCC8"}.mdi-bluetooth:before{content:"\F0AF"}.mdi-bluetooth-audio:before{content:"\F0B0"}.mdi-bluetooth-connect:before{content:"\F0B1"}.mdi-bluetooth-off:before{content:"\F0B2"}.mdi-bluetooth-settings:before{content:"\F0B3"}.mdi-bluetooth-transfer:before{content:"\F0B4"}.mdi-blur:before{content:"\F0B5"}.mdi-blur-linear:before{content:"\F0B6"}.mdi-blur-off:before{content:"\F0B7"}.mdi-blur-radial:before{content:"\F0B8"}.mdi-bolnisi-cross:before{content:"\FCC9"}.mdi-bolt:before{content:"\FD8F"}.mdi-bomb:before{content:"\F690"}.mdi-bomb-off:before{content:"\F6C4"}.mdi-bone:before{content:"\F0B9"}.mdi-book:before{content:"\F0BA"}.mdi-book-lock:before{content:"\F799"}.mdi-book-lock-open:before{content:"\F79A"}.mdi-book-minus:before{content:"\F5D9"}.mdi-book-multiple:before{content:"\F0BB"}.mdi-book-multiple-minus:before{content:"\FA93"}.mdi-book-multiple-plus:before{content:"\FA94"}.mdi-book-multiple-remove:before{content:"\FA95"}.mdi-book-multiple-variant:before{content:"\F0BC"}.mdi-book-open:before{content:"\F0BD"}.mdi-book-open-outline:before{content:"\FB3F"}.mdi-book-open-page-variant:before{content:"\F5DA"}.mdi-book-open-variant:before{content:"\F0BE"}.mdi-book-outline:before{content:"\FB40"}.mdi-book-plus:before{content:"\F5DB"}.mdi-book-remove:before{content:"\FA96"}.mdi-book-variant:before{content:"\F0BF"}.mdi-bookmark:before{content:"\F0C0"}.mdi-bookmark-check:before{content:"\F0C1"}.mdi-bookmark-minus:before{content:"\F9CB"}.mdi-bookmark-minus-outline:before{content:"\F9CC"}.mdi-bookmark-music:before{content:"\F0C2"}.mdi-bookmark-off:before{content:"\F9CD"}.mdi-bookmark-off-outline:before{content:"\F9CE"}.mdi-bookmark-outline:before{content:"\F0C3"}.mdi-bookmark-plus:before{content:"\F0C5"}.mdi-bookmark-plus-outline:before{content:"\F0C4"}.mdi-bookmark-remove:before{content:"\F0C6"}.mdi-boombox:before{content:"\F5DC"}.mdi-bootstrap:before{content:"\F6C5"}.mdi-border-all:before{content:"\F0C7"}.mdi-border-all-variant:before{content:"\F8A0"}.mdi-border-bottom:before{content:"\F0C8"}.mdi-border-bottom-variant:before{content:"\F8A1"}.mdi-border-color:before{content:"\F0C9"}.mdi-border-horizontal:before{content:"\F0CA"}.mdi-border-inside:before{content:"\F0CB"}.mdi-border-left:before{content:"\F0CC"}.mdi-border-left-variant:before{content:"\F8A2"}.mdi-border-none:before{content:"\F0CD"}.mdi-border-none-variant:before{content:"\F8A3"}.mdi-border-outside:before{content:"\F0CE"}.mdi-border-right:before{content:"\F0CF"}.mdi-border-right-variant:before{content:"\F8A4"}.mdi-border-style:before{content:"\F0D0"}.mdi-border-top:before{content:"\F0D1"}.mdi-border-top-variant:before{content:"\F8A5"}.mdi-border-vertical:before{content:"\F0D2"}.mdi-bottle-wine:before{content:"\F853"}.mdi-bow-tie:before{content:"\F677"}.mdi-bowl:before{content:"\F617"}.mdi-bowling:before{content:"\F0D3"}.mdi-box:before{content:"\F0D4"}.mdi-box-cutter:before{content:"\F0D5"}.mdi-box-shadow:before{content:"\F637"}.mdi-boxing-glove:before{content:"\FB41"}.mdi-braille:before{content:"\F9CF"}.mdi-brain:before{content:"\F9D0"}.mdi-bread-slice:before{content:"\FCCA"}.mdi-bread-slice-outline:before{content:"\FCCB"}.mdi-bridge:before{content:"\F618"}.mdi-briefcase:before{content:"\F0D6"}.mdi-briefcase-account:before{content:"\FCCC"}.mdi-briefcase-account-outline:before{content:"\FCCD"}.mdi-briefcase-check:before{content:"\F0D7"}.mdi-briefcase-download:before{content:"\F0D8"}.mdi-briefcase-download-outline:before{content:"\FC19"}.mdi-briefcase-edit:before{content:"\FA97"}.mdi-briefcase-edit-outline:before{content:"\FC1A"}.mdi-briefcase-minus:before{content:"\FA29"}.mdi-briefcase-minus-outline:before{content:"\FC1B"}.mdi-briefcase-outline:before{content:"\F813"}.mdi-briefcase-plus:before{content:"\FA2A"}.mdi-briefcase-plus-outline:before{content:"\FC1C"}.mdi-briefcase-remove:before{content:"\FA2B"}.mdi-briefcase-remove-outline:before{content:"\FC1D"}.mdi-briefcase-search:before{content:"\FA2C"}.mdi-briefcase-search-outline:before{content:"\FC1E"}.mdi-briefcase-upload:before{content:"\F0D9"}.mdi-briefcase-upload-outline:before{content:"\FC1F"}.mdi-brightness-1:before{content:"\F0DA"}.mdi-brightness-2:before{content:"\F0DB"}.mdi-brightness-3:before{content:"\F0DC"}.mdi-brightness-4:before{content:"\F0DD"}.mdi-brightness-5:before{content:"\F0DE"}.mdi-brightness-6:before{content:"\F0DF"}.mdi-brightness-7:before{content:"\F0E0"}.mdi-brightness-auto:before{content:"\F0E1"}.mdi-brightness-percent:before{content:"\FCCE"}.mdi-broom:before{content:"\F0E2"}.mdi-brush:before{content:"\F0E3"}.mdi-buddhism:before{content:"\F94A"}.mdi-buffer:before{content:"\F619"}.mdi-bug:before{content:"\F0E4"}.mdi-bug-check:before{content:"\FA2D"}.mdi-bug-check-outline:before{content:"\FA2E"}.mdi-bug-outline:before{content:"\FA2F"}.mdi-bugle:before{content:"\FD90"}.mdi-bulldozer:before{content:"\FB07"}.mdi-bullet:before{content:"\FCCF"}.mdi-bulletin-board:before{content:"\F0E5"}.mdi-bullhorn:before{content:"\F0E6"}.mdi-bullhorn-outline:before{content:"\FB08"}.mdi-bullseye:before{content:"\F5DD"}.mdi-bullseye-arrow:before{content:"\F8C8"}.mdi-bus:before{content:"\F0E7"}.mdi-bus-alert:before{content:"\FA98"}.mdi-bus-articulated-end:before{content:"\F79B"}.mdi-bus-articulated-front:before{content:"\F79C"}.mdi-bus-clock:before{content:"\F8C9"}.mdi-bus-double-decker:before{content:"\F79D"}.mdi-bus-school:before{content:"\F79E"}.mdi-bus-side:before{content:"\F79F"}.mdi-cached:before{content:"\F0E8"}.mdi-cactus:before{content:"\FD91"}.mdi-cake:before{content:"\F0E9"}.mdi-cake-layered:before{content:"\F0EA"}.mdi-cake-variant:before{content:"\F0EB"}.mdi-calculator:before{content:"\F0EC"}.mdi-calculator-variant:before{content:"\FA99"}.mdi-calendar:before{content:"\F0ED"}.mdi-calendar-alert:before{content:"\FA30"}.mdi-calendar-blank:before{content:"\F0EE"}.mdi-calendar-blank-outline:before{content:"\FB42"}.mdi-calendar-check:before{content:"\F0EF"}.mdi-calendar-check-outline:before{content:"\FC20"}.mdi-calendar-clock:before{content:"\F0F0"}.mdi-calendar-edit:before{content:"\F8A6"}.mdi-calendar-export:before{content:"\FB09"}.mdi-calendar-heart:before{content:"\F9D1"}.mdi-calendar-import:before{content:"\FB0A"}.mdi-calendar-minus:before{content:"\FD38"}.mdi-calendar-multiple:before{content:"\F0F1"}.mdi-calendar-multiple-check:before{content:"\F0F2"}.mdi-calendar-multiselect:before{content:"\FA31"}.mdi-calendar-outline:before{content:"\FB43"}.mdi-calendar-plus:before{content:"\F0F3"}.mdi-calendar-question:before{content:"\F691"}.mdi-calendar-range:before{content:"\F678"}.mdi-calendar-range-outline:before{content:"\FB44"}.mdi-calendar-remove:before{content:"\F0F4"}.mdi-calendar-remove-outline:before{content:"\FC21"}.mdi-calendar-search:before{content:"\F94B"}.mdi-calendar-star:before{content:"\F9D2"}.mdi-calendar-text:before{content:"\F0F5"}.mdi-calendar-text-outline:before{content:"\FC22"}.mdi-calendar-today:before{content:"\F0F6"}.mdi-calendar-week:before{content:"\FA32"}.mdi-calendar-week-begin:before{content:"\FA33"}.mdi-call-made:before{content:"\F0F7"}.mdi-call-merge:before{content:"\F0F8"}.mdi-call-missed:before{content:"\F0F9"}.mdi-call-received:before{content:"\F0FA"}.mdi-call-split:before{content:"\F0FB"}.mdi-camcorder:before{content:"\F0FC"}.mdi-camcorder-box:before{content:"\F0FD"}.mdi-camcorder-box-off:before{content:"\F0FE"}.mdi-camcorder-off:before{content:"\F0FF"}.mdi-camera:before{content:"\F100"}.mdi-camera-account:before{content:"\F8CA"}.mdi-camera-burst:before{content:"\F692"}.mdi-camera-control:before{content:"\FB45"}.mdi-camera-enhance:before{content:"\F101"}.mdi-camera-enhance-outline:before{content:"\FB46"}.mdi-camera-front:before{content:"\F102"}.mdi-camera-front-variant:before{content:"\F103"}.mdi-camera-gopro:before{content:"\F7A0"}.mdi-camera-image:before{content:"\F8CB"}.mdi-camera-iris:before{content:"\F104"}.mdi-camera-metering-center:before{content:"\F7A1"}.mdi-camera-metering-matrix:before{content:"\F7A2"}.mdi-camera-metering-partial:before{content:"\F7A3"}.mdi-camera-metering-spot:before{content:"\F7A4"}.mdi-camera-off:before{content:"\F5DF"}.mdi-camera-outline:before{content:"\FD39"}.mdi-camera-party-mode:before{content:"\F105"}.mdi-camera-rear:before{content:"\F106"}.mdi-camera-rear-variant:before{content:"\F107"}.mdi-camera-switch:before{content:"\F108"}.mdi-camera-timer:before{content:"\F109"}.mdi-camera-wireless:before{content:"\FD92"}.mdi-camera-wireless-outline:before{content:"\FD93"}.mdi-cancel:before{content:"\F739"}.mdi-candle:before{content:"\F5E2"}.mdi-candycane:before{content:"\F10A"}.mdi-cannabis:before{content:"\F7A5"}.mdi-caps-lock:before{content:"\FA9A"}.mdi-car:before{content:"\F10B"}.mdi-car-battery:before{content:"\F10C"}.mdi-car-brake-abs:before{content:"\FC23"}.mdi-car-brake-alert:before{content:"\FC24"}.mdi-car-brake-hold:before{content:"\FD3A"}.mdi-car-brake-parking:before{content:"\FD3B"}.mdi-car-connected:before{content:"\F10D"}.mdi-car-convertible:before{content:"\F7A6"}.mdi-car-cruise-control:before{content:"\FD3C"}.mdi-car-defrost-front:before{content:"\FD3D"}.mdi-car-defrost-rear:before{content:"\FD3E"}.mdi-car-door:before{content:"\FB47"}.mdi-car-electric:before{content:"\FB48"}.mdi-car-esp:before{content:"\FC25"}.mdi-car-estate:before{content:"\F7A7"}.mdi-car-hatchback:before{content:"\F7A8"}.mdi-car-key:before{content:"\FB49"}.mdi-car-light-dimmed:before{content:"\FC26"}.mdi-car-light-fog:before{content:"\FC27"}.mdi-car-light-high:before{content:"\FC28"}.mdi-car-limousine:before{content:"\F8CC"}.mdi-car-multiple:before{content:"\FB4A"}.mdi-car-parking-lights:before{content:"\FD3F"}.mdi-car-pickup:before{content:"\F7A9"}.mdi-car-side:before{content:"\F7AA"}.mdi-car-sports:before{content:"\F7AB"}.mdi-car-tire-alert:before{content:"\FC29"}.mdi-car-traction-control:before{content:"\FD40"}.mdi-car-wash:before{content:"\F10E"}.mdi-caravan:before{content:"\F7AC"}.mdi-card:before{content:"\FB4B"}.mdi-card-bulleted:before{content:"\FB4C"}.mdi-card-bulleted-off:before{content:"\FB4D"}.mdi-card-bulleted-off-outline:before{content:"\FB4E"}.mdi-card-bulleted-outline:before{content:"\FB4F"}.mdi-card-bulleted-settings:before{content:"\FB50"}.mdi-card-bulleted-settings-outline:before{content:"\FB51"}.mdi-card-outline:before{content:"\FB52"}.mdi-card-text:before{content:"\FB53"}.mdi-card-text-outline:before{content:"\FB54"}.mdi-cards:before{content:"\F638"}.mdi-cards-club:before{content:"\F8CD"}.mdi-cards-diamond:before{content:"\F8CE"}.mdi-cards-heart:before{content:"\F8CF"}.mdi-cards-outline:before{content:"\F639"}.mdi-cards-playing-outline:before{content:"\F63A"}.mdi-cards-spade:before{content:"\F8D0"}.mdi-cards-variant:before{content:"\F6C6"}.mdi-carrot:before{content:"\F10F"}.mdi-carry-on-bag-check:before{content:"\FD41"}.mdi-cart:before{content:"\F110"}.mdi-cart-arrow-down:before{content:"\FD42"}.mdi-cart-arrow-right:before{content:"\FC2A"}.mdi-cart-arrow-up:before{content:"\FD43"}.mdi-cart-minus:before{content:"\FD44"}.mdi-cart-off:before{content:"\F66B"}.mdi-cart-outline:before{content:"\F111"}.mdi-cart-plus:before{content:"\F112"}.mdi-cart-remove:before{content:"\FD45"}.mdi-case-sensitive-alt:before{content:"\F113"}.mdi-cash:before{content:"\F114"}.mdi-cash-100:before{content:"\F115"}.mdi-cash-marker:before{content:"\FD94"}.mdi-cash-multiple:before{content:"\F116"}.mdi-cash-refund:before{content:"\FA9B"}.mdi-cash-register:before{content:"\FCD0"}.mdi-cash-usd:before{content:"\F117"}.mdi-cassette:before{content:"\F9D3"}.mdi-cast:before{content:"\F118"}.mdi-cast-connected:before{content:"\F119"}.mdi-cast-off:before{content:"\F789"}.mdi-castle:before{content:"\F11A"}.mdi-cat:before{content:"\F11B"}.mdi-cctv:before{content:"\F7AD"}.mdi-ceiling-light:before{content:"\F768"}.mdi-cellphone:before{content:"\F11C"}.mdi-cellphone-android:before{content:"\F11D"}.mdi-cellphone-arrow-down:before{content:"\F9D4"}.mdi-cellphone-basic:before{content:"\F11E"}.mdi-cellphone-dock:before{content:"\F11F"}.mdi-cellphone-erase:before{content:"\F94C"}.mdi-cellphone-iphone:before{content:"\F120"}.mdi-cellphone-key:before{content:"\F94D"}.mdi-cellphone-link:before{content:"\F121"}.mdi-cellphone-link-off:before{content:"\F122"}.mdi-cellphone-lock:before{content:"\F94E"}.mdi-cellphone-message:before{content:"\F8D2"}.mdi-cellphone-off:before{content:"\F94F"}.mdi-cellphone-screenshot:before{content:"\FA34"}.mdi-cellphone-settings:before{content:"\F123"}.mdi-cellphone-settings-variant:before{content:"\F950"}.mdi-cellphone-sound:before{content:"\F951"}.mdi-cellphone-text:before{content:"\F8D1"}.mdi-cellphone-wireless:before{content:"\F814"}.mdi-celtic-cross:before{content:"\FCD1"}.mdi-certificate:before{content:"\F124"}.mdi-chair-school:before{content:"\F125"}.mdi-charity:before{content:"\FC2B"}.mdi-chart-arc:before{content:"\F126"}.mdi-chart-areaspline:before{content:"\F127"}.mdi-chart-bar:before{content:"\F128"}.mdi-chart-bar-stacked:before{content:"\F769"}.mdi-chart-bell-curve:before{content:"\FC2C"}.mdi-chart-bubble:before{content:"\F5E3"}.mdi-chart-donut:before{content:"\F7AE"}.mdi-chart-donut-variant:before{content:"\F7AF"}.mdi-chart-gantt:before{content:"\F66C"}.mdi-chart-histogram:before{content:"\F129"}.mdi-chart-line:before{content:"\F12A"}.mdi-chart-line-stacked:before{content:"\F76A"}.mdi-chart-line-variant:before{content:"\F7B0"}.mdi-chart-multiline:before{content:"\F8D3"}.mdi-chart-pie:before{content:"\F12B"}.mdi-chart-scatterplot-hexbin:before{content:"\F66D"}.mdi-chart-timeline:before{content:"\F66E"}.mdi-chat:before{content:"\FB55"}.mdi-chat-alert:before{content:"\FB56"}.mdi-chat-processing:before{content:"\FB57"}.mdi-check:before{content:"\F12C"}.mdi-check-all:before{content:"\F12D"}.mdi-check-box-multiple-outline:before{content:"\FC2D"}.mdi-check-box-outline:before{content:"\FC2E"}.mdi-check-circle:before{content:"\F5E0"}.mdi-check-circle-outline:before{content:"\F5E1"}.mdi-check-decagram:before{content:"\F790"}.mdi-check-network:before{content:"\FC2F"}.mdi-check-network-outline:before{content:"\FC30"}.mdi-check-outline:before{content:"\F854"}.mdi-checkbook:before{content:"\FA9C"}.mdi-checkbox-blank:before{content:"\F12E"}.mdi-checkbox-blank-circle:before{content:"\F12F"}.mdi-checkbox-blank-circle-outline:before{content:"\F130"}.mdi-checkbox-blank-outline:before{content:"\F131"}.mdi-checkbox-intermediate:before{content:"\F855"}.mdi-checkbox-marked:before{content:"\F132"}.mdi-checkbox-marked-circle:before{content:"\F133"}.mdi-checkbox-marked-circle-outline:before{content:"\F134"}.mdi-checkbox-marked-outline:before{content:"\F135"}.mdi-checkbox-multiple-blank:before{content:"\F136"}.mdi-checkbox-multiple-blank-circle:before{content:"\F63B"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\F63C"}.mdi-checkbox-multiple-blank-outline:before{content:"\F137"}.mdi-checkbox-multiple-marked:before{content:"\F138"}.mdi-checkbox-multiple-marked-circle:before{content:"\F63D"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\F63E"}.mdi-checkbox-multiple-marked-outline:before{content:"\F139"}.mdi-checkerboard:before{content:"\F13A"}.mdi-chef-hat:before{content:"\FB58"}.mdi-chemical-weapon:before{content:"\F13B"}.mdi-chess-bishop:before{content:"\F85B"}.mdi-chess-king:before{content:"\F856"}.mdi-chess-knight:before{content:"\F857"}.mdi-chess-pawn:before{content:"\F858"}.mdi-chess-queen:before{content:"\F859"}.mdi-chess-rook:before{content:"\F85A"}.mdi-chevron-double-down:before{content:"\F13C"}.mdi-chevron-double-left:before{content:"\F13D"}.mdi-chevron-double-right:before{content:"\F13E"}.mdi-chevron-double-up:before{content:"\F13F"}.mdi-chevron-down:before{content:"\F140"}.mdi-chevron-down-box:before{content:"\F9D5"}.mdi-chevron-down-box-outline:before{content:"\F9D6"}.mdi-chevron-down-circle:before{content:"\FB0B"}.mdi-chevron-down-circle-outline:before{content:"\FB0C"}.mdi-chevron-left:before{content:"\F141"}.mdi-chevron-left-box:before{content:"\F9D7"}.mdi-chevron-left-box-outline:before{content:"\F9D8"}.mdi-chevron-left-circle:before{content:"\FB0D"}.mdi-chevron-left-circle-outline:before{content:"\FB0E"}.mdi-chevron-right:before{content:"\F142"}.mdi-chevron-right-box:before{content:"\F9D9"}.mdi-chevron-right-box-outline:before{content:"\F9DA"}.mdi-chevron-right-circle:before{content:"\FB0F"}.mdi-chevron-right-circle-outline:before{content:"\FB10"}.mdi-chevron-triple-down:before{content:"\FD95"}.mdi-chevron-triple-left:before{content:"\FD96"}.mdi-chevron-triple-right:before{content:"\FD97"}.mdi-chevron-triple-up:before{content:"\FD98"}.mdi-chevron-up:before{content:"\F143"}.mdi-chevron-up-box:before{content:"\F9DB"}.mdi-chevron-up-box-outline:before{content:"\F9DC"}.mdi-chevron-up-circle:before{content:"\FB11"}.mdi-chevron-up-circle-outline:before{content:"\FB12"}.mdi-chili-hot:before{content:"\F7B1"}.mdi-chili-medium:before{content:"\F7B2"}.mdi-chili-mild:before{content:"\F7B3"}.mdi-chip:before{content:"\F61A"}.mdi-christianity:before{content:"\F952"}.mdi-christianity-outline:before{content:"\FCD2"}.mdi-church:before{content:"\F144"}.mdi-circle:before{content:"\F764"}.mdi-circle-edit-outline:before{content:"\F8D4"}.mdi-circle-medium:before{content:"\F9DD"}.mdi-circle-outline:before{content:"\F765"}.mdi-circle-slice-1:before{content:"\FA9D"}.mdi-circle-slice-2:before{content:"\FA9E"}.mdi-circle-slice-3:before{content:"\FA9F"}.mdi-circle-slice-4:before{content:"\FAA0"}.mdi-circle-slice-5:before{content:"\FAA1"}.mdi-circle-slice-6:before{content:"\FAA2"}.mdi-circle-slice-7:before{content:"\FAA3"}.mdi-circle-slice-8:before{content:"\FAA4"}.mdi-circle-small:before{content:"\F9DE"}.mdi-cisco-webex:before{content:"\F145"}.mdi-city:before{content:"\F146"}.mdi-city-variant:before{content:"\FA35"}.mdi-city-variant-outline:before{content:"\FA36"}.mdi-clipboard:before{content:"\F147"}.mdi-clipboard-account:before{content:"\F148"}.mdi-clipboard-account-outline:before{content:"\FC31"}.mdi-clipboard-alert:before{content:"\F149"}.mdi-clipboard-alert-outline:before{content:"\FCD3"}.mdi-clipboard-arrow-down:before{content:"\F14A"}.mdi-clipboard-arrow-down-outline:before{content:"\FC32"}.mdi-clipboard-arrow-left:before{content:"\F14B"}.mdi-clipboard-arrow-left-outline:before{content:"\FCD4"}.mdi-clipboard-arrow-right:before{content:"\FCD5"}.mdi-clipboard-arrow-right-outline:before{content:"\FCD6"}.mdi-clipboard-arrow-up:before{content:"\FC33"}.mdi-clipboard-arrow-up-outline:before{content:"\FC34"}.mdi-clipboard-check:before{content:"\F14C"}.mdi-clipboard-check-outline:before{content:"\F8A7"}.mdi-clipboard-flow:before{content:"\F6C7"}.mdi-clipboard-outline:before{content:"\F14D"}.mdi-clipboard-play:before{content:"\FC35"}.mdi-clipboard-play-outline:before{content:"\FC36"}.mdi-clipboard-plus:before{content:"\F750"}.mdi-clipboard-pulse:before{content:"\F85C"}.mdi-clipboard-pulse-outline:before{content:"\F85D"}.mdi-clipboard-text:before{content:"\F14E"}.mdi-clipboard-text-outline:before{content:"\FA37"}.mdi-clipboard-text-play:before{content:"\FC37"}.mdi-clipboard-text-play-outline:before{content:"\FC38"}.mdi-clippy:before{content:"\F14F"}.mdi-clock:before{content:"\F953"}.mdi-clock-alert:before{content:"\F954"}.mdi-clock-alert-outline:before{content:"\F5CE"}.mdi-clock-end:before{content:"\F151"}.mdi-clock-fast:before{content:"\F152"}.mdi-clock-in:before{content:"\F153"}.mdi-clock-out:before{content:"\F154"}.mdi-clock-outline:before{content:"\F150"}.mdi-clock-start:before{content:"\F155"}.mdi-close:before{content:"\F156"}.mdi-close-box:before{content:"\F157"}.mdi-close-box-multiple:before{content:"\FC39"}.mdi-close-box-multiple-outline:before{content:"\FC3A"}.mdi-close-box-outline:before{content:"\F158"}.mdi-close-circle:before{content:"\F159"}.mdi-close-circle-outline:before{content:"\F15A"}.mdi-close-network:before{content:"\F15B"}.mdi-close-network-outline:before{content:"\FC3B"}.mdi-close-octagon:before{content:"\F15C"}.mdi-close-octagon-outline:before{content:"\F15D"}.mdi-close-outline:before{content:"\F6C8"}.mdi-closed-caption:before{content:"\F15E"}.mdi-closed-caption-outline:before{content:"\FD99"}.mdi-cloud:before{content:"\F15F"}.mdi-cloud-alert:before{content:"\F9DF"}.mdi-cloud-braces:before{content:"\F7B4"}.mdi-cloud-check:before{content:"\F160"}.mdi-cloud-circle:before{content:"\F161"}.mdi-cloud-download:before{content:"\F162"}.mdi-cloud-download-outline:before{content:"\FB59"}.mdi-cloud-off-outline:before{content:"\F164"}.mdi-cloud-outline:before{content:"\F163"}.mdi-cloud-print:before{content:"\F165"}.mdi-cloud-print-outline:before{content:"\F166"}.mdi-cloud-question:before{content:"\FA38"}.mdi-cloud-search:before{content:"\F955"}.mdi-cloud-search-outline:before{content:"\F956"}.mdi-cloud-sync:before{content:"\F63F"}.mdi-cloud-tags:before{content:"\F7B5"}.mdi-cloud-upload:before{content:"\F167"}.mdi-cloud-upload-outline:before{content:"\FB5A"}.mdi-clover:before{content:"\F815"}.mdi-code-array:before{content:"\F168"}.mdi-code-braces:before{content:"\F169"}.mdi-code-brackets:before{content:"\F16A"}.mdi-code-equal:before{content:"\F16B"}.mdi-code-greater-than:before{content:"\F16C"}.mdi-code-greater-than-or-equal:before{content:"\F16D"}.mdi-code-less-than:before{content:"\F16E"}.mdi-code-less-than-or-equal:before{content:"\F16F"}.mdi-code-not-equal:before{content:"\F170"}.mdi-code-not-equal-variant:before{content:"\F171"}.mdi-code-parentheses:before{content:"\F172"}.mdi-code-string:before{content:"\F173"}.mdi-code-tags:before{content:"\F174"}.mdi-code-tags-check:before{content:"\F693"}.mdi-codepen:before{content:"\F175"}.mdi-coffee:before{content:"\F176"}.mdi-coffee-outline:before{content:"\F6C9"}.mdi-coffee-to-go:before{content:"\F177"}.mdi-coffin:before{content:"\FB5B"}.mdi-cogs:before{content:"\F8D5"}.mdi-coin:before{content:"\F178"}.mdi-coins:before{content:"\F694"}.mdi-collage:before{content:"\F640"}.mdi-collapse-all:before{content:"\FAA5"}.mdi-collapse-all-outline:before{content:"\FAA6"}.mdi-color-helper:before{content:"\F179"}.mdi-comment:before{content:"\F17A"}.mdi-comment-account:before{content:"\F17B"}.mdi-comment-account-outline:before{content:"\F17C"}.mdi-comment-alert:before{content:"\F17D"}.mdi-comment-alert-outline:before{content:"\F17E"}.mdi-comment-arrow-left:before{content:"\F9E0"}.mdi-comment-arrow-left-outline:before{content:"\F9E1"}.mdi-comment-arrow-right:before{content:"\F9E2"}.mdi-comment-arrow-right-outline:before{content:"\F9E3"}.mdi-comment-check:before{content:"\F17F"}.mdi-comment-check-outline:before{content:"\F180"}.mdi-comment-eye:before{content:"\FA39"}.mdi-comment-eye-outline:before{content:"\FA3A"}.mdi-comment-multiple:before{content:"\F85E"}.mdi-comment-multiple-outline:before{content:"\F181"}.mdi-comment-outline:before{content:"\F182"}.mdi-comment-plus:before{content:"\F9E4"}.mdi-comment-plus-outline:before{content:"\F183"}.mdi-comment-processing:before{content:"\F184"}.mdi-comment-processing-outline:before{content:"\F185"}.mdi-comment-question:before{content:"\F816"}.mdi-comment-question-outline:before{content:"\F186"}.mdi-comment-remove:before{content:"\F5DE"}.mdi-comment-remove-outline:before{content:"\F187"}.mdi-comment-search:before{content:"\FA3B"}.mdi-comment-search-outline:before{content:"\FA3C"}.mdi-comment-text:before{content:"\F188"}.mdi-comment-text-multiple:before{content:"\F85F"}.mdi-comment-text-multiple-outline:before{content:"\F860"}.mdi-comment-text-outline:before{content:"\F189"}.mdi-compare:before{content:"\F18A"}.mdi-compass:before{content:"\F18B"}.mdi-compass-off:before{content:"\FB5C"}.mdi-compass-off-outline:before{content:"\FB5D"}.mdi-compass-outline:before{content:"\F18C"}.mdi-console:before{content:"\F18D"}.mdi-console-line:before{content:"\F7B6"}.mdi-console-network:before{content:"\F8A8"}.mdi-console-network-outline:before{content:"\FC3C"}.mdi-contact-mail:before{content:"\F18E"}.mdi-contactless-payment:before{content:"\FD46"}.mdi-contacts:before{content:"\F6CA"}.mdi-contain:before{content:"\FA3D"}.mdi-contain-end:before{content:"\FA3E"}.mdi-contain-start:before{content:"\FA3F"}.mdi-content-copy:before{content:"\F18F"}.mdi-content-cut:before{content:"\F190"}.mdi-content-duplicate:before{content:"\F191"}.mdi-content-paste:before{content:"\F192"}.mdi-content-save:before{content:"\F193"}.mdi-content-save-all:before{content:"\F194"}.mdi-content-save-edit:before{content:"\FCD7"}.mdi-content-save-edit-outline:before{content:"\FCD8"}.mdi-content-save-outline:before{content:"\F817"}.mdi-content-save-settings:before{content:"\F61B"}.mdi-content-save-settings-outline:before{content:"\FB13"}.mdi-contrast:before{content:"\F195"}.mdi-contrast-box:before{content:"\F196"}.mdi-contrast-circle:before{content:"\F197"}.mdi-controller-classic:before{content:"\FB5E"}.mdi-controller-classic-outline:before{content:"\FB5F"}.mdi-cookie:before{content:"\F198"}.mdi-copyright:before{content:"\F5E6"}.mdi-cordova:before{content:"\F957"}.mdi-corn:before{content:"\F7B7"}.mdi-counter:before{content:"\F199"}.mdi-cow:before{content:"\F19A"}.mdi-crane:before{content:"\F861"}.mdi-creation:before{content:"\F1C9"}.mdi-creative-commons:before{content:"\FD47"}.mdi-credit-card:before{content:"\F19B"}.mdi-credit-card-marker:before{content:"\FD9A"}.mdi-credit-card-multiple:before{content:"\F19C"}.mdi-credit-card-off:before{content:"\F5E4"}.mdi-credit-card-plus:before{content:"\F675"}.mdi-credit-card-refund:before{content:"\FAA7"}.mdi-credit-card-scan:before{content:"\F19D"}.mdi-credit-card-settings:before{content:"\F8D6"}.mdi-credit-card-wireless:before{content:"\FD48"}.mdi-cricket:before{content:"\FD49"}.mdi-crop:before{content:"\F19E"}.mdi-crop-free:before{content:"\F19F"}.mdi-crop-landscape:before{content:"\F1A0"}.mdi-crop-portrait:before{content:"\F1A1"}.mdi-crop-rotate:before{content:"\F695"}.mdi-crop-square:before{content:"\F1A2"}.mdi-crosshairs:before{content:"\F1A3"}.mdi-crosshairs-gps:before{content:"\F1A4"}.mdi-crown:before{content:"\F1A5"}.mdi-cryengine:before{content:"\F958"}.mdi-crystal-ball:before{content:"\FB14"}.mdi-cube:before{content:"\F1A6"}.mdi-cube-outline:before{content:"\F1A7"}.mdi-cube-scan:before{content:"\FB60"}.mdi-cube-send:before{content:"\F1A8"}.mdi-cube-unfolded:before{content:"\F1A9"}.mdi-cup:before{content:"\F1AA"}.mdi-cup-off:before{content:"\F5E5"}.mdi-cup-water:before{content:"\F1AB"}.mdi-cupcake:before{content:"\F959"}.mdi-curling:before{content:"\F862"}.mdi-currency-bdt:before{content:"\F863"}.mdi-currency-brl:before{content:"\FB61"}.mdi-currency-btc:before{content:"\F1AC"}.mdi-currency-chf:before{content:"\F7B8"}.mdi-currency-cny:before{content:"\F7B9"}.mdi-currency-eth:before{content:"\F7BA"}.mdi-currency-eur:before{content:"\F1AD"}.mdi-currency-gbp:before{content:"\F1AE"}.mdi-currency-ils:before{content:"\FC3D"}.mdi-currency-inr:before{content:"\F1AF"}.mdi-currency-jpy:before{content:"\F7BB"}.mdi-currency-krw:before{content:"\F7BC"}.mdi-currency-kzt:before{content:"\F864"}.mdi-currency-ngn:before{content:"\F1B0"}.mdi-currency-php:before{content:"\F9E5"}.mdi-currency-rub:before{content:"\F1B1"}.mdi-currency-sign:before{content:"\F7BD"}.mdi-currency-try:before{content:"\F1B2"}.mdi-currency-twd:before{content:"\F7BE"}.mdi-currency-usd:before{content:"\F1B3"}.mdi-currency-usd-off:before{content:"\F679"}.mdi-current-ac:before{content:"\F95A"}.mdi-current-dc:before{content:"\F95B"}.mdi-cursor-default:before{content:"\F1B4"}.mdi-cursor-default-click:before{content:"\FCD9"}.mdi-cursor-default-click-outline:before{content:"\FCDA"}.mdi-cursor-default-outline:before{content:"\F1B5"}.mdi-cursor-move:before{content:"\F1B6"}.mdi-cursor-pointer:before{content:"\F1B7"}.mdi-cursor-text:before{content:"\F5E7"}.mdi-database:before{content:"\F1B8"}.mdi-database-check:before{content:"\FAA8"}.mdi-database-edit:before{content:"\FB62"}.mdi-database-export:before{content:"\F95D"}.mdi-database-import:before{content:"\F95C"}.mdi-database-lock:before{content:"\FAA9"}.mdi-database-minus:before{content:"\F1B9"}.mdi-database-plus:before{content:"\F1BA"}.mdi-database-refresh:before{content:"\FCDB"}.mdi-database-remove:before{content:"\FCDC"}.mdi-database-search:before{content:"\F865"}.mdi-database-settings:before{content:"\FCDD"}.mdi-death-star:before{content:"\F8D7"}.mdi-death-star-variant:before{content:"\F8D8"}.mdi-deathly-hallows:before{content:"\FB63"}.mdi-debian:before{content:"\F8D9"}.mdi-debug-step-into:before{content:"\F1BB"}.mdi-debug-step-out:before{content:"\F1BC"}.mdi-debug-step-over:before{content:"\F1BD"}.mdi-decagram:before{content:"\F76B"}.mdi-decagram-outline:before{content:"\F76C"}.mdi-decimal-decrease:before{content:"\F1BE"}.mdi-decimal-increase:before{content:"\F1BF"}.mdi-delete:before{content:"\F1C0"}.mdi-delete-circle:before{content:"\F682"}.mdi-delete-circle-outline:before{content:"\FB64"}.mdi-delete-empty:before{content:"\F6CB"}.mdi-delete-forever:before{content:"\F5E8"}.mdi-delete-forever-outline:before{content:"\FB65"}.mdi-delete-outline:before{content:"\F9E6"}.mdi-delete-restore:before{content:"\F818"}.mdi-delete-sweep:before{content:"\F5E9"}.mdi-delete-sweep-outline:before{content:"\FC3E"}.mdi-delete-variant:before{content:"\F1C1"}.mdi-delta:before{content:"\F1C2"}.mdi-desk-lamp:before{content:"\F95E"}.mdi-deskphone:before{content:"\F1C3"}.mdi-desktop-classic:before{content:"\F7BF"}.mdi-desktop-mac:before{content:"\F1C4"}.mdi-desktop-mac-dashboard:before{content:"\F9E7"}.mdi-desktop-tower:before{content:"\F1C5"}.mdi-desktop-tower-monitor:before{content:"\FAAA"}.mdi-details:before{content:"\F1C6"}.mdi-dev-to:before{content:"\FD4A"}.mdi-developer-board:before{content:"\F696"}.mdi-deviantart:before{content:"\F1C7"}.mdi-dialpad:before{content:"\F61C"}.mdi-diameter:before{content:"\FC3F"}.mdi-diameter-outline:before{content:"\FC40"}.mdi-diameter-variant:before{content:"\FC41"}.mdi-diamond:before{content:"\FB66"}.mdi-diamond-outline:before{content:"\FB67"}.mdi-diamond-stone:before{content:"\F1C8"}.mdi-dice-1:before{content:"\F1CA"}.mdi-dice-2:before{content:"\F1CB"}.mdi-dice-3:before{content:"\F1CC"}.mdi-dice-4:before{content:"\F1CD"}.mdi-dice-5:before{content:"\F1CE"}.mdi-dice-6:before{content:"\F1CF"}.mdi-dice-d10:before{content:"\F76E"}.mdi-dice-d12:before{content:"\F866"}.mdi-dice-d20:before{content:"\F5EA"}.mdi-dice-d4:before{content:"\F5EB"}.mdi-dice-d6:before{content:"\F5EC"}.mdi-dice-d8:before{content:"\F5ED"}.mdi-dice-multiple:before{content:"\F76D"}.mdi-dictionary:before{content:"\F61D"}.mdi-dip-switch:before{content:"\F7C0"}.mdi-directions:before{content:"\F1D0"}.mdi-directions-fork:before{content:"\F641"}.mdi-disc:before{content:"\F5EE"}.mdi-disc-alert:before{content:"\F1D1"}.mdi-disc-player:before{content:"\F95F"}.mdi-discord:before{content:"\F66F"}.mdi-dishwasher:before{content:"\FAAB"}.mdi-disqus:before{content:"\F1D2"}.mdi-disqus-outline:before{content:"\F1D3"}.mdi-diving-flippers:before{content:"\FD9B"}.mdi-diving-helmet:before{content:"\FD9C"}.mdi-diving-scuba:before{content:"\FD9D"}.mdi-diving-scuba-flag:before{content:"\FD9E"}.mdi-diving-scuba-tank:before{content:"\FD9F"}.mdi-diving-scuba-tank-multiple:before{content:"\FDA0"}.mdi-diving-snorkel:before{content:"\FDA1"}.mdi-division:before{content:"\F1D4"}.mdi-division-box:before{content:"\F1D5"}.mdi-dlna:before{content:"\FA40"}.mdi-dna:before{content:"\F683"}.mdi-dns:before{content:"\F1D6"}.mdi-dns-outline:before{content:"\FB68"}.mdi-do-not-disturb:before{content:"\F697"}.mdi-do-not-disturb-off:before{content:"\F698"}.mdi-docker:before{content:"\F867"}.mdi-doctor:before{content:"\FA41"}.mdi-dog:before{content:"\FA42"}.mdi-dog-service:before{content:"\FAAC"}.mdi-dog-side:before{content:"\FA43"}.mdi-dolby:before{content:"\F6B2"}.mdi-domain:before{content:"\F1D7"}.mdi-domain-off:before{content:"\FD4B"}.mdi-donkey:before{content:"\F7C1"}.mdi-door:before{content:"\F819"}.mdi-door-closed:before{content:"\F81A"}.mdi-door-open:before{content:"\F81B"}.mdi-doorbell-video:before{content:"\F868"}.mdi-dot-net:before{content:"\FAAD"}.mdi-dots-horizontal:before{content:"\F1D8"}.mdi-dots-horizontal-circle:before{content:"\F7C2"}.mdi-dots-horizontal-circle-outline:before{content:"\FB69"}.mdi-dots-vertical:before{content:"\F1D9"}.mdi-dots-vertical-circle:before{content:"\F7C3"}.mdi-dots-vertical-circle-outline:before{content:"\FB6A"}.mdi-douban:before{content:"\F699"}.mdi-download:before{content:"\F1DA"}.mdi-download-multiple:before{content:"\F9E8"}.mdi-download-network:before{content:"\F6F3"}.mdi-download-network-outline:before{content:"\FC42"}.mdi-download-outline:before{content:"\FB6B"}.mdi-drag:before{content:"\F1DB"}.mdi-drag-horizontal:before{content:"\F1DC"}.mdi-drag-variant:before{content:"\FB6C"}.mdi-drag-vertical:before{content:"\F1DD"}.mdi-drama-masks:before{content:"\FCDE"}.mdi-drawing:before{content:"\F1DE"}.mdi-drawing-box:before{content:"\F1DF"}.mdi-dribbble:before{content:"\F1E0"}.mdi-dribbble-box:before{content:"\F1E1"}.mdi-drone:before{content:"\F1E2"}.mdi-dropbox:before{content:"\F1E3"}.mdi-drupal:before{content:"\F1E4"}.mdi-duck:before{content:"\F1E5"}.mdi-dumbbell:before{content:"\F1E6"}.mdi-dump-truck:before{content:"\FC43"}.mdi-ear-hearing:before{content:"\F7C4"}.mdi-ear-hearing-off:before{content:"\FA44"}.mdi-earth:before{content:"\F1E7"}.mdi-earth-box:before{content:"\F6CC"}.mdi-earth-box-off:before{content:"\F6CD"}.mdi-earth-off:before{content:"\F1E8"}.mdi-edge:before{content:"\F1E9"}.mdi-egg:before{content:"\FAAE"}.mdi-egg-easter:before{content:"\FAAF"}.mdi-eight-track:before{content:"\F9E9"}.mdi-eject:before{content:"\F1EA"}.mdi-eject-outline:before{content:"\FB6D"}.mdi-elephant:before{content:"\F7C5"}.mdi-elevation-decline:before{content:"\F1EB"}.mdi-elevation-rise:before{content:"\F1EC"}.mdi-elevator:before{content:"\F1ED"}.mdi-email:before{content:"\F1EE"}.mdi-email-alert:before{content:"\F6CE"}.mdi-email-box:before{content:"\FCDF"}.mdi-email-check:before{content:"\FAB0"}.mdi-email-check-outline:before{content:"\FAB1"}.mdi-email-lock:before{content:"\F1F1"}.mdi-email-mark-as-unread:before{content:"\FB6E"}.mdi-email-open:before{content:"\F1EF"}.mdi-email-open-outline:before{content:"\F5EF"}.mdi-email-outline:before{content:"\F1F0"}.mdi-email-plus:before{content:"\F9EA"}.mdi-email-plus-outline:before{content:"\F9EB"}.mdi-email-search:before{content:"\F960"}.mdi-email-search-outline:before{content:"\F961"}.mdi-email-variant:before{content:"\F5F0"}.mdi-ember:before{content:"\FB15"}.mdi-emby:before{content:"\F6B3"}.mdi-emoticon:before{content:"\FC44"}.mdi-emoticon-angry:before{content:"\FC45"}.mdi-emoticon-angry-outline:before{content:"\FC46"}.mdi-emoticon-cool:before{content:"\FC47"}.mdi-emoticon-cool-outline:before{content:"\F1F3"}.mdi-emoticon-cry:before{content:"\FC48"}.mdi-emoticon-cry-outline:before{content:"\FC49"}.mdi-emoticon-dead:before{content:"\FC4A"}.mdi-emoticon-dead-outline:before{content:"\F69A"}.mdi-emoticon-devil:before{content:"\FC4B"}.mdi-emoticon-devil-outline:before{content:"\F1F4"}.mdi-emoticon-excited:before{content:"\FC4C"}.mdi-emoticon-excited-outline:before{content:"\F69B"}.mdi-emoticon-happy:before{content:"\FC4D"}.mdi-emoticon-happy-outline:before{content:"\F1F5"}.mdi-emoticon-kiss:before{content:"\FC4E"}.mdi-emoticon-kiss-outline:before{content:"\FC4F"}.mdi-emoticon-neutral:before{content:"\FC50"}.mdi-emoticon-neutral-outline:before{content:"\F1F6"}.mdi-emoticon-outline:before{content:"\F1F2"}.mdi-emoticon-poop:before{content:"\F1F7"}.mdi-emoticon-poop-outline:before{content:"\FC51"}.mdi-emoticon-sad:before{content:"\FC52"}.mdi-emoticon-sad-outline:before{content:"\F1F8"}.mdi-emoticon-tongue:before{content:"\F1F9"}.mdi-emoticon-tongue-outline:before{content:"\FC53"}.mdi-emoticon-wink:before{content:"\FC54"}.mdi-emoticon-wink-outline:before{content:"\FC55"}.mdi-engine:before{content:"\F1FA"}.mdi-engine-off:before{content:"\FA45"}.mdi-engine-off-outline:before{content:"\FA46"}.mdi-engine-outline:before{content:"\F1FB"}.mdi-equal:before{content:"\F1FC"}.mdi-equal-box:before{content:"\F1FD"}.mdi-eraser:before{content:"\F1FE"}.mdi-eraser-variant:before{content:"\F642"}.mdi-escalator:before{content:"\F1FF"}.mdi-eslint:before{content:"\FC56"}.mdi-et:before{content:"\FAB2"}.mdi-ethereum:before{content:"\F869"}.mdi-ethernet:before{content:"\F200"}.mdi-ethernet-cable:before{content:"\F201"}.mdi-ethernet-cable-off:before{content:"\F202"}.mdi-etsy:before{content:"\F203"}.mdi-ev-station:before{content:"\F5F1"}.mdi-eventbrite:before{content:"\F7C6"}.mdi-evernote:before{content:"\F204"}.mdi-exclamation:before{content:"\F205"}.mdi-exit-run:before{content:"\FA47"}.mdi-exit-to-app:before{content:"\F206"}.mdi-expand-all:before{content:"\FAB3"}.mdi-expand-all-outline:before{content:"\FAB4"}.mdi-exponent:before{content:"\F962"}.mdi-exponent-box:before{content:"\F963"}.mdi-export:before{content:"\F207"}.mdi-export-variant:before{content:"\FB6F"}.mdi-eye:before{content:"\F208"}.mdi-eye-check:before{content:"\FCE0"}.mdi-eye-check-outline:before{content:"\FCE1"}.mdi-eye-circle:before{content:"\FB70"}.mdi-eye-circle-outline:before{content:"\FB71"}.mdi-eye-off:before{content:"\F209"}.mdi-eye-off-outline:before{content:"\F6D0"}.mdi-eye-outline:before{content:"\F6CF"}.mdi-eye-plus:before{content:"\F86A"}.mdi-eye-plus-outline:before{content:"\F86B"}.mdi-eye-settings:before{content:"\F86C"}.mdi-eye-settings-outline:before{content:"\F86D"}.mdi-eyedropper:before{content:"\F20A"}.mdi-eyedropper-variant:before{content:"\F20B"}.mdi-face:before{content:"\F643"}.mdi-face-agent:before{content:"\FD4C"}.mdi-face-outline:before{content:"\FB72"}.mdi-face-profile:before{content:"\F644"}.mdi-face-recognition:before{content:"\FC57"}.mdi-facebook:before{content:"\F20C"}.mdi-facebook-box:before{content:"\F20D"}.mdi-facebook-messenger:before{content:"\F20E"}.mdi-facebook-workplace:before{content:"\FB16"}.mdi-factory:before{content:"\F20F"}.mdi-fan:before{content:"\F210"}.mdi-fan-off:before{content:"\F81C"}.mdi-fast-forward:before{content:"\F211"}.mdi-fast-forward-10:before{content:"\FD4D"}.mdi-fast-forward-30:before{content:"\FCE2"}.mdi-fast-forward-outline:before{content:"\F6D1"}.mdi-fax:before{content:"\F212"}.mdi-feather:before{content:"\F6D2"}.mdi-feature-search:before{content:"\FA48"}.mdi-feature-search-outline:before{content:"\FA49"}.mdi-fedora:before{content:"\F8DA"}.mdi-ferry:before{content:"\F213"}.mdi-file:before{content:"\F214"}.mdi-file-account:before{content:"\F73A"}.mdi-file-alert:before{content:"\FA4A"}.mdi-file-alert-outline:before{content:"\FA4B"}.mdi-file-cabinet:before{content:"\FAB5"}.mdi-file-cancel:before{content:"\FDA2"}.mdi-file-cancel-outline:before{content:"\FDA3"}.mdi-file-chart:before{content:"\F215"}.mdi-file-check:before{content:"\F216"}.mdi-file-cloud:before{content:"\F217"}.mdi-file-compare:before{content:"\F8A9"}.mdi-file-delimited:before{content:"\F218"}.mdi-file-document:before{content:"\F219"}.mdi-file-document-box:before{content:"\F21A"}.mdi-file-document-box-multiple:before{content:"\FAB6"}.mdi-file-document-box-multiple-outline:before{content:"\FAB7"}.mdi-file-document-box-outline:before{content:"\F9EC"}.mdi-file-document-edit:before{content:"\FDA4"}.mdi-file-document-edit-outline:before{content:"\FDA5"}.mdi-file-document-outline:before{content:"\F9ED"}.mdi-file-download:before{content:"\F964"}.mdi-file-download-outline:before{content:"\F965"}.mdi-file-excel:before{content:"\F21B"}.mdi-file-excel-box:before{content:"\F21C"}.mdi-file-export:before{content:"\F21D"}.mdi-file-eye:before{content:"\FDA6"}.mdi-file-eye-outline:before{content:"\FDA7"}.mdi-file-find:before{content:"\F21E"}.mdi-file-find-outline:before{content:"\FB73"}.mdi-file-hidden:before{content:"\F613"}.mdi-file-image:before{content:"\F21F"}.mdi-file-import:before{content:"\F220"}.mdi-file-lock:before{content:"\F221"}.mdi-file-move:before{content:"\FAB8"}.mdi-file-multiple:before{content:"\F222"}.mdi-file-music:before{content:"\F223"}.mdi-file-outline:before{content:"\F224"}.mdi-file-pdf:before{content:"\F225"}.mdi-file-pdf-box:before{content:"\F226"}.mdi-file-percent:before{content:"\F81D"}.mdi-file-plus:before{content:"\F751"}.mdi-file-powerpoint:before{content:"\F227"}.mdi-file-powerpoint-box:before{content:"\F228"}.mdi-file-presentation-box:before{content:"\F229"}.mdi-file-question:before{content:"\F86E"}.mdi-file-remove:before{content:"\FB74"}.mdi-file-replace:before{content:"\FB17"}.mdi-file-replace-outline:before{content:"\FB18"}.mdi-file-restore:before{content:"\F670"}.mdi-file-search:before{content:"\FC58"}.mdi-file-search-outline:before{content:"\FC59"}.mdi-file-send:before{content:"\F22A"}.mdi-file-table:before{content:"\FC5A"}.mdi-file-table-outline:before{content:"\FC5B"}.mdi-file-tree:before{content:"\F645"}.mdi-file-undo:before{content:"\F8DB"}.mdi-file-upload:before{content:"\FA4C"}.mdi-file-upload-outline:before{content:"\FA4D"}.mdi-file-video:before{content:"\F22B"}.mdi-file-word:before{content:"\F22C"}.mdi-file-word-box:before{content:"\F22D"}.mdi-file-xml:before{content:"\F22E"}.mdi-film:before{content:"\F22F"}.mdi-filmstrip:before{content:"\F230"}.mdi-filmstrip-off:before{content:"\F231"}.mdi-filter:before{content:"\F232"}.mdi-filter-outline:before{content:"\F233"}.mdi-filter-remove:before{content:"\F234"}.mdi-filter-remove-outline:before{content:"\F235"}.mdi-filter-variant:before{content:"\F236"}.mdi-finance:before{content:"\F81E"}.mdi-find-replace:before{content:"\F6D3"}.mdi-fingerprint:before{content:"\F237"}.mdi-fire:before{content:"\F238"}.mdi-fire-truck:before{content:"\F8AA"}.mdi-firebase:before{content:"\F966"}.mdi-firefox:before{content:"\F239"}.mdi-fish:before{content:"\F23A"}.mdi-flag:before{content:"\F23B"}.mdi-flag-checkered:before{content:"\F23C"}.mdi-flag-minus:before{content:"\FB75"}.mdi-flag-outline:before{content:"\F23D"}.mdi-flag-plus:before{content:"\FB76"}.mdi-flag-remove:before{content:"\FB77"}.mdi-flag-triangle:before{content:"\F23F"}.mdi-flag-variant:before{content:"\F240"}.mdi-flag-variant-outline:before{content:"\F23E"}.mdi-flare:before{content:"\FD4E"}.mdi-flash:before{content:"\F241"}.mdi-flash-auto:before{content:"\F242"}.mdi-flash-circle:before{content:"\F81F"}.mdi-flash-off:before{content:"\F243"}.mdi-flash-outline:before{content:"\F6D4"}.mdi-flash-red-eye:before{content:"\F67A"}.mdi-flashlight:before{content:"\F244"}.mdi-flashlight-off:before{content:"\F245"}.mdi-flask:before{content:"\F093"}.mdi-flask-empty:before{content:"\F094"}.mdi-flask-empty-outline:before{content:"\F095"}.mdi-flask-outline:before{content:"\F096"}.mdi-flattr:before{content:"\F246"}.mdi-flickr:before{content:"\FCE3"}.mdi-flip-to-back:before{content:"\F247"}.mdi-flip-to-front:before{content:"\F248"}.mdi-floor-lamp:before{content:"\F8DC"}.mdi-floor-plan:before{content:"\F820"}.mdi-floppy:before{content:"\F249"}.mdi-floppy-variant:before{content:"\F9EE"}.mdi-flower:before{content:"\F24A"}.mdi-flower-outline:before{content:"\F9EF"}.mdi-flower-poppy:before{content:"\FCE4"}.mdi-flower-tulip:before{content:"\F9F0"}.mdi-flower-tulip-outline:before{content:"\F9F1"}.mdi-folder:before{content:"\F24B"}.mdi-folder-account:before{content:"\F24C"}.mdi-folder-account-outline:before{content:"\FB78"}.mdi-folder-alert:before{content:"\FDA8"}.mdi-folder-alert-outline:before{content:"\FDA9"}.mdi-folder-clock:before{content:"\FAB9"}.mdi-folder-clock-outline:before{content:"\FABA"}.mdi-folder-download:before{content:"\F24D"}.mdi-folder-edit:before{content:"\F8DD"}.mdi-folder-edit-outline:before{content:"\FDAA"}.mdi-folder-google-drive:before{content:"\F24E"}.mdi-folder-image:before{content:"\F24F"}.mdi-folder-key:before{content:"\F8AB"}.mdi-folder-key-network:before{content:"\F8AC"}.mdi-folder-key-network-outline:before{content:"\FC5C"}.mdi-folder-lock:before{content:"\F250"}.mdi-folder-lock-open:before{content:"\F251"}.mdi-folder-move:before{content:"\F252"}.mdi-folder-multiple:before{content:"\F253"}.mdi-folder-multiple-image:before{content:"\F254"}.mdi-folder-multiple-outline:before{content:"\F255"}.mdi-folder-network:before{content:"\F86F"}.mdi-folder-network-outline:before{content:"\FC5D"}.mdi-folder-open:before{content:"\F76F"}.mdi-folder-open-outline:before{content:"\FDAB"}.mdi-folder-outline:before{content:"\F256"}.mdi-folder-plus:before{content:"\F257"}.mdi-folder-plus-outline:before{content:"\FB79"}.mdi-folder-pound:before{content:"\FCE5"}.mdi-folder-pound-outline:before{content:"\FCE6"}.mdi-folder-remove:before{content:"\F258"}.mdi-folder-remove-outline:before{content:"\FB7A"}.mdi-folder-search:before{content:"\F967"}.mdi-folder-search-outline:before{content:"\F968"}.mdi-folder-star:before{content:"\F69C"}.mdi-folder-star-outline:before{content:"\FB7B"}.mdi-folder-sync:before{content:"\FCE7"}.mdi-folder-sync-outline:before{content:"\FCE8"}.mdi-folder-text:before{content:"\FC5E"}.mdi-folder-text-outline:before{content:"\FC5F"}.mdi-folder-upload:before{content:"\F259"}.mdi-font-awesome:before{content:"\F03A"}.mdi-food:before{content:"\F25A"}.mdi-food-apple:before{content:"\F25B"}.mdi-food-apple-outline:before{content:"\FC60"}.mdi-food-croissant:before{content:"\F7C7"}.mdi-food-fork-drink:before{content:"\F5F2"}.mdi-food-off:before{content:"\F5F3"}.mdi-food-variant:before{content:"\F25C"}.mdi-football:before{content:"\F25D"}.mdi-football-australian:before{content:"\F25E"}.mdi-football-helmet:before{content:"\F25F"}.mdi-forklift:before{content:"\F7C8"}.mdi-format-align-bottom:before{content:"\F752"}.mdi-format-align-center:before{content:"\F260"}.mdi-format-align-justify:before{content:"\F261"}.mdi-format-align-left:before{content:"\F262"}.mdi-format-align-middle:before{content:"\F753"}.mdi-format-align-right:before{content:"\F263"}.mdi-format-align-top:before{content:"\F754"}.mdi-format-annotation-minus:before{content:"\FABB"}.mdi-format-annotation-plus:before{content:"\F646"}.mdi-format-bold:before{content:"\F264"}.mdi-format-clear:before{content:"\F265"}.mdi-format-color-fill:before{content:"\F266"}.mdi-format-color-text:before{content:"\F69D"}.mdi-format-columns:before{content:"\F8DE"}.mdi-format-float-center:before{content:"\F267"}.mdi-format-float-left:before{content:"\F268"}.mdi-format-float-none:before{content:"\F269"}.mdi-format-float-right:before{content:"\F26A"}.mdi-format-font:before{content:"\F6D5"}.mdi-format-font-size-decrease:before{content:"\F9F2"}.mdi-format-font-size-increase:before{content:"\F9F3"}.mdi-format-header-1:before{content:"\F26B"}.mdi-format-header-2:before{content:"\F26C"}.mdi-format-header-3:before{content:"\F26D"}.mdi-format-header-4:before{content:"\F26E"}.mdi-format-header-5:before{content:"\F26F"}.mdi-format-header-6:before{content:"\F270"}.mdi-format-header-decrease:before{content:"\F271"}.mdi-format-header-equal:before{content:"\F272"}.mdi-format-header-increase:before{content:"\F273"}.mdi-format-header-pound:before{content:"\F274"}.mdi-format-horizontal-align-center:before{content:"\F61E"}.mdi-format-horizontal-align-left:before{content:"\F61F"}.mdi-format-horizontal-align-right:before{content:"\F620"}.mdi-format-indent-decrease:before{content:"\F275"}.mdi-format-indent-increase:before{content:"\F276"}.mdi-format-italic:before{content:"\F277"}.mdi-format-letter-case:before{content:"\FB19"}.mdi-format-letter-case-lower:before{content:"\FB1A"}.mdi-format-letter-case-upper:before{content:"\FB1B"}.mdi-format-line-spacing:before{content:"\F278"}.mdi-format-line-style:before{content:"\F5C8"}.mdi-format-line-weight:before{content:"\F5C9"}.mdi-format-list-bulleted:before{content:"\F279"}.mdi-format-list-bulleted-square:before{content:"\FDAC"}.mdi-format-list-bulleted-type:before{content:"\F27A"}.mdi-format-list-checkbox:before{content:"\F969"}.mdi-format-list-checks:before{content:"\F755"}.mdi-format-list-numbered:before{content:"\F27B"}.mdi-format-list-numbered-rtl:before{content:"\FCE9"}.mdi-format-page-break:before{content:"\F6D6"}.mdi-format-paint:before{content:"\F27C"}.mdi-format-paragraph:before{content:"\F27D"}.mdi-format-pilcrow:before{content:"\F6D7"}.mdi-format-quote-close:before{content:"\F27E"}.mdi-format-quote-open:before{content:"\F756"}.mdi-format-rotate-90:before{content:"\F6A9"}.mdi-format-section:before{content:"\F69E"}.mdi-format-size:before{content:"\F27F"}.mdi-format-strikethrough:before{content:"\F280"}.mdi-format-strikethrough-variant:before{content:"\F281"}.mdi-format-subscript:before{content:"\F282"}.mdi-format-superscript:before{content:"\F283"}.mdi-format-text:before{content:"\F284"}.mdi-format-text-rotation-down:before{content:"\FD4F"}.mdi-format-text-rotation-none:before{content:"\FD50"}.mdi-format-text-wrapping-clip:before{content:"\FCEA"}.mdi-format-text-wrapping-overflow:before{content:"\FCEB"}.mdi-format-text-wrapping-wrap:before{content:"\FCEC"}.mdi-format-textbox:before{content:"\FCED"}.mdi-format-textdirection-l-to-r:before{content:"\F285"}.mdi-format-textdirection-r-to-l:before{content:"\F286"}.mdi-format-title:before{content:"\F5F4"}.mdi-format-underline:before{content:"\F287"}.mdi-format-vertical-align-bottom:before{content:"\F621"}.mdi-format-vertical-align-center:before{content:"\F622"}.mdi-format-vertical-align-top:before{content:"\F623"}.mdi-format-wrap-inline:before{content:"\F288"}.mdi-format-wrap-square:before{content:"\F289"}.mdi-format-wrap-tight:before{content:"\F28A"}.mdi-format-wrap-top-bottom:before{content:"\F28B"}.mdi-forum:before{content:"\F28C"}.mdi-forum-outline:before{content:"\F821"}.mdi-forward:before{content:"\F28D"}.mdi-forwardburger:before{content:"\FD51"}.mdi-fountain:before{content:"\F96A"}.mdi-fountain-pen:before{content:"\FCEE"}.mdi-fountain-pen-tip:before{content:"\FCEF"}.mdi-foursquare:before{content:"\F28E"}.mdi-freebsd:before{content:"\F8DF"}.mdi-fridge:before{content:"\F290"}.mdi-fridge-bottom:before{content:"\F292"}.mdi-fridge-outline:before{content:"\F28F"}.mdi-fridge-top:before{content:"\F291"}.mdi-fuel:before{content:"\F7C9"}.mdi-fullscreen:before{content:"\F293"}.mdi-fullscreen-exit:before{content:"\F294"}.mdi-function:before{content:"\F295"}.mdi-function-variant:before{content:"\F870"}.mdi-fuse:before{content:"\FC61"}.mdi-fuse-blade:before{content:"\FC62"}.mdi-gamepad:before{content:"\F296"}.mdi-gamepad-variant:before{content:"\F297"}.mdi-gantry-crane:before{content:"\FDAD"}.mdi-garage:before{content:"\F6D8"}.mdi-garage-alert:before{content:"\F871"}.mdi-garage-open:before{content:"\F6D9"}.mdi-gas-cylinder:before{content:"\F647"}.mdi-gas-station:before{content:"\F298"}.mdi-gate:before{content:"\F299"}.mdi-gate-and:before{content:"\F8E0"}.mdi-gate-nand:before{content:"\F8E1"}.mdi-gate-nor:before{content:"\F8E2"}.mdi-gate-not:before{content:"\F8E3"}.mdi-gate-or:before{content:"\F8E4"}.mdi-gate-xnor:before{content:"\F8E5"}.mdi-gate-xor:before{content:"\F8E6"}.mdi-gauge:before{content:"\F29A"}.mdi-gauge-empty:before{content:"\F872"}.mdi-gauge-full:before{content:"\F873"}.mdi-gauge-low:before{content:"\F874"}.mdi-gavel:before{content:"\F29B"}.mdi-gender-female:before{content:"\F29C"}.mdi-gender-male:before{content:"\F29D"}.mdi-gender-male-female:before{content:"\F29E"}.mdi-gender-transgender:before{content:"\F29F"}.mdi-gentoo:before{content:"\F8E7"}.mdi-gesture:before{content:"\F7CA"}.mdi-gesture-double-tap:before{content:"\F73B"}.mdi-gesture-pinch:before{content:"\FABC"}.mdi-gesture-spread:before{content:"\FABD"}.mdi-gesture-swipe:before{content:"\FD52"}.mdi-gesture-swipe-down:before{content:"\F73C"}.mdi-gesture-swipe-horizontal:before{content:"\FABE"}.mdi-gesture-swipe-left:before{content:"\F73D"}.mdi-gesture-swipe-right:before{content:"\F73E"}.mdi-gesture-swipe-up:before{content:"\F73F"}.mdi-gesture-swipe-vertical:before{content:"\FABF"}.mdi-gesture-tap:before{content:"\F740"}.mdi-gesture-tap-hold:before{content:"\FD53"}.mdi-gesture-two-double-tap:before{content:"\F741"}.mdi-gesture-two-tap:before{content:"\F742"}.mdi-ghost:before{content:"\F2A0"}.mdi-ghost-off:before{content:"\F9F4"}.mdi-gif:before{content:"\FD54"}.mdi-gift:before{content:"\F2A1"}.mdi-git:before{content:"\F2A2"}.mdi-github-box:before{content:"\F2A3"}.mdi-github-circle:before{content:"\F2A4"}.mdi-github-face:before{content:"\F6DA"}.mdi-gitlab:before{content:"\FB7C"}.mdi-glass-cocktail:before{content:"\F356"}.mdi-glass-flute:before{content:"\F2A5"}.mdi-glass-mug:before{content:"\F2A6"}.mdi-glass-stange:before{content:"\F2A7"}.mdi-glass-tulip:before{content:"\F2A8"}.mdi-glass-wine:before{content:"\F875"}.mdi-glassdoor:before{content:"\F2A9"}.mdi-glasses:before{content:"\F2AA"}.mdi-globe-model:before{content:"\F8E8"}.mdi-gmail:before{content:"\F2AB"}.mdi-gnome:before{content:"\F2AC"}.mdi-go-kart:before{content:"\FD55"}.mdi-go-kart-track:before{content:"\FD56"}.mdi-gog:before{content:"\FB7D"}.mdi-golf:before{content:"\F822"}.mdi-gondola:before{content:"\F685"}.mdi-goodreads:before{content:"\FD57"}.mdi-google:before{content:"\F2AD"}.mdi-google-adwords:before{content:"\FC63"}.mdi-google-allo:before{content:"\F801"}.mdi-google-analytics:before{content:"\F7CB"}.mdi-google-assistant:before{content:"\F7CC"}.mdi-google-cardboard:before{content:"\F2AE"}.mdi-google-chrome:before{content:"\F2AF"}.mdi-google-circles:before{content:"\F2B0"}.mdi-google-circles-communities:before{content:"\F2B1"}.mdi-google-circles-extended:before{content:"\F2B2"}.mdi-google-circles-group:before{content:"\F2B3"}.mdi-google-classroom:before{content:"\F2C0"}.mdi-google-controller:before{content:"\F2B4"}.mdi-google-controller-off:before{content:"\F2B5"}.mdi-google-drive:before{content:"\F2B6"}.mdi-google-earth:before{content:"\F2B7"}.mdi-google-fit:before{content:"\F96B"}.mdi-google-glass:before{content:"\F2B8"}.mdi-google-hangouts:before{content:"\F2C9"}.mdi-google-home:before{content:"\F823"}.mdi-google-keep:before{content:"\F6DB"}.mdi-google-lens:before{content:"\F9F5"}.mdi-google-maps:before{content:"\F5F5"}.mdi-google-nearby:before{content:"\F2B9"}.mdi-google-pages:before{content:"\F2BA"}.mdi-google-photos:before{content:"\F6DC"}.mdi-google-physical-web:before{content:"\F2BB"}.mdi-google-play:before{content:"\F2BC"}.mdi-google-plus:before{content:"\F2BD"}.mdi-google-plus-box:before{content:"\F2BE"}.mdi-google-spreadsheet:before{content:"\F9F6"}.mdi-google-street-view:before{content:"\FC64"}.mdi-google-translate:before{content:"\F2BF"}.mdi-gpu:before{content:"\F8AD"}.mdi-gradient:before{content:"\F69F"}.mdi-grain:before{content:"\FD58"}.mdi-graphql:before{content:"\F876"}.mdi-grave-stone:before{content:"\FB7E"}.mdi-grease-pencil:before{content:"\F648"}.mdi-greater-than:before{content:"\F96C"}.mdi-greater-than-or-equal:before{content:"\F96D"}.mdi-grid:before{content:"\F2C1"}.mdi-grid-large:before{content:"\F757"}.mdi-grid-off:before{content:"\F2C2"}.mdi-group:before{content:"\F2C3"}.mdi-guitar-acoustic:before{content:"\F770"}.mdi-guitar-electric:before{content:"\F2C4"}.mdi-guitar-pick:before{content:"\F2C5"}.mdi-guitar-pick-outline:before{content:"\F2C6"}.mdi-guy-fawkes-mask:before{content:"\F824"}.mdi-hackernews:before{content:"\F624"}.mdi-hail:before{content:"\FAC0"}.mdi-halloween:before{content:"\FB7F"}.mdi-hamburger:before{content:"\F684"}.mdi-hammer:before{content:"\F8E9"}.mdi-hand:before{content:"\FA4E"}.mdi-hand-okay:before{content:"\FA4F"}.mdi-hand-peace:before{content:"\FA50"}.mdi-hand-peace-variant:before{content:"\FA51"}.mdi-hand-pointing-down:before{content:"\FA52"}.mdi-hand-pointing-left:before{content:"\FA53"}.mdi-hand-pointing-right:before{content:"\F2C7"}.mdi-hand-pointing-up:before{content:"\FA54"}.mdi-hanger:before{content:"\F2C8"}.mdi-hard-hat:before{content:"\F96E"}.mdi-harddisk:before{content:"\F2CA"}.mdi-hat-fedora:before{content:"\FB80"}.mdi-hazard-lights:before{content:"\FC65"}.mdi-hdr:before{content:"\FD59"}.mdi-hdr-off:before{content:"\FD5A"}.mdi-headphones:before{content:"\F2CB"}.mdi-headphones-bluetooth:before{content:"\F96F"}.mdi-headphones-box:before{content:"\F2CC"}.mdi-headphones-off:before{content:"\F7CD"}.mdi-headphones-settings:before{content:"\F2CD"}.mdi-headset:before{content:"\F2CE"}.mdi-headset-dock:before{content:"\F2CF"}.mdi-headset-off:before{content:"\F2D0"}.mdi-heart:before{content:"\F2D1"}.mdi-heart-box:before{content:"\F2D2"}.mdi-heart-box-outline:before{content:"\F2D3"}.mdi-heart-broken:before{content:"\F2D4"}.mdi-heart-broken-outline:before{content:"\FCF0"}.mdi-heart-circle:before{content:"\F970"}.mdi-heart-circle-outline:before{content:"\F971"}.mdi-heart-half:before{content:"\F6DE"}.mdi-heart-half-full:before{content:"\F6DD"}.mdi-heart-half-outline:before{content:"\F6DF"}.mdi-heart-multiple:before{content:"\FA55"}.mdi-heart-multiple-outline:before{content:"\FA56"}.mdi-heart-off:before{content:"\F758"}.mdi-heart-outline:before{content:"\F2D5"}.mdi-heart-pulse:before{content:"\F5F6"}.mdi-helicopter:before{content:"\FAC1"}.mdi-help:before{content:"\F2D6"}.mdi-help-box:before{content:"\F78A"}.mdi-help-circle:before{content:"\F2D7"}.mdi-help-circle-outline:before{content:"\F625"}.mdi-help-network:before{content:"\F6F4"}.mdi-help-network-outline:before{content:"\FC66"}.mdi-help-rhombus:before{content:"\FB81"}.mdi-help-rhombus-outline:before{content:"\FB82"}.mdi-hexagon:before{content:"\F2D8"}.mdi-hexagon-multiple:before{content:"\F6E0"}.mdi-hexagon-outline:before{content:"\F2D9"}.mdi-hexagon-slice-1:before{content:"\FAC2"}.mdi-hexagon-slice-2:before{content:"\FAC3"}.mdi-hexagon-slice-3:before{content:"\FAC4"}.mdi-hexagon-slice-4:before{content:"\FAC5"}.mdi-hexagon-slice-5:before{content:"\FAC6"}.mdi-hexagon-slice-6:before{content:"\FAC7"}.mdi-hexagram:before{content:"\FAC8"}.mdi-hexagram-outline:before{content:"\FAC9"}.mdi-high-definition:before{content:"\F7CE"}.mdi-high-definition-box:before{content:"\F877"}.mdi-highway:before{content:"\F5F7"}.mdi-hiking:before{content:"\FD5B"}.mdi-hinduism:before{content:"\F972"}.mdi-history:before{content:"\F2DA"}.mdi-hockey-puck:before{content:"\F878"}.mdi-hockey-sticks:before{content:"\F879"}.mdi-hololens:before{content:"\F2DB"}.mdi-home:before{content:"\F2DC"}.mdi-home-account:before{content:"\F825"}.mdi-home-alert:before{content:"\F87A"}.mdi-home-assistant:before{content:"\F7CF"}.mdi-home-automation:before{content:"\F7D0"}.mdi-home-circle:before{content:"\F7D1"}.mdi-home-city:before{content:"\FCF1"}.mdi-home-city-outline:before{content:"\FCF2"}.mdi-home-currency-usd:before{content:"\F8AE"}.mdi-home-floor-0:before{content:"\FDAE"}.mdi-home-floor-1:before{content:"\FD5C"}.mdi-home-floor-2:before{content:"\FD5D"}.mdi-home-floor-3:before{content:"\FD5E"}.mdi-home-floor-a:before{content:"\FD5F"}.mdi-home-floor-b:before{content:"\FD60"}.mdi-home-floor-g:before{content:"\FD61"}.mdi-home-floor-l:before{content:"\FD62"}.mdi-home-floor-negative-1:before{content:"\FDAF"}.mdi-home-group:before{content:"\FDB0"}.mdi-home-heart:before{content:"\F826"}.mdi-home-lock:before{content:"\F8EA"}.mdi-home-lock-open:before{content:"\F8EB"}.mdi-home-map-marker:before{content:"\F5F8"}.mdi-home-minus:before{content:"\F973"}.mdi-home-modern:before{content:"\F2DD"}.mdi-home-outline:before{content:"\F6A0"}.mdi-home-plus:before{content:"\F974"}.mdi-home-variant:before{content:"\F2DE"}.mdi-home-variant-outline:before{content:"\FB83"}.mdi-hook:before{content:"\F6E1"}.mdi-hook-off:before{content:"\F6E2"}.mdi-hops:before{content:"\F2DF"}.mdi-horseshoe:before{content:"\FA57"}.mdi-hospital:before{content:"\F2E0"}.mdi-hospital-building:before{content:"\F2E1"}.mdi-hospital-marker:before{content:"\F2E2"}.mdi-hot-tub:before{content:"\F827"}.mdi-hotel:before{content:"\F2E3"}.mdi-houzz:before{content:"\F2E4"}.mdi-houzz-box:before{content:"\F2E5"}.mdi-hubspot:before{content:"\FCF3"}.mdi-hulu:before{content:"\F828"}.mdi-human:before{content:"\F2E6"}.mdi-human-child:before{content:"\F2E7"}.mdi-human-female:before{content:"\F649"}.mdi-human-female-boy:before{content:"\FA58"}.mdi-human-female-female:before{content:"\FA59"}.mdi-human-female-girl:before{content:"\FA5A"}.mdi-human-greeting:before{content:"\F64A"}.mdi-human-handsdown:before{content:"\F64B"}.mdi-human-handsup:before{content:"\F64C"}.mdi-human-male:before{content:"\F64D"}.mdi-human-male-boy:before{content:"\FA5B"}.mdi-human-male-female:before{content:"\F2E8"}.mdi-human-male-girl:before{content:"\FA5C"}.mdi-human-male-male:before{content:"\FA5D"}.mdi-human-pregnant:before{content:"\F5CF"}.mdi-humble-bundle:before{content:"\F743"}.mdi-ice-cream:before{content:"\F829"}.mdi-iframe:before{content:"\FC67"}.mdi-iframe-outline:before{content:"\FC68"}.mdi-image:before{content:"\F2E9"}.mdi-image-album:before{content:"\F2EA"}.mdi-image-area:before{content:"\F2EB"}.mdi-image-area-close:before{content:"\F2EC"}.mdi-image-broken:before{content:"\F2ED"}.mdi-image-broken-variant:before{content:"\F2EE"}.mdi-image-filter:before{content:"\F2EF"}.mdi-image-filter-black-white:before{content:"\F2F0"}.mdi-image-filter-center-focus:before{content:"\F2F1"}.mdi-image-filter-center-focus-weak:before{content:"\F2F2"}.mdi-image-filter-drama:before{content:"\F2F3"}.mdi-image-filter-frames:before{content:"\F2F4"}.mdi-image-filter-hdr:before{content:"\F2F5"}.mdi-image-filter-none:before{content:"\F2F6"}.mdi-image-filter-tilt-shift:before{content:"\F2F7"}.mdi-image-filter-vintage:before{content:"\F2F8"}.mdi-image-move:before{content:"\F9F7"}.mdi-image-multiple:before{content:"\F2F9"}.mdi-image-off:before{content:"\F82A"}.mdi-image-outline:before{content:"\F975"}.mdi-image-plus:before{content:"\F87B"}.mdi-image-search:before{content:"\F976"}.mdi-image-search-outline:before{content:"\F977"}.mdi-image-size-select-actual:before{content:"\FC69"}.mdi-image-size-select-large:before{content:"\FC6A"}.mdi-image-size-select-small:before{content:"\FC6B"}.mdi-import:before{content:"\F2FA"}.mdi-inbox:before{content:"\F686"}.mdi-inbox-arrow-down:before{content:"\F2FB"}.mdi-inbox-arrow-up:before{content:"\F3D1"}.mdi-inbox-multiple:before{content:"\F8AF"}.mdi-inbox-multiple-outline:before{content:"\FB84"}.mdi-incognito:before{content:"\F5F9"}.mdi-infinity:before{content:"\F6E3"}.mdi-information:before{content:"\F2FC"}.mdi-information-outline:before{content:"\F2FD"}.mdi-information-variant:before{content:"\F64E"}.mdi-instagram:before{content:"\F2FE"}.mdi-instapaper:before{content:"\F2FF"}.mdi-internet-explorer:before{content:"\F300"}.mdi-invert-colors:before{content:"\F301"}.mdi-ip:before{content:"\FA5E"}.mdi-ip-network:before{content:"\FA5F"}.mdi-ip-network-outline:before{content:"\FC6C"}.mdi-ipod:before{content:"\FC6D"}.mdi-islam:before{content:"\F978"}.mdi-itunes:before{content:"\F676"}.mdi-jabber:before{content:"\FDB1"}.mdi-jeepney:before{content:"\F302"}.mdi-jira:before{content:"\F303"}.mdi-jquery:before{content:"\F87C"}.mdi-jsfiddle:before{content:"\F304"}.mdi-json:before{content:"\F626"}.mdi-judaism:before{content:"\F979"}.mdi-kabaddi:before{content:"\FD63"}.mdi-karate:before{content:"\F82B"}.mdi-keg:before{content:"\F305"}.mdi-kettle:before{content:"\F5FA"}.mdi-key:before{content:"\F306"}.mdi-key-change:before{content:"\F307"}.mdi-key-minus:before{content:"\F308"}.mdi-key-outline:before{content:"\FDB2"}.mdi-key-plus:before{content:"\F309"}.mdi-key-remove:before{content:"\F30A"}.mdi-key-variant:before{content:"\F30B"}.mdi-keyboard:before{content:"\F30C"}.mdi-keyboard-backspace:before{content:"\F30D"}.mdi-keyboard-caps:before{content:"\F30E"}.mdi-keyboard-close:before{content:"\F30F"}.mdi-keyboard-off:before{content:"\F310"}.mdi-keyboard-outline:before{content:"\F97A"}.mdi-keyboard-return:before{content:"\F311"}.mdi-keyboard-settings:before{content:"\F9F8"}.mdi-keyboard-settings-outline:before{content:"\F9F9"}.mdi-keyboard-tab:before{content:"\F312"}.mdi-keyboard-variant:before{content:"\F313"}.mdi-kickstarter:before{content:"\F744"}.mdi-knife:before{content:"\F9FA"}.mdi-knife-military:before{content:"\F9FB"}.mdi-kodi:before{content:"\F314"}.mdi-label:before{content:"\F315"}.mdi-label-off:before{content:"\FACA"}.mdi-label-off-outline:before{content:"\FACB"}.mdi-label-outline:before{content:"\F316"}.mdi-label-variant:before{content:"\FACC"}.mdi-label-variant-outline:before{content:"\FACD"}.mdi-ladybug:before{content:"\F82C"}.mdi-lambda:before{content:"\F627"}.mdi-lamp:before{content:"\F6B4"}.mdi-lan:before{content:"\F317"}.mdi-lan-connect:before{content:"\F318"}.mdi-lan-disconnect:before{content:"\F319"}.mdi-lan-pending:before{content:"\F31A"}.mdi-language-c:before{content:"\F671"}.mdi-language-cpp:before{content:"\F672"}.mdi-language-csharp:before{content:"\F31B"}.mdi-language-css3:before{content:"\F31C"}.mdi-language-go:before{content:"\F7D2"}.mdi-language-haskell:before{content:"\FC6E"}.mdi-language-html5:before{content:"\F31D"}.mdi-language-java:before{content:"\FB1C"}.mdi-language-javascript:before{content:"\F31E"}.mdi-language-lua:before{content:"\F8B0"}.mdi-language-php:before{content:"\F31F"}.mdi-language-python:before{content:"\F320"}.mdi-language-python-text:before{content:"\F321"}.mdi-language-r:before{content:"\F7D3"}.mdi-language-ruby-on-rails:before{content:"\FACE"}.mdi-language-swift:before{content:"\F6E4"}.mdi-language-typescript:before{content:"\F6E5"}.mdi-laptop:before{content:"\F322"}.mdi-laptop-chromebook:before{content:"\F323"}.mdi-laptop-mac:before{content:"\F324"}.mdi-laptop-off:before{content:"\F6E6"}.mdi-laptop-windows:before{content:"\F325"}.mdi-laravel:before{content:"\FACF"}.mdi-lastfm:before{content:"\F326"}.mdi-lastpass:before{content:"\F446"}.mdi-launch:before{content:"\F327"}.mdi-lava-lamp:before{content:"\F7D4"}.mdi-layers:before{content:"\F328"}.mdi-layers-off:before{content:"\F329"}.mdi-layers-off-outline:before{content:"\F9FC"}.mdi-layers-outline:before{content:"\F9FD"}.mdi-lead-pencil:before{content:"\F64F"}.mdi-leaf:before{content:"\F32A"}.mdi-leaf-maple:before{content:"\FC6F"}.mdi-leak:before{content:"\FDB3"}.mdi-leak-off:before{content:"\FDB4"}.mdi-led-off:before{content:"\F32B"}.mdi-led-on:before{content:"\F32C"}.mdi-led-outline:before{content:"\F32D"}.mdi-led-strip:before{content:"\F7D5"}.mdi-led-variant-off:before{content:"\F32E"}.mdi-led-variant-on:before{content:"\F32F"}.mdi-led-variant-outline:before{content:"\F330"}.mdi-less-than:before{content:"\F97B"}.mdi-less-than-or-equal:before{content:"\F97C"}.mdi-library:before{content:"\F331"}.mdi-library-books:before{content:"\F332"}.mdi-library-movie:before{content:"\FCF4"}.mdi-library-music:before{content:"\F333"}.mdi-library-plus:before{content:"\F334"}.mdi-library-shelves:before{content:"\FB85"}.mdi-library-video:before{content:"\FCF5"}.mdi-lifebuoy:before{content:"\F87D"}.mdi-light-switch:before{content:"\F97D"}.mdi-lightbulb:before{content:"\F335"}.mdi-lightbulb-on:before{content:"\F6E7"}.mdi-lightbulb-on-outline:before{content:"\F6E8"}.mdi-lightbulb-outline:before{content:"\F336"}.mdi-lighthouse:before{content:"\F9FE"}.mdi-lighthouse-on:before{content:"\F9FF"}.mdi-link:before{content:"\F337"}.mdi-link-box:before{content:"\FCF6"}.mdi-link-box-outline:before{content:"\FCF7"}.mdi-link-box-variant:before{content:"\FCF8"}.mdi-link-box-variant-outline:before{content:"\FCF9"}.mdi-link-off:before{content:"\F338"}.mdi-link-plus:before{content:"\FC70"}.mdi-link-variant:before{content:"\F339"}.mdi-link-variant-off:before{content:"\F33A"}.mdi-linkedin:before{content:"\F33B"}.mdi-linkedin-box:before{content:"\F33C"}.mdi-linux:before{content:"\F33D"}.mdi-linux-mint:before{content:"\F8EC"}.mdi-litecoin:before{content:"\FA60"}.mdi-loading:before{content:"\F771"}.mdi-lock:before{content:"\F33E"}.mdi-lock-alert:before{content:"\F8ED"}.mdi-lock-clock:before{content:"\F97E"}.mdi-lock-open:before{content:"\F33F"}.mdi-lock-open-outline:before{content:"\F340"}.mdi-lock-outline:before{content:"\F341"}.mdi-lock-pattern:before{content:"\F6E9"}.mdi-lock-plus:before{content:"\F5FB"}.mdi-lock-question:before{content:"\F8EE"}.mdi-lock-reset:before{content:"\F772"}.mdi-lock-smart:before{content:"\F8B1"}.mdi-locker:before{content:"\F7D6"}.mdi-locker-multiple:before{content:"\F7D7"}.mdi-login:before{content:"\F342"}.mdi-login-variant:before{content:"\F5FC"}.mdi-logout:before{content:"\F343"}.mdi-logout-variant:before{content:"\F5FD"}.mdi-looks:before{content:"\F344"}.mdi-loop:before{content:"\F6EA"}.mdi-loupe:before{content:"\F345"}.mdi-lumx:before{content:"\F346"}.mdi-lyft:before{content:"\FB1D"}.mdi-magnet:before{content:"\F347"}.mdi-magnet-on:before{content:"\F348"}.mdi-magnify:before{content:"\F349"}.mdi-magnify-close:before{content:"\F97F"}.mdi-magnify-minus:before{content:"\F34A"}.mdi-magnify-minus-cursor:before{content:"\FA61"}.mdi-magnify-minus-outline:before{content:"\F6EB"}.mdi-magnify-plus:before{content:"\F34B"}.mdi-magnify-plus-cursor:before{content:"\FA62"}.mdi-magnify-plus-outline:before{content:"\F6EC"}.mdi-mail-ru:before{content:"\F34C"}.mdi-mailbox:before{content:"\F6ED"}.mdi-mailbox-open:before{content:"\FD64"}.mdi-mailbox-open-outline:before{content:"\FD65"}.mdi-mailbox-open-up:before{content:"\FD66"}.mdi-mailbox-open-up-outline:before{content:"\FD67"}.mdi-mailbox-outline:before{content:"\FD68"}.mdi-mailbox-up:before{content:"\FD69"}.mdi-mailbox-up-outline:before{content:"\FD6A"}.mdi-map:before{content:"\F34D"}.mdi-map-clock:before{content:"\FCFA"}.mdi-map-clock-outline:before{content:"\FCFB"}.mdi-map-legend:before{content:"\FA00"}.mdi-map-marker:before{content:"\F34E"}.mdi-map-marker-check:before{content:"\FC71"}.mdi-map-marker-circle:before{content:"\F34F"}.mdi-map-marker-distance:before{content:"\F8EF"}.mdi-map-marker-minus:before{content:"\F650"}.mdi-map-marker-multiple:before{content:"\F350"}.mdi-map-marker-off:before{content:"\F351"}.mdi-map-marker-outline:before{content:"\F7D8"}.mdi-map-marker-path:before{content:"\FCFC"}.mdi-map-marker-plus:before{content:"\F651"}.mdi-map-marker-radius:before{content:"\F352"}.mdi-map-minus:before{content:"\F980"}.mdi-map-outline:before{content:"\F981"}.mdi-map-plus:before{content:"\F982"}.mdi-map-search:before{content:"\F983"}.mdi-map-search-outline:before{content:"\F984"}.mdi-mapbox:before{content:"\FB86"}.mdi-margin:before{content:"\F353"}.mdi-markdown:before{content:"\F354"}.mdi-marker:before{content:"\F652"}.mdi-marker-cancel:before{content:"\FDB5"}.mdi-marker-check:before{content:"\F355"}.mdi-mastodon:before{content:"\FAD0"}.mdi-mastodon-variant:before{content:"\FAD1"}.mdi-material-design:before{content:"\F985"}.mdi-material-ui:before{content:"\F357"}.mdi-math-compass:before{content:"\F358"}.mdi-math-cos:before{content:"\FC72"}.mdi-math-sin:before{content:"\FC73"}.mdi-math-tan:before{content:"\FC74"}.mdi-matrix:before{content:"\F628"}.mdi-maxcdn:before{content:"\F359"}.mdi-medal:before{content:"\F986"}.mdi-medical-bag:before{content:"\F6EE"}.mdi-medium:before{content:"\F35A"}.mdi-meetup:before{content:"\FAD2"}.mdi-memory:before{content:"\F35B"}.mdi-menu:before{content:"\F35C"}.mdi-menu-down:before{content:"\F35D"}.mdi-menu-down-outline:before{content:"\F6B5"}.mdi-menu-left:before{content:"\F35E"}.mdi-menu-left-outline:before{content:"\FA01"}.mdi-menu-open:before{content:"\FB87"}.mdi-menu-right:before{content:"\F35F"}.mdi-menu-right-outline:before{content:"\FA02"}.mdi-menu-swap:before{content:"\FA63"}.mdi-menu-swap-outline:before{content:"\FA64"}.mdi-menu-up:before{content:"\F360"}.mdi-menu-up-outline:before{content:"\F6B6"}.mdi-message:before{content:"\F361"}.mdi-message-alert:before{content:"\F362"}.mdi-message-alert-outline:before{content:"\FA03"}.mdi-message-bulleted:before{content:"\F6A1"}.mdi-message-bulleted-off:before{content:"\F6A2"}.mdi-message-draw:before{content:"\F363"}.mdi-message-image:before{content:"\F364"}.mdi-message-outline:before{content:"\F365"}.mdi-message-plus:before{content:"\F653"}.mdi-message-processing:before{content:"\F366"}.mdi-message-reply:before{content:"\F367"}.mdi-message-reply-text:before{content:"\F368"}.mdi-message-settings:before{content:"\F6EF"}.mdi-message-settings-variant:before{content:"\F6F0"}.mdi-message-text:before{content:"\F369"}.mdi-message-text-outline:before{content:"\F36A"}.mdi-message-video:before{content:"\F36B"}.mdi-meteor:before{content:"\F629"}.mdi-metronome:before{content:"\F7D9"}.mdi-metronome-tick:before{content:"\F7DA"}.mdi-micro-sd:before{content:"\F7DB"}.mdi-microphone:before{content:"\F36C"}.mdi-microphone-minus:before{content:"\F8B2"}.mdi-microphone-off:before{content:"\F36D"}.mdi-microphone-outline:before{content:"\F36E"}.mdi-microphone-plus:before{content:"\F8B3"}.mdi-microphone-settings:before{content:"\F36F"}.mdi-microphone-variant:before{content:"\F370"}.mdi-microphone-variant-off:before{content:"\F371"}.mdi-microscope:before{content:"\F654"}.mdi-microsoft:before{content:"\F372"}.mdi-microsoft-dynamics:before{content:"\F987"}.mdi-microwave:before{content:"\FC75"}.mdi-midi:before{content:"\F8F0"}.mdi-midi-port:before{content:"\F8F1"}.mdi-mine:before{content:"\FDB6"}.mdi-minecraft:before{content:"\F373"}.mdi-mini-sd:before{content:"\FA04"}.mdi-minidisc:before{content:"\FA05"}.mdi-minus:before{content:"\F374"}.mdi-minus-box:before{content:"\F375"}.mdi-minus-box-outline:before{content:"\F6F1"}.mdi-minus-circle:before{content:"\F376"}.mdi-minus-circle-outline:before{content:"\F377"}.mdi-minus-network:before{content:"\F378"}.mdi-minus-network-outline:before{content:"\FC76"}.mdi-mixcloud:before{content:"\F62A"}.mdi-mixed-martial-arts:before{content:"\FD6B"}.mdi-mixed-reality:before{content:"\F87E"}.mdi-mixer:before{content:"\F7DC"}.mdi-molecule:before{content:"\FB88"}.mdi-monitor:before{content:"\F379"}.mdi-monitor-cellphone:before{content:"\F988"}.mdi-monitor-cellphone-star:before{content:"\F989"}.mdi-monitor-dashboard:before{content:"\FA06"}.mdi-monitor-lock:before{content:"\FDB7"}.mdi-monitor-multiple:before{content:"\F37A"}.mdi-monitor-off:before{content:"\FD6C"}.mdi-monitor-star:before{content:"\FDB8"}.mdi-more:before{content:"\F37B"}.mdi-mother-nurse:before{content:"\FCFD"}.mdi-motion-sensor:before{content:"\FD6D"}.mdi-motorbike:before{content:"\F37C"}.mdi-mouse:before{content:"\F37D"}.mdi-mouse-bluetooth:before{content:"\F98A"}.mdi-mouse-off:before{content:"\F37E"}.mdi-mouse-variant:before{content:"\F37F"}.mdi-mouse-variant-off:before{content:"\F380"}.mdi-move-resize:before{content:"\F655"}.mdi-move-resize-variant:before{content:"\F656"}.mdi-movie:before{content:"\F381"}.mdi-movie-outline:before{content:"\FDB9"}.mdi-movie-roll:before{content:"\F7DD"}.mdi-muffin:before{content:"\F98B"}.mdi-multiplication:before{content:"\F382"}.mdi-multiplication-box:before{content:"\F383"}.mdi-mushroom:before{content:"\F7DE"}.mdi-mushroom-outline:before{content:"\F7DF"}.mdi-music:before{content:"\F759"}.mdi-music-box:before{content:"\F384"}.mdi-music-box-outline:before{content:"\F385"}.mdi-music-circle:before{content:"\F386"}.mdi-music-circle-outline:before{content:"\FAD3"}.mdi-music-note:before{content:"\F387"}.mdi-music-note-bluetooth:before{content:"\F5FE"}.mdi-music-note-bluetooth-off:before{content:"\F5FF"}.mdi-music-note-eighth:before{content:"\F388"}.mdi-music-note-half:before{content:"\F389"}.mdi-music-note-off:before{content:"\F38A"}.mdi-music-note-plus:before{content:"\FDBA"}.mdi-music-note-quarter:before{content:"\F38B"}.mdi-music-note-sixteenth:before{content:"\F38C"}.mdi-music-note-whole:before{content:"\F38D"}.mdi-music-off:before{content:"\F75A"}.mdi-nail:before{content:"\FDBB"}.mdi-nas:before{content:"\F8F2"}.mdi-nativescript:before{content:"\F87F"}.mdi-nature:before{content:"\F38E"}.mdi-nature-people:before{content:"\F38F"}.mdi-navigation:before{content:"\F390"}.mdi-near-me:before{content:"\F5CD"}.mdi-needle:before{content:"\F391"}.mdi-netflix:before{content:"\F745"}.mdi-network:before{content:"\F6F2"}.mdi-network-off:before{content:"\FC77"}.mdi-network-off-outline:before{content:"\FC78"}.mdi-network-outline:before{content:"\FC79"}.mdi-network-strength-1:before{content:"\F8F3"}.mdi-network-strength-1-alert:before{content:"\F8F4"}.mdi-network-strength-2:before{content:"\F8F5"}.mdi-network-strength-2-alert:before{content:"\F8F6"}.mdi-network-strength-3:before{content:"\F8F7"}.mdi-network-strength-3-alert:before{content:"\F8F8"}.mdi-network-strength-4:before{content:"\F8F9"}.mdi-network-strength-4-alert:before{content:"\F8FA"}.mdi-network-strength-off:before{content:"\F8FB"}.mdi-network-strength-off-outline:before{content:"\F8FC"}.mdi-network-strength-outline:before{content:"\F8FD"}.mdi-new-box:before{content:"\F394"}.mdi-newspaper:before{content:"\F395"}.mdi-nfc:before{content:"\F396"}.mdi-nfc-tap:before{content:"\F397"}.mdi-nfc-variant:before{content:"\F398"}.mdi-ninja:before{content:"\F773"}.mdi-nintendo-switch:before{content:"\F7E0"}.mdi-nodejs:before{content:"\F399"}.mdi-not-equal:before{content:"\F98C"}.mdi-not-equal-variant:before{content:"\F98D"}.mdi-note:before{content:"\F39A"}.mdi-note-multiple:before{content:"\F6B7"}.mdi-note-multiple-outline:before{content:"\F6B8"}.mdi-note-outline:before{content:"\F39B"}.mdi-note-plus:before{content:"\F39C"}.mdi-note-plus-outline:before{content:"\F39D"}.mdi-note-text:before{content:"\F39E"}.mdi-notebook:before{content:"\F82D"}.mdi-notification-clear-all:before{content:"\F39F"}.mdi-npm:before{content:"\F6F6"}.mdi-npm-variant:before{content:"\F98E"}.mdi-npm-variant-outline:before{content:"\F98F"}.mdi-nuke:before{content:"\F6A3"}.mdi-null:before{content:"\F7E1"}.mdi-numeric:before{content:"\F3A0"}.mdi-numeric-0:before{content:"\30"}.mdi-numeric-0-box:before{content:"\F3A1"}.mdi-numeric-0-box-multiple-outline:before{content:"\F3A2"}.mdi-numeric-0-box-outline:before{content:"\F3A3"}.mdi-numeric-0-circle:before{content:"\FC7A"}.mdi-numeric-0-circle-outline:before{content:"\FC7B"}.mdi-numeric-1:before{content:"\31"}.mdi-numeric-1-box:before{content:"\F3A4"}.mdi-numeric-1-box-multiple-outline:before{content:"\F3A5"}.mdi-numeric-1-box-outline:before{content:"\F3A6"}.mdi-numeric-1-circle:before{content:"\FC7C"}.mdi-numeric-1-circle-outline:before{content:"\FC7D"}.mdi-numeric-2:before{content:"\32"}.mdi-numeric-2-box:before{content:"\F3A7"}.mdi-numeric-2-box-multiple-outline:before{content:"\F3A8"}.mdi-numeric-2-box-outline:before{content:"\F3A9"}.mdi-numeric-2-circle:before{content:"\FC7E"}.mdi-numeric-2-circle-outline:before{content:"\FC7F"}.mdi-numeric-3:before{content:"\33"}.mdi-numeric-3-box:before{content:"\F3AA"}.mdi-numeric-3-box-multiple-outline:before{content:"\F3AB"}.mdi-numeric-3-box-outline:before{content:"\F3AC"}.mdi-numeric-3-circle:before{content:"\FC80"}.mdi-numeric-3-circle-outline:before{content:"\FC81"}.mdi-numeric-4:before{content:"\34"}.mdi-numeric-4-box:before{content:"\F3AD"}.mdi-numeric-4-box-multiple-outline:before{content:"\F3AE"}.mdi-numeric-4-box-outline:before{content:"\F3AF"}.mdi-numeric-4-circle:before{content:"\FC82"}.mdi-numeric-4-circle-outline:before{content:"\FC83"}.mdi-numeric-5:before{content:"\35"}.mdi-numeric-5-box:before{content:"\F3B0"}.mdi-numeric-5-box-multiple-outline:before{content:"\F3B1"}.mdi-numeric-5-box-outline:before{content:"\F3B2"}.mdi-numeric-5-circle:before{content:"\FC84"}.mdi-numeric-5-circle-outline:before{content:"\FC85"}.mdi-numeric-6:before{content:"\36"}.mdi-numeric-6-box:before{content:"\F3B3"}.mdi-numeric-6-box-multiple-outline:before{content:"\F3B4"}.mdi-numeric-6-box-outline:before{content:"\F3B5"}.mdi-numeric-6-circle:before{content:"\FC86"}.mdi-numeric-6-circle-outline:before{content:"\FC87"}.mdi-numeric-7:before{content:"\37"}.mdi-numeric-7-box:before{content:"\F3B6"}.mdi-numeric-7-box-multiple-outline:before{content:"\F3B7"}.mdi-numeric-7-box-outline:before{content:"\F3B8"}.mdi-numeric-7-circle:before{content:"\FC88"}.mdi-numeric-7-circle-outline:before{content:"\FC89"}.mdi-numeric-8:before{content:"\38"}.mdi-numeric-8-box:before{content:"\F3B9"}.mdi-numeric-8-box-multiple-outline:before{content:"\F3BA"}.mdi-numeric-8-box-outline:before{content:"\F3BB"}.mdi-numeric-8-circle:before{content:"\FC8A"}.mdi-numeric-8-circle-outline:before{content:"\FC8B"}.mdi-numeric-9:before{content:"\39"}.mdi-numeric-9-box:before{content:"\F3BC"}.mdi-numeric-9-box-multiple-outline:before{content:"\F3BD"}.mdi-numeric-9-box-outline:before{content:"\F3BE"}.mdi-numeric-9-circle:before{content:"\FC8C"}.mdi-numeric-9-circle-outline:before{content:"\FC8D"}.mdi-numeric-9-plus-box:before{content:"\F3BF"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\F3C0"}.mdi-numeric-9-plus-box-outline:before{content:"\F3C1"}.mdi-numeric-9-plus-circle:before{content:"\FC8E"}.mdi-numeric-9-plus-circle-outline:before{content:"\FC8F"}.mdi-nut:before{content:"\F6F7"}.mdi-nutrition:before{content:"\F3C2"}.mdi-oar:before{content:"\F67B"}.mdi-ocarina:before{content:"\FDBC"}.mdi-octagon:before{content:"\F3C3"}.mdi-octagon-outline:before{content:"\F3C4"}.mdi-octagram:before{content:"\F6F8"}.mdi-octagram-outline:before{content:"\F774"}.mdi-odnoklassniki:before{content:"\F3C5"}.mdi-office:before{content:"\F3C6"}.mdi-office-building:before{content:"\F990"}.mdi-oil:before{content:"\F3C7"}.mdi-oil-temperature:before{content:"\F3C8"}.mdi-omega:before{content:"\F3C9"}.mdi-one-up:before{content:"\FB89"}.mdi-onedrive:before{content:"\F3CA"}.mdi-onenote:before{content:"\F746"}.mdi-onepassword:before{content:"\F880"}.mdi-opacity:before{content:"\F5CC"}.mdi-open-in-app:before{content:"\F3CB"}.mdi-open-in-new:before{content:"\F3CC"}.mdi-open-source-initiative:before{content:"\FB8A"}.mdi-openid:before{content:"\F3CD"}.mdi-opera:before{content:"\F3CE"}.mdi-orbit:before{content:"\F018"}.mdi-origin:before{content:"\FB2B"}.mdi-ornament:before{content:"\F3CF"}.mdi-ornament-variant:before{content:"\F3D0"}.mdi-outlook:before{content:"\FCFE"}.mdi-owl:before{content:"\F3D2"}.mdi-pac-man:before{content:"\FB8B"}.mdi-package:before{content:"\F3D3"}.mdi-package-down:before{content:"\F3D4"}.mdi-package-up:before{content:"\F3D5"}.mdi-package-variant:before{content:"\F3D6"}.mdi-package-variant-closed:before{content:"\F3D7"}.mdi-page-first:before{content:"\F600"}.mdi-page-last:before{content:"\F601"}.mdi-page-layout-body:before{content:"\F6F9"}.mdi-page-layout-footer:before{content:"\F6FA"}.mdi-page-layout-header:before{content:"\F6FB"}.mdi-page-layout-sidebar-left:before{content:"\F6FC"}.mdi-page-layout-sidebar-right:before{content:"\F6FD"}.mdi-page-next:before{content:"\FB8C"}.mdi-page-next-outline:before{content:"\FB8D"}.mdi-page-previous:before{content:"\FB8E"}.mdi-page-previous-outline:before{content:"\FB8F"}.mdi-palette:before{content:"\F3D8"}.mdi-palette-advanced:before{content:"\F3D9"}.mdi-palette-outline:before{content:"\FDE8"}.mdi-palette-swatch:before{content:"\F8B4"}.mdi-pan:before{content:"\FB90"}.mdi-pan-bottom-left:before{content:"\FB91"}.mdi-pan-bottom-right:before{content:"\FB92"}.mdi-pan-down:before{content:"\FB93"}.mdi-pan-horizontal:before{content:"\FB94"}.mdi-pan-left:before{content:"\FB95"}.mdi-pan-right:before{content:"\FB96"}.mdi-pan-top-left:before{content:"\FB97"}.mdi-pan-top-right:before{content:"\FB98"}.mdi-pan-up:before{content:"\FB99"}.mdi-pan-vertical:before{content:"\FB9A"}.mdi-panda:before{content:"\F3DA"}.mdi-pandora:before{content:"\F3DB"}.mdi-panorama:before{content:"\F3DC"}.mdi-panorama-fisheye:before{content:"\F3DD"}.mdi-panorama-horizontal:before{content:"\F3DE"}.mdi-panorama-vertical:before{content:"\F3DF"}.mdi-panorama-wide-angle:before{content:"\F3E0"}.mdi-paper-cut-vertical:before{content:"\F3E1"}.mdi-paperclip:before{content:"\F3E2"}.mdi-parachute:before{content:"\FC90"}.mdi-parachute-outline:before{content:"\FC91"}.mdi-parking:before{content:"\F3E3"}.mdi-passport:before{content:"\F7E2"}.mdi-passport-biometric:before{content:"\FDBD"}.mdi-patreon:before{content:"\F881"}.mdi-pause:before{content:"\F3E4"}.mdi-pause-circle:before{content:"\F3E5"}.mdi-pause-circle-outline:before{content:"\F3E6"}.mdi-pause-octagon:before{content:"\F3E7"}.mdi-pause-octagon-outline:before{content:"\F3E8"}.mdi-paw:before{content:"\F3E9"}.mdi-paw-off:before{content:"\F657"}.mdi-paypal:before{content:"\F882"}.mdi-peace:before{content:"\F883"}.mdi-pen:before{content:"\F3EA"}.mdi-pen-lock:before{content:"\FDBE"}.mdi-pen-minus:before{content:"\FDBF"}.mdi-pen-off:before{content:"\FDC0"}.mdi-pen-plus:before{content:"\FDC1"}.mdi-pen-remove:before{content:"\FDC2"}.mdi-pencil:before{content:"\F3EB"}.mdi-pencil-box:before{content:"\F3EC"}.mdi-pencil-box-outline:before{content:"\F3ED"}.mdi-pencil-circle:before{content:"\F6FE"}.mdi-pencil-circle-outline:before{content:"\F775"}.mdi-pencil-lock:before{content:"\F3EE"}.mdi-pencil-lock-outline:before{content:"\FDC3"}.mdi-pencil-minus:before{content:"\FDC4"}.mdi-pencil-minus-outline:before{content:"\FDC5"}.mdi-pencil-off:before{content:"\F3EF"}.mdi-pencil-off-outline:before{content:"\FDC6"}.mdi-pencil-outline:before{content:"\FC92"}.mdi-pencil-plus:before{content:"\FDC7"}.mdi-pencil-plus-outline:before{content:"\FDC8"}.mdi-pencil-remove:before{content:"\FDC9"}.mdi-pencil-remove-outline:before{content:"\FDCA"}.mdi-pentagon:before{content:"\F6FF"}.mdi-pentagon-outline:before{content:"\F700"}.mdi-percent:before{content:"\F3F0"}.mdi-periodic-table:before{content:"\F8B5"}.mdi-periodic-table-co2:before{content:"\F7E3"}.mdi-periscope:before{content:"\F747"}.mdi-perspective-less:before{content:"\FCFF"}.mdi-perspective-more:before{content:"\FD00"}.mdi-pharmacy:before{content:"\F3F1"}.mdi-phone:before{content:"\F3F2"}.mdi-phone-bluetooth:before{content:"\F3F3"}.mdi-phone-classic:before{content:"\F602"}.mdi-phone-forward:before{content:"\F3F4"}.mdi-phone-hangup:before{content:"\F3F5"}.mdi-phone-in-talk:before{content:"\F3F6"}.mdi-phone-incoming:before{content:"\F3F7"}.mdi-phone-lock:before{content:"\F3F8"}.mdi-phone-log:before{content:"\F3F9"}.mdi-phone-minus:before{content:"\F658"}.mdi-phone-missed:before{content:"\F3FA"}.mdi-phone-off:before{content:"\FDCB"}.mdi-phone-outgoing:before{content:"\F3FB"}.mdi-phone-outline:before{content:"\FDCC"}.mdi-phone-paused:before{content:"\F3FC"}.mdi-phone-plus:before{content:"\F659"}.mdi-phone-return:before{content:"\F82E"}.mdi-phone-rotate-landscape:before{content:"\F884"}.mdi-phone-rotate-portrait:before{content:"\F885"}.mdi-phone-settings:before{content:"\F3FD"}.mdi-phone-voip:before{content:"\F3FE"}.mdi-pi:before{content:"\F3FF"}.mdi-pi-box:before{content:"\F400"}.mdi-pi-hole:before{content:"\FDCD"}.mdi-piano:before{content:"\F67C"}.mdi-pickaxe:before{content:"\F8B6"}.mdi-pier:before{content:"\F886"}.mdi-pier-crane:before{content:"\F887"}.mdi-pig:before{content:"\F401"}.mdi-pill:before{content:"\F402"}.mdi-pillar:before{content:"\F701"}.mdi-pin:before{content:"\F403"}.mdi-pin-off:before{content:"\F404"}.mdi-pin-off-outline:before{content:"\F92F"}.mdi-pin-outline:before{content:"\F930"}.mdi-pine-tree:before{content:"\F405"}.mdi-pine-tree-box:before{content:"\F406"}.mdi-pinterest:before{content:"\F407"}.mdi-pinterest-box:before{content:"\F408"}.mdi-pinwheel:before{content:"\FAD4"}.mdi-pinwheel-outline:before{content:"\FAD5"}.mdi-pipe:before{content:"\F7E4"}.mdi-pipe-disconnected:before{content:"\F7E5"}.mdi-pipe-leak:before{content:"\F888"}.mdi-pirate:before{content:"\FA07"}.mdi-pistol:before{content:"\F702"}.mdi-piston:before{content:"\F889"}.mdi-pizza:before{content:"\F409"}.mdi-play:before{content:"\F40A"}.mdi-play-box-outline:before{content:"\F40B"}.mdi-play-circle:before{content:"\F40C"}.mdi-play-circle-outline:before{content:"\F40D"}.mdi-play-network:before{content:"\F88A"}.mdi-play-network-outline:before{content:"\FC93"}.mdi-play-pause:before{content:"\F40E"}.mdi-play-protected-content:before{content:"\F40F"}.mdi-play-speed:before{content:"\F8FE"}.mdi-playlist-check:before{content:"\F5C7"}.mdi-playlist-edit:before{content:"\F8FF"}.mdi-playlist-minus:before{content:"\F410"}.mdi-playlist-music:before{content:"\FC94"}.mdi-playlist-music-outline:before{content:"\FC95"}.mdi-playlist-play:before{content:"\F411"}.mdi-playlist-plus:before{content:"\F412"}.mdi-playlist-remove:before{content:"\F413"}.mdi-playlist-star:before{content:"\FDCE"}.mdi-playstation:before{content:"\F414"}.mdi-plex:before{content:"\F6B9"}.mdi-plus:before{content:"\F415"}.mdi-plus-box:before{content:"\F416"}.mdi-plus-box-outline:before{content:"\F703"}.mdi-plus-circle:before{content:"\F417"}.mdi-plus-circle-multiple-outline:before{content:"\F418"}.mdi-plus-circle-outline:before{content:"\F419"}.mdi-plus-minus:before{content:"\F991"}.mdi-plus-minus-box:before{content:"\F992"}.mdi-plus-network:before{content:"\F41A"}.mdi-plus-network-outline:before{content:"\FC96"}.mdi-plus-one:before{content:"\F41B"}.mdi-plus-outline:before{content:"\F704"}.mdi-pocket:before{content:"\F41C"}.mdi-podcast:before{content:"\F993"}.mdi-podium:before{content:"\FD01"}.mdi-podium-bronze:before{content:"\FD02"}.mdi-podium-gold:before{content:"\FD03"}.mdi-podium-silver:before{content:"\FD04"}.mdi-point-of-sale:before{content:"\FD6E"}.mdi-pokeball:before{content:"\F41D"}.mdi-pokemon-go:before{content:"\FA08"}.mdi-poker-chip:before{content:"\F82F"}.mdi-polaroid:before{content:"\F41E"}.mdi-poll:before{content:"\F41F"}.mdi-poll-box:before{content:"\F420"}.mdi-polymer:before{content:"\F421"}.mdi-pool:before{content:"\F606"}.mdi-popcorn:before{content:"\F422"}.mdi-postage-stamp:before{content:"\FC97"}.mdi-pot:before{content:"\F65A"}.mdi-pot-mix:before{content:"\F65B"}.mdi-pound:before{content:"\F423"}.mdi-pound-box:before{content:"\F424"}.mdi-power:before{content:"\F425"}.mdi-power-cycle:before{content:"\F900"}.mdi-power-off:before{content:"\F901"}.mdi-power-on:before{content:"\F902"}.mdi-power-plug:before{content:"\F6A4"}.mdi-power-plug-off:before{content:"\F6A5"}.mdi-power-settings:before{content:"\F426"}.mdi-power-sleep:before{content:"\F903"}.mdi-power-socket:before{content:"\F427"}.mdi-power-socket-au:before{content:"\F904"}.mdi-power-socket-eu:before{content:"\F7E6"}.mdi-power-socket-uk:before{content:"\F7E7"}.mdi-power-socket-us:before{content:"\F7E8"}.mdi-power-standby:before{content:"\F905"}.mdi-powershell:before{content:"\FA09"}.mdi-prescription:before{content:"\F705"}.mdi-presentation:before{content:"\F428"}.mdi-presentation-play:before{content:"\F429"}.mdi-printer:before{content:"\F42A"}.mdi-printer-3d:before{content:"\F42B"}.mdi-printer-alert:before{content:"\F42C"}.mdi-printer-settings:before{content:"\F706"}.mdi-printer-wireless:before{content:"\FA0A"}.mdi-priority-high:before{content:"\F603"}.mdi-priority-low:before{content:"\F604"}.mdi-professional-hexagon:before{content:"\F42D"}.mdi-progress-alert:before{content:"\FC98"}.mdi-progress-check:before{content:"\F994"}.mdi-progress-clock:before{content:"\F995"}.mdi-progress-download:before{content:"\F996"}.mdi-progress-upload:before{content:"\F997"}.mdi-progress-wrench:before{content:"\FC99"}.mdi-projector:before{content:"\F42E"}.mdi-projector-screen:before{content:"\F42F"}.mdi-publish:before{content:"\F6A6"}.mdi-pulse:before{content:"\F430"}.mdi-pumpkin:before{content:"\FB9B"}.mdi-puzzle:before{content:"\F431"}.mdi-puzzle-outline:before{content:"\FA65"}.mdi-qi:before{content:"\F998"}.mdi-qqchat:before{content:"\F605"}.mdi-qrcode:before{content:"\F432"}.mdi-qrcode-edit:before{content:"\F8B7"}.mdi-qrcode-scan:before{content:"\F433"}.mdi-quadcopter:before{content:"\F434"}.mdi-quality-high:before{content:"\F435"}.mdi-quality-low:before{content:"\FA0B"}.mdi-quality-medium:before{content:"\FA0C"}.mdi-quicktime:before{content:"\F436"}.mdi-quora:before{content:"\FD05"}.mdi-rabbit:before{content:"\F906"}.mdi-racing-helmet:before{content:"\FD6F"}.mdi-racquetball:before{content:"\FD70"}.mdi-radar:before{content:"\F437"}.mdi-radiator:before{content:"\F438"}.mdi-radiator-disabled:before{content:"\FAD6"}.mdi-radiator-off:before{content:"\FAD7"}.mdi-radio:before{content:"\F439"}.mdi-radio-am:before{content:"\FC9A"}.mdi-radio-fm:before{content:"\FC9B"}.mdi-radio-handheld:before{content:"\F43A"}.mdi-radio-tower:before{content:"\F43B"}.mdi-radioactive:before{content:"\F43C"}.mdi-radiobox-blank:before{content:"\F43D"}.mdi-radiobox-marked:before{content:"\F43E"}.mdi-radius:before{content:"\FC9C"}.mdi-radius-outline:before{content:"\FC9D"}.mdi-raspberry-pi:before{content:"\F43F"}.mdi-ray-end:before{content:"\F440"}.mdi-ray-end-arrow:before{content:"\F441"}.mdi-ray-start:before{content:"\F442"}.mdi-ray-start-arrow:before{content:"\F443"}.mdi-ray-start-end:before{content:"\F444"}.mdi-ray-vertex:before{content:"\F445"}.mdi-react:before{content:"\F707"}.mdi-read:before{content:"\F447"}.mdi-receipt:before{content:"\F449"}.mdi-record:before{content:"\F44A"}.mdi-record-player:before{content:"\F999"}.mdi-record-rec:before{content:"\F44B"}.mdi-recycle:before{content:"\F44C"}.mdi-reddit:before{content:"\F44D"}.mdi-redo:before{content:"\F44E"}.mdi-redo-variant:before{content:"\F44F"}.mdi-reflect-horizontal:before{content:"\FA0D"}.mdi-reflect-vertical:before{content:"\FA0E"}.mdi-refresh:before{content:"\F450"}.mdi-regex:before{content:"\F451"}.mdi-registered-trademark:before{content:"\FA66"}.mdi-relative-scale:before{content:"\F452"}.mdi-reload:before{content:"\F453"}.mdi-reminder:before{content:"\F88B"}.mdi-remote:before{content:"\F454"}.mdi-remote-desktop:before{content:"\F8B8"}.mdi-rename-box:before{content:"\F455"}.mdi-reorder-horizontal:before{content:"\F687"}.mdi-reorder-vertical:before{content:"\F688"}.mdi-repeat:before{content:"\F456"}.mdi-repeat-off:before{content:"\F457"}.mdi-repeat-once:before{content:"\F458"}.mdi-replay:before{content:"\F459"}.mdi-reply:before{content:"\F45A"}.mdi-reply-all:before{content:"\F45B"}.mdi-reproduction:before{content:"\F45C"}.mdi-resistor:before{content:"\FB1F"}.mdi-resistor-nodes:before{content:"\FB20"}.mdi-resize:before{content:"\FA67"}.mdi-resize-bottom-right:before{content:"\F45D"}.mdi-responsive:before{content:"\F45E"}.mdi-restart:before{content:"\F708"}.mdi-restart-off:before{content:"\FD71"}.mdi-restore:before{content:"\F99A"}.mdi-restore-clock:before{content:"\F6A7"}.mdi-rewind:before{content:"\F45F"}.mdi-rewind-10:before{content:"\FD06"}.mdi-rewind-30:before{content:"\FD72"}.mdi-rewind-outline:before{content:"\F709"}.mdi-rhombus:before{content:"\F70A"}.mdi-rhombus-medium:before{content:"\FA0F"}.mdi-rhombus-outline:before{content:"\F70B"}.mdi-rhombus-split:before{content:"\FA10"}.mdi-ribbon:before{content:"\F460"}.mdi-rice:before{content:"\F7E9"}.mdi-ring:before{content:"\F7EA"}.mdi-road:before{content:"\F461"}.mdi-road-variant:before{content:"\F462"}.mdi-robot:before{content:"\F6A8"}.mdi-robot-industrial:before{content:"\FB21"}.mdi-robot-vacuum:before{content:"\F70C"}.mdi-robot-vacuum-variant:before{content:"\F907"}.mdi-rocket:before{content:"\F463"}.mdi-roller-skate:before{content:"\FD07"}.mdi-rollerblade:before{content:"\FD08"}.mdi-rollupjs:before{content:"\FB9C"}.mdi-room-service:before{content:"\F88C"}.mdi-room-service-outline:before{content:"\FD73"}.mdi-rotate-3d:before{content:"\F464"}.mdi-rotate-left:before{content:"\F465"}.mdi-rotate-left-variant:before{content:"\F466"}.mdi-rotate-orbit:before{content:"\FD74"}.mdi-rotate-right:before{content:"\F467"}.mdi-rotate-right-variant:before{content:"\F468"}.mdi-rounded-corner:before{content:"\F607"}.mdi-router-wireless:before{content:"\F469"}.mdi-router-wireless-settings:before{content:"\FA68"}.mdi-routes:before{content:"\F46A"}.mdi-rowing:before{content:"\F608"}.mdi-rss:before{content:"\F46B"}.mdi-rss-box:before{content:"\F46C"}.mdi-ruby:before{content:"\FD09"}.mdi-rugby:before{content:"\FD75"}.mdi-ruler:before{content:"\F46D"}.mdi-ruler-square:before{content:"\FC9E"}.mdi-run:before{content:"\F70D"}.mdi-run-fast:before{content:"\F46E"}.mdi-sack:before{content:"\FD0A"}.mdi-sack-percent:before{content:"\FD0B"}.mdi-safe:before{content:"\FA69"}.mdi-safety-goggles:before{content:"\FD0C"}.mdi-sale:before{content:"\F46F"}.mdi-salesforce:before{content:"\F88D"}.mdi-sass:before{content:"\F7EB"}.mdi-satellite:before{content:"\F470"}.mdi-satellite-uplink:before{content:"\F908"}.mdi-satellite-variant:before{content:"\F471"}.mdi-sausage:before{content:"\F8B9"}.mdi-saxophone:before{content:"\F609"}.mdi-scale:before{content:"\F472"}.mdi-scale-balance:before{content:"\F5D1"}.mdi-scale-bathroom:before{content:"\F473"}.mdi-scanner:before{content:"\F6AA"}.mdi-scanner-off:before{content:"\F909"}.mdi-school:before{content:"\F474"}.mdi-scissors-cutting:before{content:"\FA6A"}.mdi-screen-rotation:before{content:"\F475"}.mdi-screen-rotation-lock:before{content:"\F476"}.mdi-screw-flat-top:before{content:"\FDCF"}.mdi-screw-lag:before{content:"\FDD0"}.mdi-screw-machine-flat-top:before{content:"\FDD1"}.mdi-screw-machine-round-top:before{content:"\FDD2"}.mdi-screw-round-top:before{content:"\FDD3"}.mdi-screwdriver:before{content:"\F477"}.mdi-script:before{content:"\FB9D"}.mdi-script-outline:before{content:"\F478"}.mdi-script-text:before{content:"\FB9E"}.mdi-script-text-outline:before{content:"\FB9F"}.mdi-sd:before{content:"\F479"}.mdi-seal:before{content:"\F47A"}.mdi-search-web:before{content:"\F70E"}.mdi-seat:before{content:"\FC9F"}.mdi-seat-flat:before{content:"\F47B"}.mdi-seat-flat-angled:before{content:"\F47C"}.mdi-seat-individual-suite:before{content:"\F47D"}.mdi-seat-legroom-extra:before{content:"\F47E"}.mdi-seat-legroom-normal:before{content:"\F47F"}.mdi-seat-legroom-reduced:before{content:"\F480"}.mdi-seat-outline:before{content:"\FCA0"}.mdi-seat-recline-extra:before{content:"\F481"}.mdi-seat-recline-normal:before{content:"\F482"}.mdi-seatbelt:before{content:"\FCA1"}.mdi-security:before{content:"\F483"}.mdi-security-network:before{content:"\F484"}.mdi-select:before{content:"\F485"}.mdi-select-all:before{content:"\F486"}.mdi-select-color:before{content:"\FD0D"}.mdi-select-compare:before{content:"\FAD8"}.mdi-select-drag:before{content:"\FA6B"}.mdi-select-inverse:before{content:"\F487"}.mdi-select-off:before{content:"\F488"}.mdi-selection:before{content:"\F489"}.mdi-selection-drag:before{content:"\FA6C"}.mdi-selection-ellipse:before{content:"\FD0E"}.mdi-selection-off:before{content:"\F776"}.mdi-send:before{content:"\F48A"}.mdi-send-circle:before{content:"\FDD4"}.mdi-send-circle-outline:before{content:"\FDD5"}.mdi-send-lock:before{content:"\F7EC"}.mdi-serial-port:before{content:"\F65C"}.mdi-server:before{content:"\F48B"}.mdi-server-minus:before{content:"\F48C"}.mdi-server-network:before{content:"\F48D"}.mdi-server-network-off:before{content:"\F48E"}.mdi-server-off:before{content:"\F48F"}.mdi-server-plus:before{content:"\F490"}.mdi-server-remove:before{content:"\F491"}.mdi-server-security:before{content:"\F492"}.mdi-set-all:before{content:"\F777"}.mdi-set-center:before{content:"\F778"}.mdi-set-center-right:before{content:"\F779"}.mdi-set-left:before{content:"\F77A"}.mdi-set-left-center:before{content:"\F77B"}.mdi-set-left-right:before{content:"\F77C"}.mdi-set-none:before{content:"\F77D"}.mdi-set-right:before{content:"\F77E"}.mdi-set-top-box:before{content:"\F99E"}.mdi-settings:before{content:"\F493"}.mdi-settings-box:before{content:"\F494"}.mdi-settings-helper:before{content:"\FA6D"}.mdi-settings-outline:before{content:"\F8BA"}.mdi-shape:before{content:"\F830"}.mdi-shape-circle-plus:before{content:"\F65D"}.mdi-shape-outline:before{content:"\F831"}.mdi-shape-plus:before{content:"\F495"}.mdi-shape-polygon-plus:before{content:"\F65E"}.mdi-shape-rectangle-plus:before{content:"\F65F"}.mdi-shape-square-plus:before{content:"\F660"}.mdi-share:before{content:"\F496"}.mdi-share-outline:before{content:"\F931"}.mdi-share-variant:before{content:"\F497"}.mdi-sheep:before{content:"\FCA2"}.mdi-shield:before{content:"\F498"}.mdi-shield-account:before{content:"\F88E"}.mdi-shield-account-outline:before{content:"\FA11"}.mdi-shield-airplane:before{content:"\F6BA"}.mdi-shield-airplane-outline:before{content:"\FCA3"}.mdi-shield-check:before{content:"\F565"}.mdi-shield-check-outline:before{content:"\FCA4"}.mdi-shield-cross:before{content:"\FCA5"}.mdi-shield-cross-outline:before{content:"\FCA6"}.mdi-shield-half-full:before{content:"\F77F"}.mdi-shield-home:before{content:"\F689"}.mdi-shield-home-outline:before{content:"\FCA7"}.mdi-shield-key:before{content:"\FBA0"}.mdi-shield-key-outline:before{content:"\FBA1"}.mdi-shield-link-variant:before{content:"\FD0F"}.mdi-shield-link-variant-outline:before{content:"\FD10"}.mdi-shield-lock:before{content:"\F99C"}.mdi-shield-lock-outline:before{content:"\FCA8"}.mdi-shield-off:before{content:"\F99D"}.mdi-shield-off-outline:before{content:"\F99B"}.mdi-shield-outline:before{content:"\F499"}.mdi-shield-plus:before{content:"\FAD9"}.mdi-shield-plus-outline:before{content:"\FADA"}.mdi-shield-remove:before{content:"\FADB"}.mdi-shield-remove-outline:before{content:"\FADC"}.mdi-shield-search:before{content:"\FD76"}.mdi-ship-wheel:before{content:"\F832"}.mdi-shoe-formal:before{content:"\FB22"}.mdi-shoe-heel:before{content:"\FB23"}.mdi-shoe-print:before{content:"\FDD6"}.mdi-shopify:before{content:"\FADD"}.mdi-shopping:before{content:"\F49A"}.mdi-shopping-music:before{content:"\F49B"}.mdi-shovel:before{content:"\F70F"}.mdi-shovel-off:before{content:"\F710"}.mdi-shower:before{content:"\F99F"}.mdi-shower-head:before{content:"\F9A0"}.mdi-shredder:before{content:"\F49C"}.mdi-shuffle:before{content:"\F49D"}.mdi-shuffle-disabled:before{content:"\F49E"}.mdi-shuffle-variant:before{content:"\F49F"}.mdi-sigma:before{content:"\F4A0"}.mdi-sigma-lower:before{content:"\F62B"}.mdi-sign-caution:before{content:"\F4A1"}.mdi-sign-direction:before{content:"\F780"}.mdi-sign-text:before{content:"\F781"}.mdi-signal:before{content:"\F4A2"}.mdi-signal-2g:before{content:"\F711"}.mdi-signal-3g:before{content:"\F712"}.mdi-signal-4g:before{content:"\F713"}.mdi-signal-5g:before{content:"\FA6E"}.mdi-signal-cellular-1:before{content:"\F8BB"}.mdi-signal-cellular-2:before{content:"\F8BC"}.mdi-signal-cellular-3:before{content:"\F8BD"}.mdi-signal-cellular-outline:before{content:"\F8BE"}.mdi-signal-hspa:before{content:"\F714"}.mdi-signal-hspa-plus:before{content:"\F715"}.mdi-signal-off:before{content:"\F782"}.mdi-signal-variant:before{content:"\F60A"}.mdi-signature:before{content:"\FDD7"}.mdi-signature-freehand:before{content:"\FDD8"}.mdi-signature-image:before{content:"\FDD9"}.mdi-signature-text:before{content:"\FDDA"}.mdi-silo:before{content:"\FB24"}.mdi-silverware:before{content:"\F4A3"}.mdi-silverware-fork:before{content:"\F4A4"}.mdi-silverware-fork-knife:before{content:"\FA6F"}.mdi-silverware-spoon:before{content:"\F4A5"}.mdi-silverware-variant:before{content:"\F4A6"}.mdi-sim:before{content:"\F4A7"}.mdi-sim-alert:before{content:"\F4A8"}.mdi-sim-off:before{content:"\F4A9"}.mdi-sina-weibo:before{content:"\FADE"}.mdi-sitemap:before{content:"\F4AA"}.mdi-skate:before{content:"\FD11"}.mdi-skew-less:before{content:"\FD12"}.mdi-skew-more:before{content:"\FD13"}.mdi-skip-backward:before{content:"\F4AB"}.mdi-skip-forward:before{content:"\F4AC"}.mdi-skip-next:before{content:"\F4AD"}.mdi-skip-next-circle:before{content:"\F661"}.mdi-skip-next-circle-outline:before{content:"\F662"}.mdi-skip-previous:before{content:"\F4AE"}.mdi-skip-previous-circle:before{content:"\F663"}.mdi-skip-previous-circle-outline:before{content:"\F664"}.mdi-skull:before{content:"\F68B"}.mdi-skull-crossbones:before{content:"\FBA2"}.mdi-skull-crossbones-outline:before{content:"\FBA3"}.mdi-skull-outline:before{content:"\FBA4"}.mdi-skype:before{content:"\F4AF"}.mdi-skype-business:before{content:"\F4B0"}.mdi-slack:before{content:"\F4B1"}.mdi-slackware:before{content:"\F90A"}.mdi-sleep:before{content:"\F4B2"}.mdi-sleep-off:before{content:"\F4B3"}.mdi-slope-downhill:before{content:"\FDDB"}.mdi-slope-uphill:before{content:"\FDDC"}.mdi-smog:before{content:"\FA70"}.mdi-smoke-detector:before{content:"\F392"}.mdi-smoking:before{content:"\F4B4"}.mdi-smoking-off:before{content:"\F4B5"}.mdi-snapchat:before{content:"\F4B6"}.mdi-snowflake:before{content:"\F716"}.mdi-snowman:before{content:"\F4B7"}.mdi-soccer:before{content:"\F4B8"}.mdi-soccer-field:before{content:"\F833"}.mdi-sofa:before{content:"\F4B9"}.mdi-solar-panel:before{content:"\FD77"}.mdi-solar-panel-large:before{content:"\FD78"}.mdi-solar-power:before{content:"\FA71"}.mdi-solid:before{content:"\F68C"}.mdi-sort:before{content:"\F4BA"}.mdi-sort-alphabetical:before{content:"\F4BB"}.mdi-sort-ascending:before{content:"\F4BC"}.mdi-sort-descending:before{content:"\F4BD"}.mdi-sort-numeric:before{content:"\F4BE"}.mdi-sort-variant:before{content:"\F4BF"}.mdi-sort-variant-lock:before{content:"\FCA9"}.mdi-sort-variant-lock-open:before{content:"\FCAA"}.mdi-soundcloud:before{content:"\F4C0"}.mdi-source-branch:before{content:"\F62C"}.mdi-source-commit:before{content:"\F717"}.mdi-source-commit-end:before{content:"\F718"}.mdi-source-commit-end-local:before{content:"\F719"}.mdi-source-commit-local:before{content:"\F71A"}.mdi-source-commit-next-local:before{content:"\F71B"}.mdi-source-commit-start:before{content:"\F71C"}.mdi-source-commit-start-next-local:before{content:"\F71D"}.mdi-source-fork:before{content:"\F4C1"}.mdi-source-merge:before{content:"\F62D"}.mdi-source-pull:before{content:"\F4C2"}.mdi-source-repository:before{content:"\FCAB"}.mdi-source-repository-multiple:before{content:"\FCAC"}.mdi-soy-sauce:before{content:"\F7ED"}.mdi-spa:before{content:"\FCAD"}.mdi-spa-outline:before{content:"\FCAE"}.mdi-space-invaders:before{content:"\FBA5"}.mdi-speaker:before{content:"\F4C3"}.mdi-speaker-bluetooth:before{content:"\F9A1"}.mdi-speaker-multiple:before{content:"\FD14"}.mdi-speaker-off:before{content:"\F4C4"}.mdi-speaker-wireless:before{content:"\F71E"}.mdi-speedometer:before{content:"\F4C5"}.mdi-spellcheck:before{content:"\F4C6"}.mdi-spider-web:before{content:"\FBA6"}.mdi-spotify:before{content:"\F4C7"}.mdi-spotlight:before{content:"\F4C8"}.mdi-spotlight-beam:before{content:"\F4C9"}.mdi-spray:before{content:"\F665"}.mdi-spray-bottle:before{content:"\FADF"}.mdi-square:before{content:"\F763"}.mdi-square-edit-outline:before{content:"\F90B"}.mdi-square-inc:before{content:"\F4CA"}.mdi-square-inc-cash:before{content:"\F4CB"}.mdi-square-medium:before{content:"\FA12"}.mdi-square-medium-outline:before{content:"\FA13"}.mdi-square-outline:before{content:"\F762"}.mdi-square-root:before{content:"\F783"}.mdi-square-root-box:before{content:"\F9A2"}.mdi-square-small:before{content:"\FA14"}.mdi-squeegee:before{content:"\FAE0"}.mdi-ssh:before{content:"\F8BF"}.mdi-stack-exchange:before{content:"\F60B"}.mdi-stack-overflow:before{content:"\F4CC"}.mdi-stadium:before{content:"\F71F"}.mdi-stairs:before{content:"\F4CD"}.mdi-stamper:before{content:"\FD15"}.mdi-standard-definition:before{content:"\F7EE"}.mdi-star:before{content:"\F4CE"}.mdi-star-box:before{content:"\FA72"}.mdi-star-box-outline:before{content:"\FA73"}.mdi-star-circle:before{content:"\F4CF"}.mdi-star-circle-outline:before{content:"\F9A3"}.mdi-star-face:before{content:"\F9A4"}.mdi-star-four-points:before{content:"\FAE1"}.mdi-star-four-points-outline:before{content:"\FAE2"}.mdi-star-half:before{content:"\F4D0"}.mdi-star-off:before{content:"\F4D1"}.mdi-star-outline:before{content:"\F4D2"}.mdi-star-three-points:before{content:"\FAE3"}.mdi-star-three-points-outline:before{content:"\FAE4"}.mdi-steam:before{content:"\F4D3"}.mdi-steam-box:before{content:"\F90C"}.mdi-steering:before{content:"\F4D4"}.mdi-steering-off:before{content:"\F90D"}.mdi-step-backward:before{content:"\F4D5"}.mdi-step-backward-2:before{content:"\F4D6"}.mdi-step-forward:before{content:"\F4D7"}.mdi-step-forward-2:before{content:"\F4D8"}.mdi-stethoscope:before{content:"\F4D9"}.mdi-sticker:before{content:"\F5D0"}.mdi-sticker-emoji:before{content:"\F784"}.mdi-stocking:before{content:"\F4DA"}.mdi-stop:before{content:"\F4DB"}.mdi-stop-circle:before{content:"\F666"}.mdi-stop-circle-outline:before{content:"\F667"}.mdi-store:before{content:"\F4DC"}.mdi-store-24-hour:before{content:"\F4DD"}.mdi-stove:before{content:"\F4DE"}.mdi-strava:before{content:"\FB25"}.mdi-subdirectory-arrow-left:before{content:"\F60C"}.mdi-subdirectory-arrow-right:before{content:"\F60D"}.mdi-subtitles:before{content:"\FA15"}.mdi-subtitles-outline:before{content:"\FA16"}.mdi-subway:before{content:"\F6AB"}.mdi-subway-alert-variant:before{content:"\FD79"}.mdi-subway-variant:before{content:"\F4DF"}.mdi-summit:before{content:"\F785"}.mdi-sunglasses:before{content:"\F4E0"}.mdi-surround-sound:before{content:"\F5C5"}.mdi-surround-sound-2-0:before{content:"\F7EF"}.mdi-surround-sound-3-1:before{content:"\F7F0"}.mdi-surround-sound-5-1:before{content:"\F7F1"}.mdi-surround-sound-7-1:before{content:"\F7F2"}.mdi-svg:before{content:"\F720"}.mdi-swap-horizontal:before{content:"\F4E1"}.mdi-swap-horizontal-bold:before{content:"\FBA9"}.mdi-swap-horizontal-variant:before{content:"\F8C0"}.mdi-swap-vertical:before{content:"\F4E2"}.mdi-swap-vertical-bold:before{content:"\FBAA"}.mdi-swap-vertical-variant:before{content:"\F8C1"}.mdi-swim:before{content:"\F4E3"}.mdi-switch:before{content:"\F4E4"}.mdi-sword:before{content:"\F4E5"}.mdi-sword-cross:before{content:"\F786"}.mdi-symfony:before{content:"\FAE5"}.mdi-sync:before{content:"\F4E6"}.mdi-sync-alert:before{content:"\F4E7"}.mdi-sync-off:before{content:"\F4E8"}.mdi-tab:before{content:"\F4E9"}.mdi-tab-minus:before{content:"\FB26"}.mdi-tab-plus:before{content:"\F75B"}.mdi-tab-remove:before{content:"\FB27"}.mdi-tab-unselected:before{content:"\F4EA"}.mdi-table:before{content:"\F4EB"}.mdi-table-border:before{content:"\FA17"}.mdi-table-column:before{content:"\F834"}.mdi-table-column-plus-after:before{content:"\F4EC"}.mdi-table-column-plus-before:before{content:"\F4ED"}.mdi-table-column-remove:before{content:"\F4EE"}.mdi-table-column-width:before{content:"\F4EF"}.mdi-table-edit:before{content:"\F4F0"}.mdi-table-large:before{content:"\F4F1"}.mdi-table-merge-cells:before{content:"\F9A5"}.mdi-table-of-contents:before{content:"\F835"}.mdi-table-plus:before{content:"\FA74"}.mdi-table-remove:before{content:"\FA75"}.mdi-table-row:before{content:"\F836"}.mdi-table-row-height:before{content:"\F4F2"}.mdi-table-row-plus-after:before{content:"\F4F3"}.mdi-table-row-plus-before:before{content:"\F4F4"}.mdi-table-row-remove:before{content:"\F4F5"}.mdi-table-search:before{content:"\F90E"}.mdi-table-settings:before{content:"\F837"}.mdi-tablet:before{content:"\F4F6"}.mdi-tablet-android:before{content:"\F4F7"}.mdi-tablet-cellphone:before{content:"\F9A6"}.mdi-tablet-ipad:before{content:"\F4F8"}.mdi-taco:before{content:"\F761"}.mdi-tag:before{content:"\F4F9"}.mdi-tag-faces:before{content:"\F4FA"}.mdi-tag-heart:before{content:"\F68A"}.mdi-tag-heart-outline:before{content:"\FBAB"}.mdi-tag-minus:before{content:"\F90F"}.mdi-tag-multiple:before{content:"\F4FB"}.mdi-tag-outline:before{content:"\F4FC"}.mdi-tag-plus:before{content:"\F721"}.mdi-tag-remove:before{content:"\F722"}.mdi-tag-text-outline:before{content:"\F4FD"}.mdi-tank:before{content:"\FD16"}.mdi-tape-measure:before{content:"\FB28"}.mdi-target:before{content:"\F4FE"}.mdi-target-account:before{content:"\FBAC"}.mdi-target-variant:before{content:"\FA76"}.mdi-taxi:before{content:"\F4FF"}.mdi-tea:before{content:"\FD7A"}.mdi-tea-outline:before{content:"\FD7B"}.mdi-teach:before{content:"\F88F"}.mdi-teamviewer:before{content:"\F500"}.mdi-telegram:before{content:"\F501"}.mdi-telescope:before{content:"\FB29"}.mdi-television:before{content:"\F502"}.mdi-television-box:before{content:"\F838"}.mdi-television-classic:before{content:"\F7F3"}.mdi-television-classic-off:before{content:"\F839"}.mdi-television-guide:before{content:"\F503"}.mdi-television-off:before{content:"\F83A"}.mdi-temperature-celsius:before{content:"\F504"}.mdi-temperature-fahrenheit:before{content:"\F505"}.mdi-temperature-kelvin:before{content:"\F506"}.mdi-tennis:before{content:"\FD7C"}.mdi-tennis-ball:before{content:"\F507"}.mdi-tent:before{content:"\F508"}.mdi-terrain:before{content:"\F509"}.mdi-test-tube:before{content:"\F668"}.mdi-test-tube-empty:before{content:"\F910"}.mdi-test-tube-off:before{content:"\F911"}.mdi-text:before{content:"\F9A7"}.mdi-text-shadow:before{content:"\F669"}.mdi-text-short:before{content:"\F9A8"}.mdi-text-subject:before{content:"\F9A9"}.mdi-text-to-speech:before{content:"\F50A"}.mdi-text-to-speech-off:before{content:"\F50B"}.mdi-textbox:before{content:"\F60E"}.mdi-textbox-password:before{content:"\F7F4"}.mdi-texture:before{content:"\F50C"}.mdi-theater:before{content:"\F50D"}.mdi-theme-light-dark:before{content:"\F50E"}.mdi-thermometer:before{content:"\F50F"}.mdi-thermometer-alert:before{content:"\FDDD"}.mdi-thermometer-chevron-down:before{content:"\FDDE"}.mdi-thermometer-chevron-up:before{content:"\FDDF"}.mdi-thermometer-lines:before{content:"\F510"}.mdi-thermometer-minus:before{content:"\FDE0"}.mdi-thermometer-plus:before{content:"\FDE1"}.mdi-thermostat:before{content:"\F393"}.mdi-thermostat-box:before{content:"\F890"}.mdi-thought-bubble:before{content:"\F7F5"}.mdi-thought-bubble-outline:before{content:"\F7F6"}.mdi-thumb-down:before{content:"\F511"}.mdi-thumb-down-outline:before{content:"\F512"}.mdi-thumb-up:before{content:"\F513"}.mdi-thumb-up-outline:before{content:"\F514"}.mdi-thumbs-up-down:before{content:"\F515"}.mdi-ticket:before{content:"\F516"}.mdi-ticket-account:before{content:"\F517"}.mdi-ticket-confirmation:before{content:"\F518"}.mdi-ticket-outline:before{content:"\F912"}.mdi-ticket-percent:before{content:"\F723"}.mdi-tie:before{content:"\F519"}.mdi-tilde:before{content:"\F724"}.mdi-timelapse:before{content:"\F51A"}.mdi-timeline:before{content:"\FBAD"}.mdi-timeline-outline:before{content:"\FBAE"}.mdi-timeline-text:before{content:"\FBAF"}.mdi-timeline-text-outline:before{content:"\FBB0"}.mdi-timer:before{content:"\F51B"}.mdi-timer-10:before{content:"\F51C"}.mdi-timer-3:before{content:"\F51D"}.mdi-timer-off:before{content:"\F51E"}.mdi-timer-sand:before{content:"\F51F"}.mdi-timer-sand-empty:before{content:"\F6AC"}.mdi-timer-sand-full:before{content:"\F78B"}.mdi-timetable:before{content:"\F520"}.mdi-toaster-oven:before{content:"\FCAF"}.mdi-toggle-switch:before{content:"\F521"}.mdi-toggle-switch-off:before{content:"\F522"}.mdi-toggle-switch-off-outline:before{content:"\FA18"}.mdi-toggle-switch-outline:before{content:"\FA19"}.mdi-toilet:before{content:"\F9AA"}.mdi-toolbox:before{content:"\F9AB"}.mdi-toolbox-outline:before{content:"\F9AC"}.mdi-tooltip:before{content:"\F523"}.mdi-tooltip-account:before{content:"\F00C"}.mdi-tooltip-edit:before{content:"\F524"}.mdi-tooltip-image:before{content:"\F525"}.mdi-tooltip-image-outline:before{content:"\FBB1"}.mdi-tooltip-outline:before{content:"\F526"}.mdi-tooltip-plus:before{content:"\FBB2"}.mdi-tooltip-plus-outline:before{content:"\F527"}.mdi-tooltip-text:before{content:"\F528"}.mdi-tooltip-text-outline:before{content:"\FBB3"}.mdi-tooth:before{content:"\F8C2"}.mdi-tooth-outline:before{content:"\F529"}.mdi-tor:before{content:"\F52A"}.mdi-tortoise:before{content:"\FD17"}.mdi-tournament:before{content:"\F9AD"}.mdi-tower-beach:before{content:"\F680"}.mdi-tower-fire:before{content:"\F681"}.mdi-towing:before{content:"\F83B"}.mdi-track-light:before{content:"\F913"}.mdi-trackpad:before{content:"\F7F7"}.mdi-trackpad-lock:before{content:"\F932"}.mdi-tractor:before{content:"\F891"}.mdi-trademark:before{content:"\FA77"}.mdi-traffic-light:before{content:"\F52B"}.mdi-train:before{content:"\F52C"}.mdi-train-car:before{content:"\FBB4"}.mdi-train-variant:before{content:"\F8C3"}.mdi-tram:before{content:"\F52D"}.mdi-transcribe:before{content:"\F52E"}.mdi-transcribe-close:before{content:"\F52F"}.mdi-transfer-down:before{content:"\FD7D"}.mdi-transfer-left:before{content:"\FD7E"}.mdi-transfer-right:before{content:"\F530"}.mdi-transfer-up:before{content:"\FD7F"}.mdi-transit-connection:before{content:"\FD18"}.mdi-transit-connection-variant:before{content:"\FD19"}.mdi-transit-transfer:before{content:"\F6AD"}.mdi-transition:before{content:"\F914"}.mdi-transition-masked:before{content:"\F915"}.mdi-translate:before{content:"\F5CA"}.mdi-translate-off:before{content:"\FDE2"}.mdi-transmission-tower:before{content:"\FD1A"}.mdi-trash-can:before{content:"\FA78"}.mdi-trash-can-outline:before{content:"\FA79"}.mdi-treasure-chest:before{content:"\F725"}.mdi-tree:before{content:"\F531"}.mdi-trello:before{content:"\F532"}.mdi-trending-down:before{content:"\F533"}.mdi-trending-neutral:before{content:"\F534"}.mdi-trending-up:before{content:"\F535"}.mdi-triangle:before{content:"\F536"}.mdi-triangle-outline:before{content:"\F537"}.mdi-triforce:before{content:"\FBB5"}.mdi-trophy:before{content:"\F538"}.mdi-trophy-award:before{content:"\F539"}.mdi-trophy-broken:before{content:"\FD80"}.mdi-trophy-outline:before{content:"\F53A"}.mdi-trophy-variant:before{content:"\F53B"}.mdi-trophy-variant-outline:before{content:"\F53C"}.mdi-truck:before{content:"\F53D"}.mdi-truck-check:before{content:"\FCB0"}.mdi-truck-delivery:before{content:"\F53E"}.mdi-truck-fast:before{content:"\F787"}.mdi-truck-trailer:before{content:"\F726"}.mdi-tshirt-crew:before{content:"\FA7A"}.mdi-tshirt-crew-outline:before{content:"\F53F"}.mdi-tshirt-v:before{content:"\FA7B"}.mdi-tshirt-v-outline:before{content:"\F540"}.mdi-tumble-dryer:before{content:"\F916"}.mdi-tumblr:before{content:"\F541"}.mdi-tumblr-box:before{content:"\F917"}.mdi-tumblr-reblog:before{content:"\F542"}.mdi-tune:before{content:"\F62E"}.mdi-tune-vertical:before{content:"\F66A"}.mdi-turnstile:before{content:"\FCB1"}.mdi-turnstile-outline:before{content:"\FCB2"}.mdi-turtle:before{content:"\FCB3"}.mdi-twitch:before{content:"\F543"}.mdi-twitter:before{content:"\F544"}.mdi-twitter-box:before{content:"\F545"}.mdi-twitter-circle:before{content:"\F546"}.mdi-twitter-retweet:before{content:"\F547"}.mdi-two-factor-authentication:before{content:"\F9AE"}.mdi-uber:before{content:"\F748"}.mdi-ubisoft:before{content:"\FBB6"}.mdi-ubuntu:before{content:"\F548"}.mdi-ultra-high-definition:before{content:"\F7F8"}.mdi-umbraco:before{content:"\F549"}.mdi-umbrella:before{content:"\F54A"}.mdi-umbrella-closed:before{content:"\F9AF"}.mdi-umbrella-outline:before{content:"\F54B"}.mdi-undo:before{content:"\F54C"}.mdi-undo-variant:before{content:"\F54D"}.mdi-unfold-less-horizontal:before{content:"\F54E"}.mdi-unfold-less-vertical:before{content:"\F75F"}.mdi-unfold-more-horizontal:before{content:"\F54F"}.mdi-unfold-more-vertical:before{content:"\F760"}.mdi-ungroup:before{content:"\F550"}.mdi-unity:before{content:"\F6AE"}.mdi-unreal:before{content:"\F9B0"}.mdi-untappd:before{content:"\F551"}.mdi-update:before{content:"\F6AF"}.mdi-upload:before{content:"\F552"}.mdi-upload-multiple:before{content:"\F83C"}.mdi-upload-network:before{content:"\F6F5"}.mdi-upload-network-outline:before{content:"\FCB4"}.mdi-upload-outline:before{content:"\FDE3"}.mdi-usb:before{content:"\F553"}.mdi-van-passenger:before{content:"\F7F9"}.mdi-van-utility:before{content:"\F7FA"}.mdi-vanish:before{content:"\F7FB"}.mdi-variable:before{content:"\FAE6"}.mdi-vector-arrange-above:before{content:"\F554"}.mdi-vector-arrange-below:before{content:"\F555"}.mdi-vector-bezier:before{content:"\FAE7"}.mdi-vector-circle:before{content:"\F556"}.mdi-vector-circle-variant:before{content:"\F557"}.mdi-vector-combine:before{content:"\F558"}.mdi-vector-curve:before{content:"\F559"}.mdi-vector-difference:before{content:"\F55A"}.mdi-vector-difference-ab:before{content:"\F55B"}.mdi-vector-difference-ba:before{content:"\F55C"}.mdi-vector-ellipse:before{content:"\F892"}.mdi-vector-intersection:before{content:"\F55D"}.mdi-vector-line:before{content:"\F55E"}.mdi-vector-point:before{content:"\F55F"}.mdi-vector-polygon:before{content:"\F560"}.mdi-vector-polyline:before{content:"\F561"}.mdi-vector-radius:before{content:"\F749"}.mdi-vector-rectangle:before{content:"\F5C6"}.mdi-vector-selection:before{content:"\F562"}.mdi-vector-square:before{content:"\F001"}.mdi-vector-triangle:before{content:"\F563"}.mdi-vector-union:before{content:"\F564"}.mdi-venmo:before{content:"\F578"}.mdi-vhs:before{content:"\FA1A"}.mdi-vibrate:before{content:"\F566"}.mdi-vibrate-off:before{content:"\FCB5"}.mdi-video:before{content:"\F567"}.mdi-video-3d:before{content:"\F7FC"}.mdi-video-4k-box:before{content:"\F83D"}.mdi-video-account:before{content:"\F918"}.mdi-video-image:before{content:"\F919"}.mdi-video-input-antenna:before{content:"\F83E"}.mdi-video-input-component:before{content:"\F83F"}.mdi-video-input-hdmi:before{content:"\F840"}.mdi-video-input-svideo:before{content:"\F841"}.mdi-video-minus:before{content:"\F9B1"}.mdi-video-off:before{content:"\F568"}.mdi-video-off-outline:before{content:"\FBB7"}.mdi-video-outline:before{content:"\FBB8"}.mdi-video-plus:before{content:"\F9B2"}.mdi-video-stabilization:before{content:"\F91A"}.mdi-video-switch:before{content:"\F569"}.mdi-video-vintage:before{content:"\FA1B"}.mdi-view-agenda:before{content:"\F56A"}.mdi-view-array:before{content:"\F56B"}.mdi-view-carousel:before{content:"\F56C"}.mdi-view-column:before{content:"\F56D"}.mdi-view-dashboard:before{content:"\F56E"}.mdi-view-dashboard-outline:before{content:"\FA1C"}.mdi-view-dashboard-variant:before{content:"\F842"}.mdi-view-day:before{content:"\F56F"}.mdi-view-grid:before{content:"\F570"}.mdi-view-headline:before{content:"\F571"}.mdi-view-list:before{content:"\F572"}.mdi-view-module:before{content:"\F573"}.mdi-view-parallel:before{content:"\F727"}.mdi-view-quilt:before{content:"\F574"}.mdi-view-sequential:before{content:"\F728"}.mdi-view-split-horizontal:before{content:"\FBA7"}.mdi-view-split-vertical:before{content:"\FBA8"}.mdi-view-stream:before{content:"\F575"}.mdi-view-week:before{content:"\F576"}.mdi-vimeo:before{content:"\F577"}.mdi-violin:before{content:"\F60F"}.mdi-virtual-reality:before{content:"\F893"}.mdi-visual-studio:before{content:"\F610"}.mdi-visual-studio-code:before{content:"\FA1D"}.mdi-vk:before{content:"\F579"}.mdi-vk-box:before{content:"\F57A"}.mdi-vk-circle:before{content:"\F57B"}.mdi-vlc:before{content:"\F57C"}.mdi-voice:before{content:"\F5CB"}.mdi-voicemail:before{content:"\F57D"}.mdi-volleyball:before{content:"\F9B3"}.mdi-volume-high:before{content:"\F57E"}.mdi-volume-low:before{content:"\F57F"}.mdi-volume-medium:before{content:"\F580"}.mdi-volume-minus:before{content:"\F75D"}.mdi-volume-mute:before{content:"\F75E"}.mdi-volume-off:before{content:"\F581"}.mdi-volume-plus:before{content:"\F75C"}.mdi-volume-variant-off:before{content:"\FDE4"}.mdi-vote:before{content:"\FA1E"}.mdi-vote-outline:before{content:"\FA1F"}.mdi-vpn:before{content:"\F582"}.mdi-vuejs:before{content:"\F843"}.mdi-walk:before{content:"\F583"}.mdi-wall:before{content:"\F7FD"}.mdi-wall-sconce:before{content:"\F91B"}.mdi-wall-sconce-flat:before{content:"\F91C"}.mdi-wall-sconce-variant:before{content:"\F91D"}.mdi-wallet:before{content:"\F584"}.mdi-wallet-giftcard:before{content:"\F585"}.mdi-wallet-membership:before{content:"\F586"}.mdi-wallet-outline:before{content:"\FBB9"}.mdi-wallet-travel:before{content:"\F587"}.mdi-wallpaper:before{content:"\FDE5"}.mdi-wan:before{content:"\F588"}.mdi-washing-machine:before{content:"\F729"}.mdi-watch:before{content:"\F589"}.mdi-watch-export:before{content:"\F58A"}.mdi-watch-export-variant:before{content:"\F894"}.mdi-watch-import:before{content:"\F58B"}.mdi-watch-import-variant:before{content:"\F895"}.mdi-watch-variant:before{content:"\F896"}.mdi-watch-vibrate:before{content:"\F6B0"}.mdi-watch-vibrate-off:before{content:"\FCB6"}.mdi-water:before{content:"\F58C"}.mdi-water-off:before{content:"\F58D"}.mdi-water-outline:before{content:"\FDE6"}.mdi-water-percent:before{content:"\F58E"}.mdi-water-pump:before{content:"\F58F"}.mdi-watermark:before{content:"\F612"}.mdi-waves:before{content:"\F78C"}.mdi-waze:before{content:"\FBBA"}.mdi-weather-cloudy:before{content:"\F590"}.mdi-weather-fog:before{content:"\F591"}.mdi-weather-hail:before{content:"\F592"}.mdi-weather-hurricane:before{content:"\F897"}.mdi-weather-lightning:before{content:"\F593"}.mdi-weather-lightning-rainy:before{content:"\F67D"}.mdi-weather-night:before{content:"\F594"}.mdi-weather-partlycloudy:before{content:"\F595"}.mdi-weather-pouring:before{content:"\F596"}.mdi-weather-rainy:before{content:"\F597"}.mdi-weather-snowy:before{content:"\F598"}.mdi-weather-snowy-rainy:before{content:"\F67E"}.mdi-weather-sunny:before{content:"\F599"}.mdi-weather-sunset:before{content:"\F59A"}.mdi-weather-sunset-down:before{content:"\F59B"}.mdi-weather-sunset-up:before{content:"\F59C"}.mdi-weather-windy:before{content:"\F59D"}.mdi-weather-windy-variant:before{content:"\F59E"}.mdi-web:before{content:"\F59F"}.mdi-webcam:before{content:"\F5A0"}.mdi-webhook:before{content:"\F62F"}.mdi-webpack:before{content:"\F72A"}.mdi-wechat:before{content:"\F611"}.mdi-weight:before{content:"\F5A1"}.mdi-weight-gram:before{content:"\FD1B"}.mdi-weight-kilogram:before{content:"\F5A2"}.mdi-weight-pound:before{content:"\F9B4"}.mdi-whatsapp:before{content:"\F5A3"}.mdi-wheelchair-accessibility:before{content:"\F5A4"}.mdi-whistle:before{content:"\F9B5"}.mdi-white-balance-auto:before{content:"\F5A5"}.mdi-white-balance-incandescent:before{content:"\F5A6"}.mdi-white-balance-iridescent:before{content:"\F5A7"}.mdi-white-balance-sunny:before{content:"\F5A8"}.mdi-widgets:before{content:"\F72B"}.mdi-wifi:before{content:"\F5A9"}.mdi-wifi-off:before{content:"\F5AA"}.mdi-wifi-star:before{content:"\FDE7"}.mdi-wifi-strength-1:before{content:"\F91E"}.mdi-wifi-strength-1-alert:before{content:"\F91F"}.mdi-wifi-strength-1-lock:before{content:"\F920"}.mdi-wifi-strength-2:before{content:"\F921"}.mdi-wifi-strength-2-alert:before{content:"\F922"}.mdi-wifi-strength-2-lock:before{content:"\F923"}.mdi-wifi-strength-3:before{content:"\F924"}.mdi-wifi-strength-3-alert:before{content:"\F925"}.mdi-wifi-strength-3-lock:before{content:"\F926"}.mdi-wifi-strength-4:before{content:"\F927"}.mdi-wifi-strength-4-alert:before{content:"\F928"}.mdi-wifi-strength-4-lock:before{content:"\F929"}.mdi-wifi-strength-alert-outline:before{content:"\F92A"}.mdi-wifi-strength-lock-outline:before{content:"\F92B"}.mdi-wifi-strength-off:before{content:"\F92C"}.mdi-wifi-strength-off-outline:before{content:"\F92D"}.mdi-wifi-strength-outline:before{content:"\F92E"}.mdi-wii:before{content:"\F5AB"}.mdi-wiiu:before{content:"\F72C"}.mdi-wikipedia:before{content:"\F5AC"}.mdi-wind-turbine:before{content:"\FD81"}.mdi-window-close:before{content:"\F5AD"}.mdi-window-closed:before{content:"\F5AE"}.mdi-window-maximize:before{content:"\F5AF"}.mdi-window-minimize:before{content:"\F5B0"}.mdi-window-open:before{content:"\F5B1"}.mdi-window-restore:before{content:"\F5B2"}.mdi-windows:before{content:"\F5B3"}.mdi-windows-classic:before{content:"\FA20"}.mdi-wiper:before{content:"\FAE8"}.mdi-wiper-wash:before{content:"\FD82"}.mdi-wordpress:before{content:"\F5B4"}.mdi-worker:before{content:"\F5B5"}.mdi-wrap:before{content:"\F5B6"}.mdi-wrap-disabled:before{content:"\FBBB"}.mdi-wrench:before{content:"\F5B7"}.mdi-wrench-outline:before{content:"\FBBC"}.mdi-wunderlist:before{content:"\F5B8"}.mdi-xamarin:before{content:"\F844"}.mdi-xamarin-outline:before{content:"\F845"}.mdi-xaml:before{content:"\F673"}.mdi-xbox:before{content:"\F5B9"}.mdi-xbox-controller:before{content:"\F5BA"}.mdi-xbox-controller-battery-alert:before{content:"\F74A"}.mdi-xbox-controller-battery-charging:before{content:"\FA21"}.mdi-xbox-controller-battery-empty:before{content:"\F74B"}.mdi-xbox-controller-battery-full:before{content:"\F74C"}.mdi-xbox-controller-battery-low:before{content:"\F74D"}.mdi-xbox-controller-battery-medium:before{content:"\F74E"}.mdi-xbox-controller-battery-unknown:before{content:"\F74F"}.mdi-xbox-controller-off:before{content:"\F5BB"}.mdi-xda:before{content:"\F5BC"}.mdi-xing:before{content:"\F5BD"}.mdi-xing-box:before{content:"\F5BE"}.mdi-xing-circle:before{content:"\F5BF"}.mdi-xml:before{content:"\F5C0"}.mdi-xmpp:before{content:"\F7FE"}.mdi-yahoo:before{content:"\FB2A"}.mdi-yammer:before{content:"\F788"}.mdi-yeast:before{content:"\F5C1"}.mdi-yelp:before{content:"\F5C2"}.mdi-yin-yang:before{content:"\F67F"}.mdi-youtube:before{content:"\F5C3"}.mdi-youtube-creator-studio:before{content:"\F846"}.mdi-youtube-gaming:before{content:"\F847"}.mdi-youtube-subscription:before{content:"\FD1C"}.mdi-youtube-tv:before{content:"\F448"}.mdi-z-wave:before{content:"\FAE9"}.mdi-zend:before{content:"\FAEA"}.mdi-zigbee:before{content:"\FD1D"}.mdi-zip-box:before{content:"\F5C4"}.mdi-zip-disk:before{content:"\FA22"}.mdi-zodiac-aquarius:before{content:"\FA7C"}.mdi-zodiac-aries:before{content:"\FA7D"}.mdi-zodiac-cancer:before{content:"\FA7E"}.mdi-zodiac-capricorn:before{content:"\FA7F"}.mdi-zodiac-gemini:before{content:"\FA80"}.mdi-zodiac-leo:before{content:"\FA81"}.mdi-zodiac-libra:before{content:"\FA82"}.mdi-zodiac-pisces:before{content:"\FA83"}.mdi-zodiac-sagittarius:before{content:"\FA84"}.mdi-zodiac-scorpio:before{content:"\FA85"}.mdi-zodiac-taurus:before{content:"\FA86"}.mdi-zodiac-virgo:before{content:"\FA87"}.mdi-blank:before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,0.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,0.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,0.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} +/*# sourceMappingURL=materialdesignicons.min.css.map */ diff --git a/community_server/webroot/css/normalize.css b/community_server/webroot/css/normalize.css new file mode 100644 index 000000000..b0c1902dc --- /dev/null +++ b/community_server/webroot/css/normalize.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} \ No newline at end of file diff --git a/community_server/webroot/css/rippleUI/style.css b/community_server/webroot/css/rippleUI/style.css new file mode 100644 index 000000000..8ba93da24 --- /dev/null +++ b/community_server/webroot/css/rippleUI/style.css @@ -0,0 +1,14705 @@ +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0 + } + + to { + opacity: 1 + } + +} + +@keyframes fadeIn { + from { + opacity: 0 + } + + to { + opacity: 1 + } + +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none + } + +} + +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none + } + +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown +} + +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + +} + +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp +} + +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + + 50% { + opacity: 1 + } + +} + +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + + 50% { + opacity: 1 + } + +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn +} + +@keyframes bounceIn { + 20%, + 40%, + 60%, + 80%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + + 20% { + -webkit-transform: scale3d(1.4, 1.4, 1.4); + transform: scale3d(1.4, 1.4, 1.4) + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9) + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03) + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97) + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } + +} + +@-webkit-keyframes rotate360 { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + -webkit-transform-origin: center; + transform-origin: center + } + +} + +@keyframes rotate360 { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + -webkit-transform-origin: center; + transform-origin: center + } + +} + +@-webkit-keyframes bounceIn { + 20%, + 40%, + 60%, + 80%, + from, + to { + -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); + animation-timing-function: cubic-bezier(.215, .61, .355, 1) + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3) + } + + 20% { + -webkit-transform: scale3d(1.4, 1.4, 1.4); + transform: scale3d(1.4, 1.4, 1.4) + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9) + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03) + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97) + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1) + } + +} + +@-webkit-keyframes ripple { + 0%, + 35% { + -webkit-transform: scale(0); + transform: scale(0); + opacity: 1 + } + + 50% { + -webkit-transform: scale(.6); + transform: scale(.6); + opacity: .8 + } + + 100% { + opacity: 0; + -webkit-transform: scale(1.2); + transform: scale(1.2) + } + +} + +@keyframes ripple { + 0%, + 35% { + -webkit-transform: scale(0); + transform: scale(0); + opacity: 1 + } + + 50% { + -webkit-transform: scale(.6); + transform: scale(.6); + opacity: .8 + } + + 100% { + opacity: 0; + -webkit-transform: scale(1.2); + transform: scale(1.2) + } + +} + +@font-face { + font-family: Roboto; + src: url(../../fonts/Roboto/Roboto-Thin.ttf); + font-weight: 100 +} + +@font-face { + font-family: Roboto; + src: url(../../fonts/Roboto/Roboto-Light.ttf); + font-weight: 300 +} + +@font-face { + font-family: Roboto; + src: url(../../fonts/Roboto/Roboto-Regular.ttf); + font-weight: 400 +} + +@font-face { + font-family: Roboto; + src: url(../../fonts/Roboto/Roboto-Medium.ttf); + font-weight: 500 +} + +@font-face { + font-family: Roboto; + src: url(../../fonts/Roboto/Roboto-Bold.ttf); + font-weight: 700 +} + +.bg-inverse-primary { + background: rgba(4, 112, 6, .2) +} + +.bg-inverse-secondary { + background: rgba(128, 128, 128, .2) +} + +.bg-inverse-success { + background: rgba(0, 224, 147, .2) +} + +.bg-inverse-info { + background: rgba(108, 97, 246, .2) +} + +.bg-inverse-warning { + background: rgba(240, 130, 95, .2) +} + +.bg-inverse-danger { + background: rgba(255, 95, 102, .2) +} + +.bg-inverse-light { + background: rgba(223, 223, 223, .2) +} + +.bg-inverse-dark { + background: rgba(116, 118, 123, .2) +} + +.bg-inverse-white { + background: rgba(255, 255, 255, .2) +} + +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #fd7e14; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --primary: #047006; + --secondary: grey; + --success: #047006; + --info: #6c61f6; + --warning: #f0825f; + --danger: #ff5f66; + --light: #dfdfdf; + --dark: #74767b; + --white: #fff; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace +} + +*, +::after, +::before { + box-sizing: border-box +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) +} + +article, +aside, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section { + display: block +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.7; + color: #212529; + text-align: left; + background-color: #fff +} + +[tabindex="-1"]:focus { + outline: 0 !important +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: .5rem +} + +p { + margin-top: 0; + margin-bottom: 1rem +} + +abbr[data-original-title], +abbr[title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit +} + +dl, +ol, +ul { + margin-top: 0; + margin-bottom: 1rem +} + +ol ol, +ol ul, +ul ol, +ul ul { + margin-bottom: 0 +} + +dt { + font-weight: 700 +} + +dd { + margin-bottom: .5rem; + margin-left: 0 +} + +blockquote { + margin: 0 0 1rem +} + +b, +strong { + font-weight: bolder +} + +small { + font-size: 80% +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +a { + color: #047006; + text-decoration: none; + background-color: transparent +} + +a:hover { + color: #012602; + text-decoration: underline +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none +} + +a:not([href]):not([tabindex]):focus, +a:not([href]):not([tabindex]):hover { + color: inherit; + text-decoration: none +} + +a:not([href]):not([tabindex]):focus { + outline: 0 +} + +code, +kbd, +pre, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto +} + +figure { + margin: 0 0 1rem +} + +img { + vertical-align: middle; + border-style: none +} + +svg { + overflow: hidden; + vertical-align: middle +} + +table { + border-collapse: collapse +} + +caption { + padding-top: 10px 15px; + padding-bottom: 10px 15px; + color: #6c757d; + text-align: left; + caption-side: bottom +} + +th { + text-align: inherit +} + +label { + display: inline-block; + margin-bottom: .5rem +} + +button { + border-radius: 0 +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color +} + +button, +input, +optgroup, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +select { + word-wrap: normal +} + +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button +} + +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled), +button:not(:disabled) { + cursor: pointer +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + padding: 0; + border-style: none +} + +input[type=checkbox], +input[type=radio] { + box-sizing: border-box; + padding: 0 +} + +input[type=date], +input[type=datetime-local], +input[type=month], +input[type=time] { + -webkit-appearance: listbox +} + +textarea { + overflow: auto; + resize: vertical +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0 +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal +} + +progress { + vertical-align: baseline +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: none +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button +} + +output { + display: inline-block +} + +summary { + display: list-item; + cursor: pointer +} + +template { + display: none +} + +[hidden] { + display: none !important +} + +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + margin-bottom: .5rem; + font-weight: 500; + line-height: 1.2 +} + +.h1, +h1 { + font-size: 2.5rem +} + +.h2, +h2 { + font-size: 2rem +} + +.h3, +h3 { + font-size: 1.75rem +} + +.h4, +h4 { + font-size: 1.5rem +} + +.h5, +h5 { + font-size: 1.25rem +} + +.h6, +h6 { + font-size: 1rem +} + +.lead { + font-size: 1.25rem; + font-weight: 300 +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2 +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2 +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2 +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2 +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, .1) +} + +.small, +small { + font-size: 80%; + font-weight: 400 +} + +.mark, +mark { + padding: .2em; + background-color: #fcf8e3 +} + +.list-unstyled { + padding-left: 0; + list-style: none +} + +.list-inline { + padding-left: 0; + list-style: none +} + +.list-inline-item { + display: inline-block +} + +.list-inline-item:not(:last-child) { + margin-right: .5rem +} + +.initialism { + font-size: 90%; + text-transform: uppercase +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d +} + +.blockquote-footer::before { + content: "\2014\00A0" +} + +.img-fluid { + max-width: 100%; + height: auto +} + +.img-thumbnail { + padding: .25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: .25rem; + max-width: 100%; + height: auto +} + +.figure { + display: inline-block +} + +.figure-img { + margin-bottom: .5rem; + line-height: 1 +} + +.figure-caption { + font-size: 90%; + color: #6c757d +} + +code { + font-size: 90%; + color: #bd4147; + word-break: break-word +} + +a>code { + color: inherit +} + +kbd { + padding: .2rem .4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + border-radius: .2rem +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700 +} + +pre { + display: block; + font-size: 90%; + color: #212529 +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll +} + +.container { + width: 100%; + padding-right: 10px; + padding-left: 10px; + margin-right: auto; + margin-left: auto +} + +@media (min-width:576px) { + .container { + max-width: 540px + } + +} + +@media (min-width:768px) { + .container { + max-width: 720px + } + +} + +@media (min-width:992px) { + .container { + max-width: 960px + } + +} + +@media (min-width:1200px) { + .container { + max-width: 1140px + } + +} + +.container-fluid { + width: 100%; + padding-right: 10px; + padding-left: 10px; + margin-right: auto; + margin-left: auto +} + +.row { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + margin-right: -10px; + margin-left: -10px +} + +.no-gutters { + margin-right: 0; + margin-left: 0 +} + +.no-gutters>.col, +.no-gutters>[class*=col-] { + padding-right: 0; + padding-left: 0 +} + +.col, +.col-1, +.col-10, +.col-11, +.col-12, +.col-2, +.col-3, +.col-4, +.col-5, +.col-6, +.col-7, +.col-8, +.col-9, +.col-auto, +.col-lg, +.col-lg-1, +.col-lg-10, +.col-lg-11, +.col-lg-12, +.col-lg-2, +.col-lg-3, +.col-lg-4, +.col-lg-5, +.col-lg-6, +.col-lg-7, +.col-lg-8, +.col-lg-9, +.col-lg-auto, +.col-md, +.col-md-1, +.col-md-10, +.col-md-11, +.col-md-12, +.col-md-2, +.col-md-3, +.col-md-4, +.col-md-5, +.col-md-6, +.col-md-7, +.col-md-8, +.col-md-9, +.col-md-auto, +.col-sm, +.col-sm-1, +.col-sm-10, +.col-sm-11, +.col-sm-12, +.col-sm-2, +.col-sm-3, +.col-sm-4, +.col-sm-5, +.col-sm-6, +.col-sm-7, +.col-sm-8, +.col-sm-9, +.col-sm-auto, +.col-xl, +.col-xl-1, +.col-xl-10, +.col-xl-11, +.col-xl-12, +.col-xl-2, +.col-xl-3, +.col-xl-4, +.col-xl-5, +.col-xl-6, +.col-xl-7, +.col-xl-8, +.col-xl-9, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 10px; + padding-left: 10px +} + +.col { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + max-width: 100% +} + +.col-auto { + -webkit-box-flex: 0; + flex: 0 0 auto; + width: auto; + max-width: 100% +} + +.col-1 { + -webkit-box-flex: 0; + flex: 0 0 8.33333%; + max-width: 8.33333% +} + +.col-2 { + -webkit-box-flex: 0; + flex: 0 0 16.66667%; + max-width: 16.66667% +} + +.col-3 { + -webkit-box-flex: 0; + flex: 0 0 25%; + max-width: 25% +} + +.col-4 { + -webkit-box-flex: 0; + flex: 0 0 33.33333%; + max-width: 33.33333% +} + +.col-5 { + -webkit-box-flex: 0; + flex: 0 0 41.66667%; + max-width: 41.66667% +} + +.col-6 { + -webkit-box-flex: 0; + flex: 0 0 50%; + max-width: 50% +} + +.col-7 { + -webkit-box-flex: 0; + flex: 0 0 58.33333%; + max-width: 58.33333% +} + +.col-8 { + -webkit-box-flex: 0; + flex: 0 0 66.66667%; + max-width: 66.66667% +} + +.col-9 { + -webkit-box-flex: 0; + flex: 0 0 75%; + max-width: 75% +} + +.col-10 { + -webkit-box-flex: 0; + flex: 0 0 83.33333%; + max-width: 83.33333% +} + +.col-11 { + -webkit-box-flex: 0; + flex: 0 0 91.66667%; + max-width: 91.66667% +} + +.col-12 { + -webkit-box-flex: 0; + flex: 0 0 100%; + max-width: 100% +} + +.order-first { + -webkit-box-ordinal-group: 0; + order: -1 +} + +.order-last { + -webkit-box-ordinal-group: 14; + order: 13 +} + +.order-0 { + -webkit-box-ordinal-group: 1; + order: 0 +} + +.order-1 { + -webkit-box-ordinal-group: 2; + order: 1 +} + +.order-2 { + -webkit-box-ordinal-group: 3; + order: 2 +} + +.order-3 { + -webkit-box-ordinal-group: 4; + order: 3 +} + +.order-4 { + -webkit-box-ordinal-group: 5; + order: 4 +} + +.order-5 { + -webkit-box-ordinal-group: 6; + order: 5 +} + +.order-6 { + -webkit-box-ordinal-group: 7; + order: 6 +} + +.order-7 { + -webkit-box-ordinal-group: 8; + order: 7 +} + +.order-8 { + -webkit-box-ordinal-group: 9; + order: 8 +} + +.order-9 { + -webkit-box-ordinal-group: 10; + order: 9 +} + +.order-10 { + -webkit-box-ordinal-group: 11; + order: 10 +} + +.order-11 { + -webkit-box-ordinal-group: 12; + order: 11 +} + +.order-12 { + -webkit-box-ordinal-group: 13; + order: 12 +} + +.offset-1 { + margin-left: 8.33333% +} + +.offset-2 { + margin-left: 16.66667% +} + +.offset-3 { + margin-left: 25% +} + +.offset-4 { + margin-left: 33.33333% +} + +.offset-5 { + margin-left: 41.66667% +} + +.offset-6 { + margin-left: 50% +} + +.offset-7 { + margin-left: 58.33333% +} + +.offset-8 { + margin-left: 66.66667% +} + +.offset-9 { + margin-left: 75% +} + +.offset-10 { + margin-left: 83.33333% +} + +.offset-11 { + margin-left: 91.66667% +} + +@media (min-width:576px) { + .col-sm { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + max-width: 100% + } + + .col-sm-auto { + -webkit-box-flex: 0; + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-sm-1 { + -webkit-box-flex: 0; + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-sm-2 { + -webkit-box-flex: 0; + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-sm-3 { + -webkit-box-flex: 0; + flex: 0 0 25%; + max-width: 25% + } + + .col-sm-4 { + -webkit-box-flex: 0; + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-sm-5 { + -webkit-box-flex: 0; + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-sm-6 { + -webkit-box-flex: 0; + flex: 0 0 50%; + max-width: 50% + } + + .col-sm-7 { + -webkit-box-flex: 0; + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-sm-8 { + -webkit-box-flex: 0; + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-sm-9 { + -webkit-box-flex: 0; + flex: 0 0 75%; + max-width: 75% + } + + .col-sm-10 { + -webkit-box-flex: 0; + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-sm-11 { + -webkit-box-flex: 0; + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-sm-12 { + -webkit-box-flex: 0; + flex: 0 0 100%; + max-width: 100% + } + + .order-sm-first { + -webkit-box-ordinal-group: 0; + order: -1 + } + + .order-sm-last { + -webkit-box-ordinal-group: 14; + order: 13 + } + + .order-sm-0 { + -webkit-box-ordinal-group: 1; + order: 0 + } + + .order-sm-1 { + -webkit-box-ordinal-group: 2; + order: 1 + } + + .order-sm-2 { + -webkit-box-ordinal-group: 3; + order: 2 + } + + .order-sm-3 { + -webkit-box-ordinal-group: 4; + order: 3 + } + + .order-sm-4 { + -webkit-box-ordinal-group: 5; + order: 4 + } + + .order-sm-5 { + -webkit-box-ordinal-group: 6; + order: 5 + } + + .order-sm-6 { + -webkit-box-ordinal-group: 7; + order: 6 + } + + .order-sm-7 { + -webkit-box-ordinal-group: 8; + order: 7 + } + + .order-sm-8 { + -webkit-box-ordinal-group: 9; + order: 8 + } + + .order-sm-9 { + -webkit-box-ordinal-group: 10; + order: 9 + } + + .order-sm-10 { + -webkit-box-ordinal-group: 11; + order: 10 + } + + .order-sm-11 { + -webkit-box-ordinal-group: 12; + order: 11 + } + + .order-sm-12 { + -webkit-box-ordinal-group: 13; + order: 12 + } + + .offset-sm-0 { + margin-left: 0 + } + + .offset-sm-1 { + margin-left: 8.33333% + } + + .offset-sm-2 { + margin-left: 16.66667% + } + + .offset-sm-3 { + margin-left: 25% + } + + .offset-sm-4 { + margin-left: 33.33333% + } + + .offset-sm-5 { + margin-left: 41.66667% + } + + .offset-sm-6 { + margin-left: 50% + } + + .offset-sm-7 { + margin-left: 58.33333% + } + + .offset-sm-8 { + margin-left: 66.66667% + } + + .offset-sm-9 { + margin-left: 75% + } + + .offset-sm-10 { + margin-left: 83.33333% + } + + .offset-sm-11 { + margin-left: 91.66667% + } + +} + +@media (min-width:768px) { + .col-md { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + max-width: 100% + } + + .col-md-auto { + -webkit-box-flex: 0; + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-md-1 { + -webkit-box-flex: 0; + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-md-2 { + -webkit-box-flex: 0; + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-md-3 { + -webkit-box-flex: 0; + flex: 0 0 25%; + max-width: 25% + } + + .col-md-4 { + -webkit-box-flex: 0; + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-md-5 { + -webkit-box-flex: 0; + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-md-6 { + -webkit-box-flex: 0; + flex: 0 0 50%; + max-width: 50% + } + + .col-md-7 { + -webkit-box-flex: 0; + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-md-8 { + -webkit-box-flex: 0; + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-md-9 { + -webkit-box-flex: 0; + flex: 0 0 75%; + max-width: 75% + } + + .col-md-10 { + -webkit-box-flex: 0; + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-md-11 { + -webkit-box-flex: 0; + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-md-12 { + -webkit-box-flex: 0; + flex: 0 0 100%; + max-width: 100% + } + + .order-md-first { + -webkit-box-ordinal-group: 0; + order: -1 + } + + .order-md-last { + -webkit-box-ordinal-group: 14; + order: 13 + } + + .order-md-0 { + -webkit-box-ordinal-group: 1; + order: 0 + } + + .order-md-1 { + -webkit-box-ordinal-group: 2; + order: 1 + } + + .order-md-2 { + -webkit-box-ordinal-group: 3; + order: 2 + } + + .order-md-3 { + -webkit-box-ordinal-group: 4; + order: 3 + } + + .order-md-4 { + -webkit-box-ordinal-group: 5; + order: 4 + } + + .order-md-5 { + -webkit-box-ordinal-group: 6; + order: 5 + } + + .order-md-6 { + -webkit-box-ordinal-group: 7; + order: 6 + } + + .order-md-7 { + -webkit-box-ordinal-group: 8; + order: 7 + } + + .order-md-8 { + -webkit-box-ordinal-group: 9; + order: 8 + } + + .order-md-9 { + -webkit-box-ordinal-group: 10; + order: 9 + } + + .order-md-10 { + -webkit-box-ordinal-group: 11; + order: 10 + } + + .order-md-11 { + -webkit-box-ordinal-group: 12; + order: 11 + } + + .order-md-12 { + -webkit-box-ordinal-group: 13; + order: 12 + } + + .offset-md-0 { + margin-left: 0 + } + + .offset-md-1 { + margin-left: 8.33333% + } + + .offset-md-2 { + margin-left: 16.66667% + } + + .offset-md-3 { + margin-left: 25% + } + + .offset-md-4 { + margin-left: 33.33333% + } + + .offset-md-5 { + margin-left: 41.66667% + } + + .offset-md-6 { + margin-left: 50% + } + + .offset-md-7 { + margin-left: 58.33333% + } + + .offset-md-8 { + margin-left: 66.66667% + } + + .offset-md-9 { + margin-left: 75% + } + + .offset-md-10 { + margin-left: 83.33333% + } + + .offset-md-11 { + margin-left: 91.66667% + } + +} + +@media (min-width:992px) { + .col-lg { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + max-width: 100% + } + + .col-lg-auto { + -webkit-box-flex: 0; + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-lg-1 { + -webkit-box-flex: 0; + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-lg-2 { + -webkit-box-flex: 0; + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-lg-3 { + -webkit-box-flex: 0; + flex: 0 0 25%; + max-width: 25% + } + + .col-lg-4 { + -webkit-box-flex: 0; + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-lg-5 { + -webkit-box-flex: 0; + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-lg-6 { + -webkit-box-flex: 0; + flex: 0 0 50%; + max-width: 50% + } + + .col-lg-7 { + -webkit-box-flex: 0; + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-lg-8 { + -webkit-box-flex: 0; + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-lg-9 { + -webkit-box-flex: 0; + flex: 0 0 75%; + max-width: 75% + } + + .col-lg-10 { + -webkit-box-flex: 0; + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-lg-11 { + -webkit-box-flex: 0; + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-lg-12 { + -webkit-box-flex: 0; + flex: 0 0 100%; + max-width: 100% + } + + .order-lg-first { + -webkit-box-ordinal-group: 0; + order: -1 + } + + .order-lg-last { + -webkit-box-ordinal-group: 14; + order: 13 + } + + .order-lg-0 { + -webkit-box-ordinal-group: 1; + order: 0 + } + + .order-lg-1 { + -webkit-box-ordinal-group: 2; + order: 1 + } + + .order-lg-2 { + -webkit-box-ordinal-group: 3; + order: 2 + } + + .order-lg-3 { + -webkit-box-ordinal-group: 4; + order: 3 + } + + .order-lg-4 { + -webkit-box-ordinal-group: 5; + order: 4 + } + + .order-lg-5 { + -webkit-box-ordinal-group: 6; + order: 5 + } + + .order-lg-6 { + -webkit-box-ordinal-group: 7; + order: 6 + } + + .order-lg-7 { + -webkit-box-ordinal-group: 8; + order: 7 + } + + .order-lg-8 { + -webkit-box-ordinal-group: 9; + order: 8 + } + + .order-lg-9 { + -webkit-box-ordinal-group: 10; + order: 9 + } + + .order-lg-10 { + -webkit-box-ordinal-group: 11; + order: 10 + } + + .order-lg-11 { + -webkit-box-ordinal-group: 12; + order: 11 + } + + .order-lg-12 { + -webkit-box-ordinal-group: 13; + order: 12 + } + + .offset-lg-0 { + margin-left: 0 + } + + .offset-lg-1 { + margin-left: 8.33333% + } + + .offset-lg-2 { + margin-left: 16.66667% + } + + .offset-lg-3 { + margin-left: 25% + } + + .offset-lg-4 { + margin-left: 33.33333% + } + + .offset-lg-5 { + margin-left: 41.66667% + } + + .offset-lg-6 { + margin-left: 50% + } + + .offset-lg-7 { + margin-left: 58.33333% + } + + .offset-lg-8 { + margin-left: 66.66667% + } + + .offset-lg-9 { + margin-left: 75% + } + + .offset-lg-10 { + margin-left: 83.33333% + } + + .offset-lg-11 { + margin-left: 91.66667% + } + +} + +@media (min-width:1200px) { + .col-xl { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + max-width: 100% + } + + .col-xl-auto { + -webkit-box-flex: 0; + flex: 0 0 auto; + width: auto; + max-width: 100% + } + + .col-xl-1 { + -webkit-box-flex: 0; + flex: 0 0 8.33333%; + max-width: 8.33333% + } + + .col-xl-2 { + -webkit-box-flex: 0; + flex: 0 0 16.66667%; + max-width: 16.66667% + } + + .col-xl-3 { + -webkit-box-flex: 0; + flex: 0 0 25%; + max-width: 25% + } + + .col-xl-4 { + -webkit-box-flex: 0; + flex: 0 0 33.33333%; + max-width: 33.33333% + } + + .col-xl-5 { + -webkit-box-flex: 0; + flex: 0 0 41.66667%; + max-width: 41.66667% + } + + .col-xl-6 { + -webkit-box-flex: 0; + flex: 0 0 50%; + max-width: 50% + } + + .col-xl-7 { + -webkit-box-flex: 0; + flex: 0 0 58.33333%; + max-width: 58.33333% + } + + .col-xl-8 { + -webkit-box-flex: 0; + flex: 0 0 66.66667%; + max-width: 66.66667% + } + + .col-xl-9 { + -webkit-box-flex: 0; + flex: 0 0 75%; + max-width: 75% + } + + .col-xl-10 { + -webkit-box-flex: 0; + flex: 0 0 83.33333%; + max-width: 83.33333% + } + + .col-xl-11 { + -webkit-box-flex: 0; + flex: 0 0 91.66667%; + max-width: 91.66667% + } + + .col-xl-12 { + -webkit-box-flex: 0; + flex: 0 0 100%; + max-width: 100% + } + + .order-xl-first { + -webkit-box-ordinal-group: 0; + order: -1 + } + + .order-xl-last { + -webkit-box-ordinal-group: 14; + order: 13 + } + + .order-xl-0 { + -webkit-box-ordinal-group: 1; + order: 0 + } + + .order-xl-1 { + -webkit-box-ordinal-group: 2; + order: 1 + } + + .order-xl-2 { + -webkit-box-ordinal-group: 3; + order: 2 + } + + .order-xl-3 { + -webkit-box-ordinal-group: 4; + order: 3 + } + + .order-xl-4 { + -webkit-box-ordinal-group: 5; + order: 4 + } + + .order-xl-5 { + -webkit-box-ordinal-group: 6; + order: 5 + } + + .order-xl-6 { + -webkit-box-ordinal-group: 7; + order: 6 + } + + .order-xl-7 { + -webkit-box-ordinal-group: 8; + order: 7 + } + + .order-xl-8 { + -webkit-box-ordinal-group: 9; + order: 8 + } + + .order-xl-9 { + -webkit-box-ordinal-group: 10; + order: 9 + } + + .order-xl-10 { + -webkit-box-ordinal-group: 11; + order: 10 + } + + .order-xl-11 { + -webkit-box-ordinal-group: 12; + order: 11 + } + + .order-xl-12 { + -webkit-box-ordinal-group: 13; + order: 12 + } + + .offset-xl-0 { + margin-left: 0 + } + + .offset-xl-1 { + margin-left: 8.33333% + } + + .offset-xl-2 { + margin-left: 16.66667% + } + + .offset-xl-3 { + margin-left: 25% + } + + .offset-xl-4 { + margin-left: 33.33333% + } + + .offset-xl-5 { + margin-left: 41.66667% + } + + .offset-xl-6 { + margin-left: 50% + } + + .offset-xl-7 { + margin-left: 58.33333% + } + + .offset-xl-8 { + margin-left: 66.66667% + } + + .offset-xl-9 { + margin-left: 75% + } + + .offset-xl-10 { + margin-left: 83.33333% + } + + .offset-xl-11 { + margin-left: 91.66667% + } + +} + +.table { + width: 100%; + margin-bottom: 1rem; + color: #212529 +} + +.table td, +.table th { + padding: 10px 15px; + vertical-align: top; + border-top: 1px solid #f2f4f9 +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #f2f4f9 +} + +.table tbody+tbody { + border-top: 2px solid #f2f4f9 +} + +.table-sm td, +.table-sm th { + padding: 10px 15px +} + +.table-bordered { + border: 1px solid #f2f4f9 +} + +.table-bordered td, +.table-bordered th { + border: 1px solid #f2f4f9 +} + +.table-bordered thead td, +.table-bordered thead th { + border-bottom-width: 2px +} + +.table-borderless tbody+tbody, +.table-borderless td, +.table-borderless th, +.table-borderless thead th { + border: 0 +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: #f6f7f9 +} + +.table-hover tbody tr:hover { + color: #212529; + background-color: #f6f7f9 +} + +.table-primary, +.table-primary>td, +.table-primary>th { + background-color: #b9d7b9 +} + +.table-primary tbody+tbody, +.table-primary td, +.table-primary th, +.table-primary thead th { + border-color: #7cb57e +} + +.table-hover .table-primary:hover { + background-color: #a9cea9 +} + +.table-hover .table-primary:hover>td, +.table-hover .table-primary:hover>th { + background-color: #a9cea9 +} + +.table-secondary, +.table-secondary>td, +.table-secondary>th { + background-color: #dbdbdb +} + +.table-secondary tbody+tbody, +.table-secondary td, +.table-secondary th, +.table-secondary thead th { + border-color: #bdbdbd +} + +.table-hover .table-secondary:hover { + background-color: #cecece +} + +.table-hover .table-secondary:hover>td, +.table-hover .table-secondary:hover>th { + background-color: #cecece +} + +.table-success, +.table-success>td, +.table-success>th { + background-color: #b8f6e1 +} + +.table-success tbody+tbody, +.table-success td, +.table-success th, +.table-success thead th { + border-color: #7aefc7 +} + +.table-hover .table-success:hover { + background-color: #a1f3d7 +} + +.table-hover .table-success:hover>td, +.table-hover .table-success:hover>th { + background-color: #a1f3d7 +} + +.table-info, +.table-info>td, +.table-info>th { + background-color: #d6d3fc +} + +.table-info tbody+tbody, +.table-info td, +.table-info th, +.table-info thead th { + border-color: #b3adfa +} + +.table-hover .table-info:hover { + background-color: #c0bbfa +} + +.table-hover .table-info:hover>td, +.table-hover .table-info:hover>th { + background-color: #c0bbfa +} + +.table-warning, +.table-warning>td, +.table-warning>th { + background-color: #fbdcd2 +} + +.table-warning tbody+tbody, +.table-warning td, +.table-warning th, +.table-warning thead th { + border-color: #f7beac +} + +.table-hover .table-warning:hover { + background-color: #f9cabb +} + +.table-hover .table-warning:hover>td, +.table-hover .table-warning:hover>th { + background-color: #f9cabb +} + +.table-danger, +.table-danger>td, +.table-danger>th { + background-color: #ffd2d4 +} + +.table-danger tbody+tbody, +.table-danger td, +.table-danger th, +.table-danger thead th { + border-color: #ffacaf +} + +.table-hover .table-danger:hover { + background-color: #ffb9bc +} + +.table-hover .table-danger:hover>td, +.table-hover .table-danger:hover>th { + background-color: #ffb9bc +} + +.table-light, +.table-light>td, +.table-light>th { + background-color: #f6f6f6 +} + +.table-light tbody+tbody, +.table-light td, +.table-light th, +.table-light thead th { + border-color: #eee +} + +.table-hover .table-light:hover { + background-color: #e9e9e9 +} + +.table-hover .table-light:hover>td, +.table-hover .table-light:hover>th { + background-color: #e9e9e9 +} + +.table-dark, +.table-dark>td, +.table-dark>th { + background-color: #d8d9da +} + +.table-dark tbody+tbody, +.table-dark td, +.table-dark th, +.table-dark thead th { + border-color: #b7b8ba +} + +.table-hover .table-dark:hover { + background-color: #cbccce +} + +.table-hover .table-dark:hover>td, +.table-hover .table-dark:hover>th { + background-color: #cbccce +} + +.table-white, +.table-white>td, +.table-white>th { + background-color: #fff +} + +.table-white tbody+tbody, +.table-white td, +.table-white th, +.table-white thead th { + border-color: #fff +} + +.table-hover .table-white:hover { + background-color: #f2f2f2 +} + +.table-hover .table-white:hover>td, +.table-hover .table-white:hover>th { + background-color: #f2f2f2 +} + +.table-active, +.table-active>td, +.table-active>th { + background-color: rgba(0, 0, 0, .075) +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, .075) +} + +.table-hover .table-active:hover>td, +.table-hover .table-active:hover>th { + background-color: rgba(0, 0, 0, .075) +} + +.table .thead-dark th { + color: #fff; + background-color: #343a40; + border-color: #454d55 +} + +.table .thead-light th { + color: #495057; + background-color: #e1e4e6; + border-color: #f2f4f9 +} + +.table-dark { + color: #fff; + background-color: #343a40 +} + +.table-dark td, +.table-dark th, +.table-dark thead th { + border-color: #454d55 +} + +.table-dark.table-bordered { + border: 0 +} + +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, .05) +} + +.table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, .075) +} + +@media (max-width:575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-sm>.table-bordered { + border: 0 + } + +} + +@media (max-width:767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-md>.table-bordered { + border: 0 + } + +} + +@media (max-width:991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-lg>.table-bordered { + border: 0 + } + +} + +@media (max-width:1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch + } + + .table-responsive-xl>.table-bordered { + border: 0 + } + +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch +} + +.table-responsive>.table-bordered { + border: 0 +} + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + .75rem + 2px); + padding: .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6c757d; + background-color: #f6f7f9; + background-clip: padding-box; + border: 1px solid #f0f2f5; + border-radius: .25rem; + -webkit-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .form-control { + -webkit-transition: none; + transition: none + } + +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0 +} + +.form-control:focus { + color: #495057; + background-color: #f6f7f9; + border-color: #d7dee5; + outline: 0; + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.form-control::-webkit-input-placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control::-ms-input-placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control::placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control:disabled, +.form-control[readonly] { + background-color: #f8f9fa; + opacity: 1 +} + +select.form-control:focus::-ms-value { + color: #6c757d; + background-color: #f6f7f9 +} + +.form-control-file, +.form-control-range { + display: block; + width: 100% +} + +.col-form-label { + padding-top: calc(.375rem + 1px); + padding-bottom: calc(.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5 +} + +.col-form-label-lg { + padding-top: calc(.5rem + 1px); + padding-bottom: calc(.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5 +} + +.col-form-label-sm { + padding-top: calc(.25rem + 1px); + padding-bottom: calc(.25rem + 1px); + font-size: .875rem; + line-height: 1.5 +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: .375rem; + padding-bottom: .375rem; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0 +} + +.form-control-plaintext.form-control-lg, +.form-control-plaintext.form-control-sm { + padding-right: 0; + padding-left: 0 +} + +.form-control-sm { + height: calc(1.5em + .5rem + 2px); + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +select.form-control[multiple], +select.form-control[size] { + height: auto +} + +textarea.form-control { + height: auto +} + +.form-group { + margin-bottom: 1rem +} + +.form-text { + display: block; + margin-top: .25rem +} + +.form-row { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px +} + +.form-row>.col, +.form-row>[class*=col-] { + padding-right: 5px; + padding-left: 5px +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem +} + +.form-check-input { + position: absolute; + margin-top: .3rem; + margin-left: -1.25rem +} + +.form-check-input:disabled~.form-check-label { + color: #adb5bd +} + +.form-check-label { + margin-bottom: 0 +} + +.form-check-inline { + display: -webkit-inline-box; + display: inline-flex; + -webkit-box-align: center; + align-items: center; + padding-left: 0; + margin-right: .75rem +} + +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: .3125rem; + margin-left: 0 +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: .25rem; + font-size: 80%; + color: #28a745 +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: .25rem .5rem; + margin-top: .1rem; + font-size: .875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(40, 167, 69, .9); + border-radius: .25rem +} + +.form-control.is-valid, +.was-validated .form-control:valid { + border-color: #28a745; + padding-right: calc(1.5em + .75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: center right calc(.375em + .1875rem); + background-size: calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-control.is-valid:focus, +.was-validated .form-control:valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) +} + +.form-control.is-valid~.valid-feedback, +.form-control.is-valid~.valid-tooltip, +.was-validated .form-control:valid~.valid-feedback, +.was-validated .form-control:valid~.valid-tooltip { + display: block +} + +.was-validated textarea.form-control:valid, +textarea.form-control.is-valid { + padding-right: calc(1.5em + .75rem); + background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) +} + +.custom-select.is-valid, +.was-validated .custom-select:valid { + border-color: #28a745; + padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) +} + +.custom-select.is-valid:focus, +.was-validated .custom-select:valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) +} + +.custom-select.is-valid~.valid-feedback, +.custom-select.is-valid~.valid-tooltip, +.was-validated .custom-select:valid~.valid-feedback, +.was-validated .custom-select:valid~.valid-tooltip { + display: block +} + +.form-control-file.is-valid~.valid-feedback, +.form-control-file.is-valid~.valid-tooltip, +.was-validated .form-control-file:valid~.valid-feedback, +.was-validated .form-control-file:valid~.valid-tooltip { + display: block +} + +.form-check-input.is-valid~.form-check-label, +.was-validated .form-check-input:valid~.form-check-label { + color: #28a745 +} + +.form-check-input.is-valid~.valid-feedback, +.form-check-input.is-valid~.valid-tooltip, +.was-validated .form-check-input:valid~.valid-feedback, +.was-validated .form-check-input:valid~.valid-tooltip { + display: block +} + +.custom-control-input.is-valid~.custom-control-label, +.was-validated .custom-control-input:valid~.custom-control-label { + color: #28a745 +} + +.custom-control-input.is-valid~.custom-control-label::before, +.was-validated .custom-control-input:valid~.custom-control-label::before { + border-color: #28a745 +} + +.custom-control-input.is-valid~.valid-feedback, +.custom-control-input.is-valid~.valid-tooltip, +.was-validated .custom-control-input:valid~.valid-feedback, +.was-validated .custom-control-input:valid~.valid-tooltip { + display: block +} + +.custom-control-input.is-valid:checked~.custom-control-label::before, +.was-validated .custom-control-input:valid:checked~.custom-control-label::before { + border-color: #34ce57; + background-color: #34ce57 +} + +.custom-control-input.is-valid:focus~.custom-control-label::before, +.was-validated .custom-control-input:valid:focus~.custom-control-label::before { + box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) +} + +.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before, +.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before { + border-color: #28a745 +} + +.custom-file-input.is-valid~.custom-file-label, +.was-validated .custom-file-input:valid~.custom-file-label { + border-color: #28a745 +} + +.custom-file-input.is-valid~.valid-feedback, +.custom-file-input.is-valid~.valid-tooltip, +.was-validated .custom-file-input:valid~.valid-feedback, +.was-validated .custom-file-input:valid~.valid-tooltip { + display: block +} + +.custom-file-input.is-valid:focus~.custom-file-label, +.was-validated .custom-file-input:valid:focus~.custom-file-label { + border-color: #28a745; + box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: .25rem; + font-size: 80%; + color: #dc3545 +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: .25rem .5rem; + margin-top: .1rem; + font-size: .875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(220, 53, 69, .9); + border-radius: .25rem +} + +.form-control.is-invalid, +.was-validated .form-control:invalid { + border-color: #dc3545; + padding-right: calc(1.5em + .75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E"); + background-repeat: no-repeat; + background-position: center right calc(.375em + .1875rem); + background-size: calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-control.is-invalid:focus, +.was-validated .form-control:invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) +} + +.form-control.is-invalid~.invalid-feedback, +.form-control.is-invalid~.invalid-tooltip, +.was-validated .form-control:invalid~.invalid-feedback, +.was-validated .form-control:invalid~.invalid-tooltip { + display: block +} + +.was-validated textarea.form-control:invalid, +textarea.form-control.is-invalid { + padding-right: calc(1.5em + .75rem); + background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) +} + +.custom-select.is-invalid, +.was-validated .custom-select:invalid { + border-color: #dc3545; + padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) +} + +.custom-select.is-invalid:focus, +.was-validated .custom-select:invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) +} + +.custom-select.is-invalid~.invalid-feedback, +.custom-select.is-invalid~.invalid-tooltip, +.was-validated .custom-select:invalid~.invalid-feedback, +.was-validated .custom-select:invalid~.invalid-tooltip { + display: block +} + +.form-control-file.is-invalid~.invalid-feedback, +.form-control-file.is-invalid~.invalid-tooltip, +.was-validated .form-control-file:invalid~.invalid-feedback, +.was-validated .form-control-file:invalid~.invalid-tooltip { + display: block +} + +.form-check-input.is-invalid~.form-check-label, +.was-validated .form-check-input:invalid~.form-check-label { + color: #dc3545 +} + +.form-check-input.is-invalid~.invalid-feedback, +.form-check-input.is-invalid~.invalid-tooltip, +.was-validated .form-check-input:invalid~.invalid-feedback, +.was-validated .form-check-input:invalid~.invalid-tooltip { + display: block +} + +.custom-control-input.is-invalid~.custom-control-label, +.was-validated .custom-control-input:invalid~.custom-control-label { + color: #dc3545 +} + +.custom-control-input.is-invalid~.custom-control-label::before, +.was-validated .custom-control-input:invalid~.custom-control-label::before { + border-color: #dc3545 +} + +.custom-control-input.is-invalid~.invalid-feedback, +.custom-control-input.is-invalid~.invalid-tooltip, +.was-validated .custom-control-input:invalid~.invalid-feedback, +.was-validated .custom-control-input:invalid~.invalid-tooltip { + display: block +} + +.custom-control-input.is-invalid:checked~.custom-control-label::before, +.was-validated .custom-control-input:invalid:checked~.custom-control-label::before { + border-color: #e4606d; + background-color: #e4606d +} + +.custom-control-input.is-invalid:focus~.custom-control-label::before, +.was-validated .custom-control-input:invalid:focus~.custom-control-label::before { + box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) +} + +.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before, +.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before { + border-color: #dc3545 +} + +.custom-file-input.is-invalid~.custom-file-label, +.was-validated .custom-file-input:invalid~.custom-file-label { + border-color: #dc3545 +} + +.custom-file-input.is-invalid~.invalid-feedback, +.custom-file-input.is-invalid~.invalid-tooltip, +.was-validated .custom-file-input:invalid~.invalid-feedback, +.was-validated .custom-file-input:invalid~.invalid-tooltip { + display: block +} + +.custom-file-input.is-invalid:focus~.custom-file-label, +.was-validated .custom-file-input:invalid:focus~.custom-file-label { + border-color: #dc3545; + box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) +} + +.form-inline { + display: -webkit-box; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row wrap; + -webkit-box-align: center; + align-items: center +} + +.form-inline .form-check { + width: 100% +} + +@media (min-width:576px) { + .form-inline label { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + margin-bottom: 0 + } + + .form-inline .form-group { + display: -webkit-box; + display: flex; + -webkit-box-flex: 0; + flex: 0 0 auto; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row wrap; + -webkit-box-align: center; + align-items: center; + margin-bottom: 0 + } + + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle + } + + .form-inline .form-control-plaintext { + display: inline-block + } + + .form-inline .custom-select, + .form-inline .input-group { + width: auto + } + + .form-inline .form-check { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + width: auto; + padding-left: 0 + } + + .form-inline .form-check-input { + position: relative; + flex-shrink: 0; + margin-top: 0; + margin-right: .25rem; + margin-left: 0 + } + + .form-inline .custom-control { + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center + } + + .form-inline .custom-control-label { + margin-bottom: 0 + } + +} + +.btn { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: .375rem .75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: .25rem; + -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .btn { + -webkit-transition: none; + transition: none + } + +} + +.btn:hover { + color: #212529; + text-decoration: none +} + +.btn.focus, +.btn:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.btn.disabled, +.btn:disabled { + opacity: .65 +} + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none +} + +.btn-primary { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-primary:hover { + color: #fff; + background-color: #034b04; + border-color: #023f03 +} + +.btn-primary.focus, +.btn-primary:focus { + box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5) +} + +.btn-primary.disabled, +.btn-primary:disabled { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-primary:not(:disabled):not(.disabled).active, +.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle { + color: #fff; + background-color: #023f03; + border-color: #023203 +} + +.btn-primary:not(:disabled):not(.disabled).active:focus, +.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5) +} + +.btn-secondary { + color: #fff; + background-color: grey; + border-color: grey +} + +.btn-secondary:hover { + color: #fff; + background-color: #6d6d6d; + border-color: #676767 +} + +.btn-secondary.focus, +.btn-secondary:focus { + box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5) +} + +.btn-secondary.disabled, +.btn-secondary:disabled { + color: #fff; + background-color: grey; + border-color: grey +} + +.btn-secondary:not(:disabled):not(.disabled).active, +.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle { + color: #fff; + background-color: #676767; + border-color: #606060 +} + +.btn-secondary:not(:disabled):not(.disabled).active:focus, +.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5) +} + +.btn-success { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-success:hover { + color: #fff; + background-color: #00ba7a; + border-color: #00ad72 +} + +.btn-success.focus, +.btn-success:focus { + box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5) +} + +.btn-success.disabled, +.btn-success:disabled { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-success:not(:disabled):not(.disabled).active, +.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle { + color: #fff; + background-color: #00ad72; + border-color: #00a069 +} + +.btn-success:not(:disabled):not(.disabled).active:focus, +.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5) +} + +.btn-info { + color: #fff; + background-color: #6c61f6; + border-color: #6c61f6 +} + +.btn-info:hover { + color: #fff; + background-color: #4a3df4; + border-color: #3f31f3 +} + +.btn-info.focus, +.btn-info:focus { + box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5) +} + +.btn-info.disabled, +.btn-info:disabled { + color: #fff; + background-color: #6c61f6; + border-color: #6c61f6 +} + +.btn-info:not(:disabled):not(.disabled).active, +.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle { + color: #fff; + background-color: #3f31f3; + border-color: #3425f3 +} + +.btn-info:not(:disabled):not(.disabled).active:focus, +.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5) +} + +.btn-warning { + color: #212529; + background-color: #f0825f; + border-color: #f0825f +} + +.btn-warning:hover { + color: #fff; + background-color: #ed673c; + border-color: #ec5e30 +} + +.btn-warning.focus, +.btn-warning:focus { + box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5) +} + +.btn-warning.disabled, +.btn-warning:disabled { + color: #212529; + background-color: #f0825f; + border-color: #f0825f +} + +.btn-warning:not(:disabled):not(.disabled).active, +.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle { + color: #fff; + background-color: #ec5e30; + border-color: #eb5425 +} + +.btn-warning:not(:disabled):not(.disabled).active:focus, +.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5) +} + +.btn-danger { + color: #fff; + background-color: #ff5f66; + border-color: #ff5f66 +} + +.btn-danger:hover { + color: #fff; + background-color: #ff3941; + border-color: #ff2c35 +} + +.btn-danger.focus, +.btn-danger:focus { + box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5) +} + +.btn-danger.disabled, +.btn-danger:disabled { + color: #fff; + background-color: #ff5f66; + border-color: #ff5f66 +} + +.btn-danger:not(:disabled):not(.disabled).active, +.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle { + color: #fff; + background-color: #ff2c35; + border-color: #ff1f29 +} + +.btn-danger:not(:disabled):not(.disabled).active:focus, +.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5) +} + +.btn-light { + color: #212529; + background-color: #dfdfdf; + border-color: #dfdfdf +} + +.btn-light:hover { + color: #212529; + background-color: #ccc; + border-color: #c6c6c6 +} + +.btn-light.focus, +.btn-light:focus { + box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5) +} + +.btn-light.disabled, +.btn-light:disabled { + color: #212529; + background-color: #dfdfdf; + border-color: #dfdfdf +} + +.btn-light:not(:disabled):not(.disabled).active, +.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle { + color: #212529; + background-color: #c6c6c6; + border-color: #bfbfbf +} + +.btn-light:not(:disabled):not(.disabled).active:focus, +.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5) +} + +.btn-dark { + color: #fff; + background-color: #74767b; + border-color: #74767b +} + +.btn-dark:hover { + color: #fff; + background-color: #616367; + border-color: #5b5d61 +} + +.btn-dark.focus, +.btn-dark:focus { + box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5) +} + +.btn-dark.disabled, +.btn-dark:disabled { + color: #fff; + background-color: #74767b; + border-color: #74767b +} + +.btn-dark:not(:disabled):not(.disabled).active, +.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle { + color: #fff; + background-color: #5b5d61; + border-color: #55575a +} + +.btn-dark:not(:disabled):not(.disabled).active:focus, +.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5) +} + +.btn-white { + color: #212529; + background-color: #fff; + border-color: #fff +} + +.btn-white:hover { + color: #212529; + background-color: #ececec; + border-color: #e6e6e6 +} + +.btn-white.focus, +.btn-white:focus { + box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5) +} + +.btn-white.disabled, +.btn-white:disabled { + color: #212529; + background-color: #fff; + border-color: #fff +} + +.btn-white:not(:disabled):not(.disabled).active, +.btn-white:not(:disabled):not(.disabled):active,.show>.btn-white.dropdown-toggle { + color: #212529; + background-color: #e6e6e6; + border-color: #dfdfdf +} + +.btn-white:not(:disabled):not(.disabled).active:focus, +.btn-white:not(:disabled):not(.disabled):active:focus,.show>.btn-white.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5) +} + +.btn-outline-primary { + color: #047006; + border-color: #047006 +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-outline-primary.focus, +.btn-outline-primary:focus { + box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) +} + +.btn-outline-primary.disabled, +.btn-outline-primary:disabled { + color: #047006; + background-color: transparent +} + +.btn-outline-primary:not(:disabled):not(.disabled).active, +.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) +} + +.btn-outline-secondary { + color: grey; + border-color: grey +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: grey; + border-color: grey +} + +.btn-outline-secondary.focus, +.btn-outline-secondary:focus { + box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) +} + +.btn-outline-secondary.disabled, +.btn-outline-secondary:disabled { + color: grey; + background-color: transparent +} + +.btn-outline-secondary:not(:disabled):not(.disabled).active, +.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: grey; + border-color: grey +} + +.btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) +} + +.btn-outline-success { + color: #047006; + border-color: #047006 +} + +.btn-outline-success:hover { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-outline-success.focus, +.btn-outline-success:focus { + box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) +} + +.btn-outline-success.disabled, +.btn-outline-success:disabled { + color: #047006; + background-color: transparent +} + +.btn-outline-success:not(:disabled):not(.disabled).active, +.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #047006; + border-color: #047006 +} + +.btn-outline-success:not(:disabled):not(.disabled).active:focus, +.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) +} + +.btn-outline-info { + color: #6c61f6; + border-color: #6c61f6 +} + +.btn-outline-info:hover { + color: #fff; + background-color: #6c61f6; + border-color: #6c61f6 +} + +.btn-outline-info.focus, +.btn-outline-info:focus { + box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) +} + +.btn-outline-info.disabled, +.btn-outline-info:disabled { + color: #6c61f6; + background-color: transparent +} + +.btn-outline-info:not(:disabled):not(.disabled).active, +.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #6c61f6; + border-color: #6c61f6 +} + +.btn-outline-info:not(:disabled):not(.disabled).active:focus, +.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) +} + +.btn-outline-warning { + color: #f0825f; + border-color: #f0825f +} + +.btn-outline-warning:hover { + color: #212529; + background-color: #f0825f; + border-color: #f0825f +} + +.btn-outline-warning.focus, +.btn-outline-warning:focus { + box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) +} + +.btn-outline-warning.disabled, +.btn-outline-warning:disabled { + color: #f0825f; + background-color: transparent +} + +.btn-outline-warning:not(:disabled):not(.disabled).active, +.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #f0825f; + border-color: #f0825f +} + +.btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) +} + +.btn-outline-danger { + color: #ff5f66; + border-color: #ff5f66 +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #ff5f66; + border-color: #ff5f66 +} + +.btn-outline-danger.focus, +.btn-outline-danger:focus { + box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) +} + +.btn-outline-danger.disabled, +.btn-outline-danger:disabled { + color: #ff5f66; + background-color: transparent +} + +.btn-outline-danger:not(:disabled):not(.disabled).active, +.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #ff5f66; + border-color: #ff5f66 +} + +.btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) +} + +.btn-outline-light { + color: #dfdfdf; + border-color: #dfdfdf +} + +.btn-outline-light:hover { + color: #212529; + background-color: #dfdfdf; + border-color: #dfdfdf +} + +.btn-outline-light.focus, +.btn-outline-light:focus { + box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) +} + +.btn-outline-light.disabled, +.btn-outline-light:disabled { + color: #dfdfdf; + background-color: transparent +} + +.btn-outline-light:not(:disabled):not(.disabled).active, +.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #dfdfdf; + border-color: #dfdfdf +} + +.btn-outline-light:not(:disabled):not(.disabled).active:focus, +.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) +} + +.btn-outline-dark { + color: #74767b; + border-color: #74767b +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #74767b; + border-color: #74767b +} + +.btn-outline-dark.focus, +.btn-outline-dark:focus { + box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) +} + +.btn-outline-dark.disabled, +.btn-outline-dark:disabled { + color: #74767b; + background-color: transparent +} + +.btn-outline-dark:not(:disabled):not(.disabled).active, +.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #74767b; + border-color: #74767b +} + +.btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) +} + +.btn-outline-white { + color: #fff; + border-color: #fff +} + +.btn-outline-white:hover { + color: #212529; + background-color: #fff; + border-color: #fff +} + +.btn-outline-white.focus, +.btn-outline-white:focus { + box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) +} + +.btn-outline-white.disabled, +.btn-outline-white:disabled { + color: #fff; + background-color: transparent +} + +.btn-outline-white:not(:disabled):not(.disabled).active, +.btn-outline-white:not(:disabled):not(.disabled):active,.show>.btn-outline-white.dropdown-toggle { + color: #212529; + background-color: #fff; + border-color: #fff +} + +.btn-outline-white:not(:disabled):not(.disabled).active:focus, +.btn-outline-white:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-white.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) +} + +.btn-link { + font-weight: 400; + color: #047006; + text-decoration: none +} + +.btn-link:hover { + color: #012602; + text-decoration: underline +} + +.btn-link.focus, +.btn-link:focus { + text-decoration: underline; + box-shadow: none +} + +.btn-link.disabled, +.btn-link:disabled { + color: #6c757d; + pointer-events: none +} + +.btn-group-lg>.btn, +.btn-lg { + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +.btn-group-sm>.btn, +.btn-sm { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.btn-block { + display: block; + width: 100% +} + +.btn-block+.btn-block { + margin-top: .5rem +} + +input[type=button].btn-block, +input[type=reset].btn-block, +input[type=submit].btn-block { + width: 100% +} + +.fade { + -webkit-transition: opacity .15s linear; + transition: opacity .15s linear +} + +@media (prefers-reduced-motion:reduce) { + .fade { + -webkit-transition: none; + transition: none + } + +} + +.fade:not(.show) { + opacity: 0 +} + +.collapse:not(.show) { + display: none +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height .35s ease; + transition: height .35s ease +} + +@media (prefers-reduced-motion:reduce) { + .collapsing { + -webkit-transition: none; + transition: none + } + +} + +.dropdown, +.dropleft, +.dropright, +.dropup { + position: relative +} + +.dropdown-toggle { + white-space: nowrap +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: 'http://www.w3.org/2000/svg'; + border-top: .3em solid; + border-right: .3em solid transparent; + border-bottom: 0; + border-left: .3em solid transparent +} + +.dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: .5rem 0; + margin: .125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: .25rem +} + +.dropdown-menu-left { + right: auto; + left: 0 +} + +.dropdown-menu-right { + right: 0; + left: auto +} + +@media (min-width:576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0 + } + + .dropdown-menu-sm-right { + right: 0; + left: auto + } + +} + +@media (min-width:768px) { + .dropdown-menu-md-left { + right: auto; + left: 0 + } + + .dropdown-menu-md-right { + right: 0; + left: auto + } + +} + +@media (min-width:992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0 + } + + .dropdown-menu-lg-right { + right: 0; + left: auto + } + +} + +@media (min-width:1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0 + } + + .dropdown-menu-xl-right { + right: 0; + left: auto + } + +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: .125rem +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: '0 0 8 8'; + border-top: 0; + border-right: .3em solid transparent; + border-bottom: .3em solid; + border-left: .3em solid transparent +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: .125rem +} + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: '%2328a745'; + border-top: .3em solid transparent; + border-right: 0; + border-bottom: .3em solid transparent; + border-left: .3em solid +} + +.dropright .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropright .dropdown-toggle::after { + vertical-align: 0 +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: .125rem +} + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z' +} + +.dropleft .dropdown-toggle::after { + display: none +} + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: .255em; + vertical-align: .255em; + content: 'http://www.w3.org/2000/svg'; + border-top: .3em solid transparent; + border-right: .3em solid; + border-bottom: .3em solid transparent +} + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropleft .dropdown-toggle::before { + vertical-align: 0 +} + +.dropdown-menu[x-placement^=bottom], +.dropdown-menu[x-placement^=left], +.dropdown-menu[x-placement^=right], +.dropdown-menu[x-placement^=top] { + right: auto; + bottom: auto +} + +.dropdown-divider { + height: 0; + margin: .5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef +} + +.dropdown-item { + display: block; + width: 100%; + padding: .25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0 +} + +.dropdown-item:focus, +.dropdown-item:hover { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa +} + +.dropdown-item.active, +.dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #007bff +} + +.dropdown-item.disabled, +.dropdown-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: transparent +} + +.dropdown-menu.show { + display: block +} + +.dropdown-header { + display: block; + padding: .5rem 1.5rem; + margin-bottom: 0; + font-size: .875rem; + color: #6c757d; + white-space: nowrap +} + +.dropdown-item-text { + display: block; + padding: .25rem 1.5rem; + color: #212529 +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: -webkit-inline-box; + display: inline-flex; + vertical-align: middle +} + +.btn-group-vertical>.btn, +.btn-group>.btn { + position: relative; + -webkit-box-flex: 1; + flex: 1 1 auto +} + +.btn-group-vertical>.btn:hover, +.btn-group>.btn:hover { + z-index: 1 +} + +.btn-group-vertical>.btn.active, +.btn-group-vertical>.btn:active, +.btn-group-vertical>.btn:focus, +.btn-group>.btn.active, +.btn-group>.btn:active, +.btn-group>.btn:focus { + z-index: 1 +} + +.btn-toolbar { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + -webkit-box-pack: start; + justify-content: flex-start +} + +.btn-toolbar .input-group { + width: auto +} + +.btn-group>.btn-group:not(:first-child), +.btn-group>.btn:not(:first-child) { + margin-left: -1px +} + +.btn-group>.btn-group:not(:last-child)>.btn, +.btn-group>.btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn-group:not(:first-child)>.btn, +.btn-group>.btn:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.dropdown-toggle-split { + padding-right: .5625rem; + padding-left: .5625rem +} + +.dropdown-toggle-split::after, +.dropright .dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after { + margin-left: 0 +} + +.dropleft .dropdown-toggle-split::before { + margin-right: 0 +} + +.btn-group-sm>.btn+.dropdown-toggle-split, +.btn-sm+.dropdown-toggle-split { + padding-right: .375rem; + padding-left: .375rem +} + +.btn-group-lg>.btn+.dropdown-toggle-split, +.btn-lg+.dropdown-toggle-split { + padding-right: .75rem; + padding-left: .75rem +} + +.btn-group-vertical { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + -webkit-box-align: start; + align-items: flex-start; + -webkit-box-pack: center; + justify-content: center +} + +.btn-group-vertical>.btn, +.btn-group-vertical>.btn-group { + width: 100% +} + +.btn-group-vertical>.btn-group:not(:first-child), +.btn-group-vertical>.btn:not(:first-child) { + margin-top: -1px +} + +.btn-group-vertical>.btn-group:not(:last-child)>.btn, +.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn-group:not(:first-child)>.btn, +.btn-group-vertical>.btn:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.btn-group-toggle>.btn, +.btn-group-toggle>.btn-group>.btn { + margin-bottom: 0 +} + +.btn-group-toggle>.btn input[type=checkbox], +.btn-group-toggle>.btn input[type=radio], +.btn-group-toggle>.btn-group>.btn input[type=checkbox], +.btn-group-toggle>.btn-group>.btn input[type=radio] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none +} + +.input-group { + position: relative; + display: -webkit-box; + display: flex; + flex-wrap: wrap; + -webkit-box-align: stretch; + align-items: stretch; + width: 100% +} + +.input-group>.custom-file, +.input-group>.custom-select, +.input-group>.form-control, +.input-group>.form-control-plaintext { + position: relative; + -webkit-box-flex: 1; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0 +} + +.input-group>.custom-file+.custom-file, +.input-group>.custom-file+.custom-select, +.input-group>.custom-file+.form-control, +.input-group>.custom-select+.custom-file, +.input-group>.custom-select+.custom-select, +.input-group>.custom-select+.form-control, +.input-group>.form-control+.custom-file, +.input-group>.form-control+.custom-select, +.input-group>.form-control+.form-control, +.input-group>.form-control-plaintext+.custom-file, +.input-group>.form-control-plaintext+.custom-select, +.input-group>.form-control-plaintext+.form-control { + margin-left: -1px +} + +.input-group>.custom-file .custom-file-input:focus~.custom-file-label, +.input-group>.custom-select:focus, +.input-group>.form-control:focus { + z-index: 3 +} + +.input-group>.custom-file .custom-file-input:focus { + z-index: 4 +} + +.input-group>.custom-select:not(:last-child), +.input-group>.form-control:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group>.custom-select:not(:first-child), +.input-group>.form-control:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group>.custom-file { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center +} + +.input-group>.custom-file:not(:last-child) .custom-file-label, +.input-group>.custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group>.custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group-append, +.input-group-prepend { + display: -webkit-box; + display: flex +} + +.input-group-append .btn, +.input-group-prepend .btn { + position: relative; + z-index: 2 +} + +.input-group-append .btn:focus, +.input-group-prepend .btn:focus { + z-index: 3 +} + +.input-group-append .btn+.btn, +.input-group-append .btn+.input-group-text, +.input-group-append .input-group-text+.btn, +.input-group-append .input-group-text+.input-group-text, +.input-group-prepend .btn+.btn, +.input-group-prepend .btn+.input-group-text, +.input-group-prepend .input-group-text+.btn, +.input-group-prepend .input-group-text+.input-group-text { + margin-left: -1px +} + +.input-group-prepend { + margin-right: -1px +} + +.input-group-append { + margin-left: -1px +} + +.input-group-text { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + padding: .375rem .75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6c757d; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #f0f2f5; + border-radius: .25rem +} + +.input-group-text input[type=checkbox], +.input-group-text input[type=radio] { + margin-top: 0 +} + +.input-group-lg>.custom-select, +.input-group-lg>.form-control:not(textarea) { + height: calc(1.5em + 1rem + 2px) +} + +.input-group-lg>.custom-select, +.input-group-lg>.form-control, +.input-group-lg>.input-group-append>.btn, +.input-group-lg>.input-group-append>.input-group-text, +.input-group-lg>.input-group-prepend>.btn, +.input-group-lg>.input-group-prepend>.input-group-text { + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +.input-group-sm>.custom-select, +.input-group-sm>.form-control:not(textarea) { + height: calc(1.5em + .5rem + 2px) +} + +.input-group-sm>.custom-select, +.input-group-sm>.form-control, +.input-group-sm>.input-group-append>.btn, +.input-group-sm>.input-group-append>.input-group-text, +.input-group-sm>.input-group-prepend>.btn, +.input-group-sm>.input-group-prepend>.input-group-text { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.input-group-lg>.custom-select, +.input-group-sm>.custom-select { + padding-right: 1.75rem +} + +.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle), +.input-group>.input-group-append:last-child>.input-group-text:not(:last-child), +.input-group>.input-group-append:not(:last-child)>.btn, +.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group>.input-group-append>.btn, +.input-group>.input-group-append>.input-group-text, +.input-group>.input-group-prepend:first-child>.btn:not(:first-child), +.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child), +.input-group>.input-group-prepend:not(:first-child)>.btn, +.input-group>.input-group-prepend:not(:first-child)>.input-group-text { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.custom-control { + position: relative; + display: block; + min-height: 1.7rem; + padding-left: 1.9rem +} + +.custom-control-inline { + display: -webkit-inline-box; + display: inline-flex; + margin-right: 1rem +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0 +} + +.custom-control-input:checked~.custom-control-label::before { + color: #fff; + border-color: #047006; + background-color: #047006 +} + +.custom-control-input:focus~.custom-control-label::before { + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-control-input:focus:not(:checked)~.custom-control-label::before { + border-color: #80bdff +} + +.custom-control-input:not(:disabled):active~.custom-control-label::before { + color: #fff; + background-color: #b3d7ff; + border-color: #b3d7ff +} + +.custom-control-input:disabled~.custom-control-label { + color: #6c757d +} + +.custom-control-input:disabled~.custom-control-label::before { + background-color: #e9ecef +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top +} + +.custom-control-label::before { + position: absolute; + top: .15rem; + left: -1.9rem; + display: block; + width: 1.4rem; + height: 1.4rem; + pointer-events: none; + content: '0 0 4 5'; + background-color: #fff; + border: #e1e5f1 solid 1px +} + +.custom-control-label::after { + position: absolute; + top: .15rem; + left: -1.9rem; + display: block; + width: 1.4rem; + height: 1.4rem; + content: '%23343a40'; + background: no-repeat 50%/50% 50% +} + +.custom-checkbox .custom-control-label::before { + border-radius: .25rem +} + +.custom-checkbox .custom-control-input:checked~.custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") +} + +.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before { + border-color: #007bff; + background-color: #007bff +} + +.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3c/svg%3e") +} + +.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before { + background-color: rgba(0, 123, 255, .5) +} + +.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before { + background-color: rgba(0, 123, 255, .5) +} + +.custom-radio .custom-control-label::before { + border-radius: 50% +} + +.custom-radio .custom-control-input:checked~.custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3ccircle r=!string!fill=!string!/%3e%3c/svg%3e") +} + +.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before { + background-color: rgba(0, 123, 255, .5) +} + +.custom-switch { + padding-left: 2.8rem +} + +.custom-switch .custom-control-label::before { + left: -2.8rem; + width: 2.3rem; + pointer-events: all; + border-radius: 25px +} + +.custom-switch .custom-control-label::after { + top: calc(.15rem + 2px); + left: calc(-2.8rem + 2px); + width: 1.1rem; + height: 1.1rem; + background-color: #e1e5f1; + border-radius: 25px; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out; + transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .custom-switch .custom-control-label::after { + -webkit-transition: none; + transition: none + } + +} + +.custom-switch .custom-control-input:checked~.custom-control-label::after { + background-color: #fff; + -webkit-transform: translateX(.9rem); + transform: translateX(.9rem) +} + +.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before { + background-color: rgba(0, 123, 255, .5) +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + .75rem + 2px); + padding: .375rem 1.75rem .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: .25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.custom-select:focus { + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-select:focus::-ms-value { + color: #6c757d; + background-color: #f6f7f9 +} + +.custom-select[multiple], +.custom-select[size]:not([size='M2 0L0 2h4zm0 5L0 3h4z']) { + height: auto; + padding-right: .75rem; + background-image: none +} + +.custom-select:disabled { + color: #6c757d; + background-color: #e9ecef +} + +.custom-select::-ms-expand { + display: none +} + +.custom-select-sm { + height: calc(1.5em + .5rem + 2px); + padding-top: .25rem; + padding-bottom: .25rem; + padding-left: .5rem; + font-size: .875rem +} + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: .5rem; + padding-bottom: .5rem; + padding-left: 1rem; + font-size: 1.25rem +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + .75rem + 2px); + margin-bottom: 0 +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + .75rem + 2px); + margin: 0; + opacity: 0 +} + +.custom-file-input:focus~.custom-file-label { + border-color: #80bdff; + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-file-input:disabled~.custom-file-label { + background-color: #e9ecef +} + +.custom-file-input:lang(en)~.custom-file-label::after { + content: 'http://www.w3.org/2000/svg' +} + +.custom-file-input~.custom-file-label[data-browse]::after { + content: attr(data-browse) +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + .75rem + 2px); + padding: .375rem .75rem; + font-weight: 400; + line-height: 1.5; + color: #6c757d; + background-color: #f6f7f9; + border: 1px solid #f0f2f5; + border-radius: .25rem +} + +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + .75rem); + padding: .375rem .75rem; + line-height: 1.5; + color: #495057; + content: '0 0 8 8'; + background-color: #e9ecef; + border-left: inherit; + border-radius: 0 .25rem .25rem 0 +} + +.custom-range { + width: 100%; + height: calc(1rem + .4rem); + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.custom-range:focus { + outline: 0 +} + +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.custom-range::-moz-focus-outer { + border: 0 +} + +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -.25rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -webkit-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion:reduce) { + .custom-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none + } + +} + +.custom-range::-webkit-slider-thumb:active { + background-color: #b3d7ff +} + +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem +} + +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -moz-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion:reduce) { + .custom-range::-moz-range-thumb { + -webkit-transition: none; + transition: none + } + +} + +.custom-range::-moz-range-thumb:active { + background-color: #b3d7ff +} + +.custom-range::-moz-range-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem +} + +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: .2rem; + margin-left: .2rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + appearance: none +} + +@media (prefers-reduced-motion:reduce) { + .custom-range::-ms-thumb { + -webkit-transition: none; + transition: none + } + +} + +.custom-range::-ms-thumb:active { + background-color: #b3d7ff +} + +.custom-range::-ms-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: .5rem +} + +.custom-range::-ms-fill-lower { + background-color: #dee2e6; + border-radius: 1rem +} + +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; + border-radius: 1rem +} + +.custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd +} + +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default +} + +.custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd +} + +.custom-range:disabled::-moz-range-track { + cursor: default +} + +.custom-range:disabled::-ms-thumb { + background-color: #adb5bd +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + -webkit-transition: none; + transition: none + } + +} + +.nav { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.nav-link { + display: block; + padding: .5rem 1rem +} + +.nav-link:focus, +.nav-link:hover { + text-decoration: none +} + +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6 +} + +.nav-tabs .nav-item { + margin-bottom: -1px +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 2px; + border-top-right-radius: 2px +} + +.nav-tabs .nav-link:focus, +.nav-tabs .nav-link:hover { + border-color: #e9ecef #e9ecef #dee2e6 +} + +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent +} + +.nav-tabs .nav-item.show .nav-link, +.nav-tabs .nav-link.active { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.nav-pills .nav-link { + border-radius: 2px +} + +.nav-pills .nav-link.active, +.nav-pills .show>.nav-link { + color: #fff; + background-color: #007bff +} + +.nav-fill .nav-item { + -webkit-box-flex: 1; + flex: 1 1 auto; + text-align: center +} + +.nav-justified .nav-item { + flex-basis: 0; + -webkit-box-flex: 1; + flex-grow: 1; + text-align: center +} + +.tab-content>.tab-pane { + display: none +} + +.tab-content>.active { + display: block +} + +.navbar { + position: relative; + display: -webkit-box; + display: flex; + flex-wrap: wrap; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: justify; + justify-content: space-between; + padding: .5rem 1rem +} + +.navbar>.container, +.navbar>.container-fluid { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: justify; + justify-content: space-between +} + +.navbar-brand { + display: inline-block; + padding-top: .3125rem; + padding-bottom: .3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap +} + +.navbar-brand:focus, +.navbar-brand:hover { + text-decoration: none +} + +.navbar-nav { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0 +} + +.navbar-nav .dropdown-menu { + position: static; + float: none +} + +.navbar-text { + display: inline-block; + padding-top: .5rem; + padding-bottom: .5rem +} + +.navbar-collapse { + flex-basis: 100%; + -webkit-box-flex: 1; + flex-grow: 1; + -webkit-box-align: center; + align-items: center +} + +.navbar-toggler { + padding: .25rem .75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: .25rem +} + +.navbar-toggler:focus, +.navbar-toggler:hover { + text-decoration: none +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: '%2328a745'; + background: no-repeat center center; + background-size: 100% 100% +} + +@media (max-width:575.98px) { + .navbar-expand-sm>.container, + .navbar-expand-sm>.container-fluid { + padding-right: 0; + padding-left: 0 + } + +} + +@media (min-width:576px) { + .navbar-expand-sm { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row nowrap; + -webkit-box-pack: start; + justify-content: flex-start + } + + .navbar-expand-sm .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-sm>.container, + .navbar-expand-sm>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-sm .navbar-collapse { + display: -webkit-box !important; + display: flex !important; + flex-basis: auto + } + + .navbar-expand-sm .navbar-toggler { + display: none + } + +} + +@media (max-width:767.98px) { + .navbar-expand-md>.container, + .navbar-expand-md>.container-fluid { + padding-right: 0; + padding-left: 0 + } + +} + +@media (min-width:768px) { + .navbar-expand-md { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row nowrap; + -webkit-box-pack: start; + justify-content: flex-start + } + + .navbar-expand-md .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-md .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-md>.container, + .navbar-expand-md>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-md .navbar-collapse { + display: -webkit-box !important; + display: flex !important; + flex-basis: auto + } + + .navbar-expand-md .navbar-toggler { + display: none + } + +} + +@media (max-width:991.98px) { + .navbar-expand-lg>.container, + .navbar-expand-lg>.container-fluid { + padding-right: 0; + padding-left: 0 + } + +} + +@media (min-width:992px) { + .navbar-expand-lg { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row nowrap; + -webkit-box-pack: start; + justify-content: flex-start + } + + .navbar-expand-lg .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-lg>.container, + .navbar-expand-lg>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-lg .navbar-collapse { + display: -webkit-box !important; + display: flex !important; + flex-basis: auto + } + + .navbar-expand-lg .navbar-toggler { + display: none + } + +} + +@media (max-width:1199.98px) { + .navbar-expand-xl>.container, + .navbar-expand-xl>.container-fluid { + padding-right: 0; + padding-left: 0 + } + +} + +@media (min-width:1200px) { + .navbar-expand-xl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row nowrap; + -webkit-box-pack: start; + justify-content: flex-start + } + + .navbar-expand-xl .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute + } + + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + + .navbar-expand-xl>.container, + .navbar-expand-xl>.container-fluid { + flex-wrap: nowrap + } + + .navbar-expand-xl .navbar-collapse { + display: -webkit-box !important; + display: flex !important; + flex-basis: auto + } + + .navbar-expand-xl .navbar-toggler { + display: none + } + +} + +.navbar-expand { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row nowrap; + -webkit-box-pack: start; + justify-content: flex-start +} + +.navbar-expand>.container, +.navbar-expand>.container-fluid { + padding-right: 0; + padding-left: 0 +} + +.navbar-expand .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem +} + +.navbar-expand>.container, +.navbar-expand>.container-fluid { + flex-wrap: nowrap +} + +.navbar-expand .navbar-collapse { + display: -webkit-box !important; + display: flex !important; + flex-basis: auto +} + +.navbar-expand .navbar-toggler { + display: none +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-brand:focus, +.navbar-light .navbar-brand:hover { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, .5) +} + +.navbar-light .navbar-nav .nav-link:focus, +.navbar-light .navbar-nav .nav-link:hover { + color: rgba(0, 0, 0, .7) +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, .3) +} + +.navbar-light .navbar-nav .active>.nav-link, +.navbar-light .navbar-nav .nav-link.active, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .show>.nav-link { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, .5); + border-color: rgba(0, 0, 0, .1) +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e") +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, .5) +} + +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-text a:focus, +.navbar-light .navbar-text a:hover { + color: rgba(0, 0, 0, .9) +} + +.navbar-dark .navbar-brand { + color: #fff +} + +.navbar-dark .navbar-brand:focus, +.navbar-dark .navbar-brand:hover { + color: #fff +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, .5) +} + +.navbar-dark .navbar-nav .nav-link:focus, +.navbar-dark .navbar-nav .nav-link:hover { + color: rgba(255, 255, 255, .75) +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, .25) +} + +.navbar-dark .navbar-nav .active>.nav-link, +.navbar-dark .navbar-nav .nav-link.active, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .show>.nav-link { + color: #fff +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, .5); + border-color: rgba(255, 255, 255, .1) +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e") +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, .5) +} + +.navbar-dark .navbar-text a { + color: #fff +} + +.navbar-dark .navbar-text a:focus, +.navbar-dark .navbar-text a:hover { + color: #fff +} + +.card { + position: relative; + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(238, 238, 238, .75); + border-radius: .25rem +} + +.card>hr { + margin-right: 0; + margin-left: 0 +} + +.card>.list-group:first-child .list-group-item:first-child { + border-top-left-radius: .25rem; + border-top-right-radius: .25rem +} + +.card>.list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: .25rem; + border-bottom-left-radius: .25rem +} + +.card-body { + -webkit-box-flex: 1; + flex: 1 1 auto; + padding: 1.25rem +} + +.card-title { + margin-bottom: .75rem +} + +.card-subtitle { + margin-top: -.375rem; + margin-bottom: 0 +} + +.card-text:last-child { + margin-bottom: 0 +} + +.card-link:hover { + text-decoration: none +} + +.card-link+.card-link { + margin-left: 1.25rem +} + +.card-header { + padding: .75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, .03); + border-bottom: 1px solid rgba(238, 238, 238, .75) +} + +.card-header:first-child { + border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0 +} + +.card-header+.list-group .list-group-item:first-child { + border-top: 0 +} + +.card-footer { + padding: .75rem 1.25rem; + background-color: rgba(0, 0, 0, .03); + border-top: 1px solid rgba(238, 238, 238, .75) +} + +.card-footer:last-child { + border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px) +} + +.card-header-tabs { + margin-right: -.625rem; + margin-bottom: -.75rem; + margin-left: -.625rem; + border-bottom: 0 +} + +.card-header-pills { + margin-right: -.625rem; + margin-left: -.625rem +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem +} + +.card-img { + width: 100%; + border-radius: calc(.25rem - 1px) +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(.25rem - 1px); + border-top-right-radius: calc(.25rem - 1px) +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(.25rem - 1px); + border-bottom-left-radius: calc(.25rem - 1px) +} + +.card-deck { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column +} + +.card-deck .card { + margin-bottom: 15px +} + +@media (min-width:576px) { + .card-deck { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px + } + + .card-deck .card { + display: -webkit-box; + display: flex; + -webkit-box-flex: 1; + flex: 1 0 0%; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px + } + +} + +.card-group { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column +} + +.card-group>.card { + margin-bottom: 15px +} + +@media (min-width:576px) { + .card-group { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-flow: row wrap + } + + .card-group>.card { + -webkit-box-flex: 1; + flex: 1 0 0%; + margin-bottom: 0 + } + + .card-group>.card+.card { + margin-left: 0; + border-left: 0 + } + + .card-group>.card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 + } + + .card-group>.card:not(:last-child) .card-header, + .card-group>.card:not(:last-child) .card-img-top { + border-top-right-radius: 0 + } + + .card-group>.card:not(:last-child) .card-footer, + .card-group>.card:not(:last-child) .card-img-bottom { + border-bottom-right-radius: 0 + } + + .card-group>.card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 + } + + .card-group>.card:not(:first-child) .card-header, + .card-group>.card:not(:first-child) .card-img-top { + border-top-left-radius: 0 + } + + .card-group>.card:not(:first-child) .card-footer, + .card-group>.card:not(:first-child) .card-img-bottom { + border-bottom-left-radius: 0 + } + +} + +.card-columns .card { + margin-bottom: .75rem +} + +@media (min-width:576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1 + } + + .card-columns .card { + display: inline-block; + width: 100% + } + +} + +.accordion>.card { + overflow: hidden +} + +.accordion>.card:not(:first-of-type) .card-header:first-child { + border-radius: 0 +} + +.accordion>.card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0 +} + +.accordion>.card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.accordion>.card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.accordion>.card .card-header { + margin-bottom: -1px +} + +.breadcrumb { + display: -webkit-box; + display: flex; + flex-wrap: wrap; + padding: .75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #f7f9fa; + border-radius: .25rem +} + +.breadcrumb-item+.breadcrumb-item { + padding-left: .5rem +} + +.breadcrumb-item+.breadcrumb-item::before { + display: inline-block; + padding-right: .5rem; + color: #a8a9ad; + content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z' +} + +.breadcrumb-item+.breadcrumb-item:hover::before { + text-decoration: underline +} + +.breadcrumb-item+.breadcrumb-item:hover::before { + text-decoration: none +} + +.breadcrumb-item.active { + color: #6c757d +} + +.pagination { + display: -webkit-box; + display: flex; + padding-left: 0; + list-style: none; + border-radius: 2px +} + +.page-link { + position: relative; + display: block; + padding: .5rem .75rem; + margin-left: -1px; + line-height: 1.25; + color: #007bff; + background-color: #fff; + border: 1px solid #dee2e6 +} + +.page-link:hover { + z-index: 2; + color: #0056b3; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6 +} + +.page-link:focus { + z-index: 2; + outline: 0; + box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px +} + +.page-item:last-child .page-link { + border-top-right-radius: 2px; + border-bottom-right-radius: 2px +} + +.page-item.active .page-link { + z-index: 1; + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6 +} + +.pagination-lg .page-link { + padding: .75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5 +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px +} + +.pagination-sm .page-link { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5 +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: .2rem; + border-bottom-left-radius: .2rem +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: .2rem; + border-bottom-right-radius: .2rem +} + +.badge { + display: inline-block; + padding: .45rem 1rem; + font-size: 80%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25rem; + -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .badge { + -webkit-transition: none; + transition: none + } + +} + +a.badge:focus, +a.badge:hover { + text-decoration: none +} + +.badge:empty { + display: none +} + +.btn .badge { + position: relative; + top: -1px +} + +.badge-pill { + padding-right: .5rem; + padding-left: .5rem; + border-radius: 10rem +} + +.badge-primary { + color: #fff; + background-color: #047006 +} + +a.badge-primary:focus, +a.badge-primary:hover { + color: #fff; + background-color: #023f03 +} + +a.badge-primary.focus, +a.badge-primary:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) +} + +.badge-secondary { + color: #fff; + background-color: grey +} + +a.badge-secondary:focus, +a.badge-secondary:hover { + color: #fff; + background-color: #676767 +} + +a.badge-secondary.focus, +a.badge-secondary:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) +} + +.badge-success { + color: #fff; + background-color: #047006 +} + +a.badge-success:focus, +a.badge-success:hover { + color: #fff; + background-color: #00ad72 +} + +a.badge-success.focus, +a.badge-success:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) +} + +.badge-info { + color: #fff; + background-color: #6c61f6 +} + +a.badge-info:focus, +a.badge-info:hover { + color: #fff; + background-color: #3f31f3 +} + +a.badge-info.focus, +a.badge-info:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) +} + +.badge-warning { + color: #212529; + background-color: #f0825f +} + +a.badge-warning:focus, +a.badge-warning:hover { + color: #212529; + background-color: #ec5e30 +} + +a.badge-warning.focus, +a.badge-warning:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) +} + +.badge-danger { + color: #fff; + background-color: #ff5f66 +} + +a.badge-danger:focus, +a.badge-danger:hover { + color: #fff; + background-color: #ff2c35 +} + +a.badge-danger.focus, +a.badge-danger:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) +} + +.badge-light { + color: #212529; + background-color: #dfdfdf +} + +a.badge-light:focus, +a.badge-light:hover { + color: #212529; + background-color: #c6c6c6 +} + +a.badge-light.focus, +a.badge-light:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) +} + +.badge-dark { + color: #fff; + background-color: #74767b +} + +a.badge-dark:focus, +a.badge-dark:hover { + color: #fff; + background-color: #5b5d61 +} + +a.badge-dark.focus, +a.badge-dark:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) +} + +.badge-white { + color: #212529; + background-color: #fff +} + +a.badge-white:focus, +a.badge-white:hover { + color: #212529; + background-color: #e6e6e6 +} + +a.badge-white.focus, +a.badge-white:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 6px +} + +@media (min-width:576px) { + .jumbotron { + padding: 4rem 2rem + } + +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0 +} + +.alert { + position: relative; + padding: 1.15rem 1.15rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 2px +} + +.alert-heading { + color: inherit +} + +.alert-link { + font-weight: 700 +} + +.alert-dismissible { + padding-right: 3.8rem +} + +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 1.15rem 1.15rem; + color: inherit +} + +.alert-primary { + color: #023a03; + background-color: #cde2cd; + border-color: #b9d7b9 +} + +.alert-primary hr { + border-top-color: #a9cea9 +} + +.alert-primary .alert-link { + color: #000900 +} + +.alert-secondary { + color: #434343; + background-color: #e6e6e6; + border-color: #dbdbdb +} + +.alert-secondary hr { + border-top-color: #cecece +} + +.alert-secondary .alert-link { + color: #2a2a2a +} + +.alert-success { + color: #00744c; + background-color: #ccf9e9; + border-color: #b8f6e1 +} + +.alert-success hr { + border-top-color: #a1f3d7 +} + +.alert-success .alert-link { + color: #00412b +} + +.alert-info { + color: #383280; + background-color: #e2dffd; + border-color: #d6d3fc +} + +.alert-info hr { + border-top-color: #c0bbfa +} + +.alert-info .alert-link { + color: #28245b +} + +.alert-warning { + color: #7d4431; + background-color: #fce6df; + border-color: #fbdcd2 +} + +.alert-warning hr { + border-top-color: #f9cabb +} + +.alert-warning .alert-link { + color: #583023 +} + +.alert-danger { + color: #853135; + background-color: #ffdfe0; + border-color: #ffd2d4 +} + +.alert-danger hr { + border-top-color: #ffb9bc +} + +.alert-danger .alert-link { + color: #602326 +} + +.alert-light { + color: #747474; + background-color: #f9f9f9; + border-color: #f6f6f6 +} + +.alert-light hr { + border-top-color: #e9e9e9 +} + +.alert-light .alert-link { + color: #5b5b5b +} + +.alert-dark { + color: #3c3d40; + background-color: #e3e4e5; + border-color: #d8d9da +} + +.alert-dark hr { + border-top-color: #cbccce +} + +.alert-dark .alert-link { + color: #232426 +} + +.alert-white { + color: #858585; + background-color: #fff; + border-color: #fff +} + +.alert-white hr { + border-top-color: #f2f2f2 +} + +.alert-white .alert-link { + color: #6c6c6c +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0 + } + + to { + background-position: 0 0 + } + +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0 + } + + to { + background-position: 0 0 + } + +} + +.progress { + display: -webkit-box; + display: flex; + height: 1rem; + overflow: hidden; + font-size: .75rem; + background-color: #f3f5f7; + border-radius: 2px +} + +.progress-bar { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + -webkit-box-pack: center; + justify-content: center; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #007bff; + -webkit-transition: width .6s ease; + transition: width .6s ease +} + +@media (prefers-reduced-motion:reduce) { + .progress-bar { + -webkit-transition: none; + transition: none + } + +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem +} + +.progress-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite +} + +@media (prefers-reduced-motion:reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none + } + +} + +.media { + display: -webkit-box; + display: flex; + -webkit-box-align: start; + align-items: flex-start +} + +.media-body { + -webkit-box-flex: 1; + flex: 1 +} + +.list-group { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + padding-left: 0; + margin-bottom: 0 +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit +} + +.list-group-item-action:focus, +.list-group-item-action:hover { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa +} + +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef +} + +.list-group-item { + position: relative; + display: block; + padding: .75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, .125) +} + +.list-group-item:first-child { + border-top-left-radius: .25rem; + border-top-right-radius: .25rem +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: .25rem +} + +.list-group-item.disabled, +.list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.list-group-horizontal { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row +} + +.list-group-horizontal .list-group-item { + margin-right: -1px; + margin-bottom: 0 +} + +.list-group-horizontal .list-group-item:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 +} + +.list-group-horizontal .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: 0 +} + +@media (min-width:576px) { + .list-group-horizontal-sm { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .list-group-horizontal-sm .list-group-item { + margin-right: -1px; + margin-bottom: 0 + } + + .list-group-horizontal-sm .list-group-item:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-sm .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: 0 + } + +} + +@media (min-width:768px) { + .list-group-horizontal-md { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .list-group-horizontal-md .list-group-item { + margin-right: -1px; + margin-bottom: 0 + } + + .list-group-horizontal-md .list-group-item:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-md .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: 0 + } + +} + +@media (min-width:992px) { + .list-group-horizontal-lg { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .list-group-horizontal-lg .list-group-item { + margin-right: -1px; + margin-bottom: 0 + } + + .list-group-horizontal-lg .list-group-item:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-lg .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: 0 + } + +} + +@media (min-width:1200px) { + .list-group-horizontal-xl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row + } + + .list-group-horizontal-xl .list-group-item { + margin-right: -1px; + margin-bottom: 0 + } + + .list-group-horizontal-xl .list-group-item:first-child { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-xl .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: 0 + } + +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0 +} + +.list-group-flush .list-group-item:last-child { + margin-bottom: -1px +} + +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0 +} + +.list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; + border-bottom: 0 +} + +.list-group-item-primary { + color: #023a03; + background-color: #b9d7b9 +} + +.list-group-item-primary.list-group-item-action:focus, +.list-group-item-primary.list-group-item-action:hover { + color: #023a03; + background-color: #a9cea9 +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #023a03; + border-color: #023a03 +} + +.list-group-item-secondary { + color: #434343; + background-color: #dbdbdb +} + +.list-group-item-secondary.list-group-item-action:focus, +.list-group-item-secondary.list-group-item-action:hover { + color: #434343; + background-color: #cecece +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #434343; + border-color: #434343 +} + +.list-group-item-success { + color: #00744c; + background-color: #b8f6e1 +} + +.list-group-item-success.list-group-item-action:focus, +.list-group-item-success.list-group-item-action:hover { + color: #00744c; + background-color: #a1f3d7 +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #00744c; + border-color: #00744c +} + +.list-group-item-info { + color: #383280; + background-color: #d6d3fc +} + +.list-group-item-info.list-group-item-action:focus, +.list-group-item-info.list-group-item-action:hover { + color: #383280; + background-color: #c0bbfa +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #383280; + border-color: #383280 +} + +.list-group-item-warning { + color: #7d4431; + background-color: #fbdcd2 +} + +.list-group-item-warning.list-group-item-action:focus, +.list-group-item-warning.list-group-item-action:hover { + color: #7d4431; + background-color: #f9cabb +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #7d4431; + border-color: #7d4431 +} + +.list-group-item-danger { + color: #853135; + background-color: #ffd2d4 +} + +.list-group-item-danger.list-group-item-action:focus, +.list-group-item-danger.list-group-item-action:hover { + color: #853135; + background-color: #ffb9bc +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #853135; + border-color: #853135 +} + +.list-group-item-light { + color: #747474; + background-color: #f6f6f6 +} + +.list-group-item-light.list-group-item-action:focus, +.list-group-item-light.list-group-item-action:hover { + color: #747474; + background-color: #e9e9e9 +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #747474; + border-color: #747474 +} + +.list-group-item-dark { + color: #3c3d40; + background-color: #d8d9da +} + +.list-group-item-dark.list-group-item-action:focus, +.list-group-item-dark.list-group-item-action:hover { + color: #3c3d40; + background-color: #cbccce +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #3c3d40; + border-color: #3c3d40 +} + +.list-group-item-white { + color: #858585; + background-color: #fff +} + +.list-group-item-white.list-group-item-action:focus, +.list-group-item-white.list-group-item-action:hover { + color: #858585; + background-color: #f2f2f2 +} + +.list-group-item-white.list-group-item-action.active { + color: #fff; + background-color: #858585; + border-color: #858585 +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5 +} + +.close:hover { + color: #000; + text-decoration: none +} + +.close:not(:disabled):not(.disabled):focus, +.close:not(:disabled):not(.disabled):hover { + opacity: .75 +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +a.close.disabled { + pointer-events: none +} + +.toast { + max-width: 350px; + overflow: hidden; + font-size: .875rem; + background-color: rgba(255, 255, 255, .85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .1); + box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .1); + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + opacity: 0; + border-radius: .25rem +} + +.toast:not(:last-child) { + margin-bottom: .75rem +} + +.toast.showing { + opacity: 1 +} + +.toast.show { + display: block; + opacity: 1 +} + +.toast.hide { + display: none +} + +.toast-header { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + padding: .25rem .75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, .85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, .05) +} + +.toast-body { + padding: .75rem +} + +.modal-open { + overflow: hidden +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0 +} + +.modal-dialog { + position: relative; + width: auto; + margin: .5rem; + pointer-events: none +} + +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + transition: -webkit-transform .3s ease-out; + transition: transform .3s ease-out; + transition: transform .3s ease-out, -webkit-transform .3s ease-out; + -webkit-transform: translate(0, -50px); + transform: translate(0, -50px) +} + +@media (prefers-reduced-motion:reduce) { + .modal.fade .modal-dialog { + -webkit-transition: none; + transition: none + } + +} + +.modal.show .modal-dialog { + -webkit-transform: none; + transform: none +} + +.modal-dialog-scrollable { + display: -webkit-box; + display: flex; + max-height: calc(100% - 1rem) +} + +.modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden +} + +.modal-dialog-scrollable .modal-footer, +.modal-dialog-scrollable .modal-header { + flex-shrink: 0 +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto +} + +.modal-dialog-centered { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + min-height: calc(100% - 1rem) +} + +.modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + content: 'http://www.w3.org/2000/svg' +} + +.modal-dialog-centered.modal-dialog-scrollable { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + -webkit-box-pack: center; + justify-content: center; + height: 100% +} + +.modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none +} + +.modal-dialog-centered.modal-dialog-scrollable::before { + content: none +} + +.modal-content { + position: relative; + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: .3rem; + outline: 0 +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000 +} + +.modal-backdrop.fade { + opacity: 0 +} + +.modal-backdrop.show { + opacity: .8 +} + +.modal-header { + display: -webkit-box; + display: flex; + -webkit-box-align: start; + align-items: flex-start; + -webkit-box-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: .3rem; + border-top-right-radius: .3rem +} + +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5 +} + +.modal-body { + position: relative; + -webkit-box-flex: 1; + flex: 1 1 auto; + padding: 1rem +} + +.modal-footer { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: end; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: .3rem; + border-bottom-left-radius: .3rem +} + +.modal-footer>:not(:first-child) { + margin-left: .25rem +} + +.modal-footer>:not(:last-child) { + margin-right: .25rem +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll +} + +@media (min-width:576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto + } + + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem) + } + + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem) + } + + .modal-dialog-centered { + min-height: calc(100% - 3.5rem) + } + + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem) + } + + .modal-sm { + max-width: 300px + } + +} + +@media (min-width:992px) { + .modal-lg, + .modal-xl { + max-width: 800px + } + +} + +@media (min-width:1200px) { + .modal-xl { + max-width: 1140px + } + +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.7; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: .875rem; + word-wrap: break-word; + opacity: 0 +} + +.tooltip.show { + opacity: .9 +} + +.tooltip .arrow { + position: absolute; + display: block; + width: .8rem; + height: .4rem +} + +.tooltip .arrow::before { + position: absolute; + content: '%23dc3545'; + border-color: transparent; + border-style: solid +} + +.bs-tooltip-auto[x-placement^=top], +.bs-tooltip-top { + padding: .4rem 0 +} + +.bs-tooltip-auto[x-placement^=top] .arrow, +.bs-tooltip-top .arrow { + bottom: 0 +} + +.bs-tooltip-auto[x-placement^=top] .arrow::before, +.bs-tooltip-top .arrow::before { + top: 0; + border-width: .4rem .4rem 0; + border-top-color: #000 +} + +.bs-tooltip-auto[x-placement^=right], +.bs-tooltip-right { + padding: 0 .4rem +} + +.bs-tooltip-auto[x-placement^=right] .arrow, +.bs-tooltip-right .arrow { + left: 0; + width: .4rem; + height: .8rem +} + +.bs-tooltip-auto[x-placement^=right] .arrow::before, +.bs-tooltip-right .arrow::before { + right: 0; + border-width: .4rem .4rem .4rem 0; + border-right-color: #000 +} + +.bs-tooltip-auto[x-placement^=bottom], +.bs-tooltip-bottom { + padding: .4rem 0 +} + +.bs-tooltip-auto[x-placement^=bottom] .arrow, +.bs-tooltip-bottom .arrow { + top: 0 +} + +.bs-tooltip-auto[x-placement^=bottom] .arrow::before, +.bs-tooltip-bottom .arrow::before { + bottom: 0; + border-width: 0 .4rem .4rem; + border-bottom-color: #000 +} + +.bs-tooltip-auto[x-placement^=left], +.bs-tooltip-left { + padding: 0 .4rem +} + +.bs-tooltip-auto[x-placement^=left] .arrow, +.bs-tooltip-left .arrow { + right: 0; + width: .4rem; + height: .8rem +} + +.bs-tooltip-auto[x-placement^=left] .arrow::before, +.bs-tooltip-left .arrow::before { + left: 0; + border-width: .4rem 0 .4rem .4rem; + border-left-color: #000 +} + +.tooltip-inner { + max-width: 200px; + padding: .25rem .5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: .25rem +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.7; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: .875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: .3rem +} + +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: .5rem; + margin: 0 6px +} + +.popover .arrow::after, +.popover .arrow::before { + position: absolute; + display: block; + content: '-2 -2 7 7'; + border-color: transparent; + border-style: solid +} + +.bs-popover-auto[x-placement^=top], +.bs-popover-top { + margin-bottom: .5rem +} + +.bs-popover-auto[x-placement^=top]>.arrow, +.bs-popover-top>.arrow { + bottom: calc((.5rem + 1px) * -1) +} + +.bs-popover-auto[x-placement^=top]>.arrow::before, +.bs-popover-top>.arrow::before { + bottom: 0; + border-width: .5rem .5rem 0; + border-top-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[x-placement^=top]>.arrow::after, +.bs-popover-top>.arrow::after { + bottom: 1px; + border-width: .5rem .5rem 0; + border-top-color: #fff +} + +.bs-popover-auto[x-placement^=right], +.bs-popover-right { + margin-left: .5rem +} + +.bs-popover-auto[x-placement^=right]>.arrow, +.bs-popover-right>.arrow { + left: calc((.5rem + 1px) * -1); + width: .5rem; + height: 1rem; + margin: 6px 0 +} + +.bs-popover-auto[x-placement^=right]>.arrow::before, +.bs-popover-right>.arrow::before { + left: 0; + border-width: .5rem .5rem .5rem 0; + border-right-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[x-placement^=right]>.arrow::after, +.bs-popover-right>.arrow::after { + left: 1px; + border-width: .5rem .5rem .5rem 0; + border-right-color: #fff +} + +.bs-popover-auto[x-placement^=bottom], +.bs-popover-bottom { + margin-top: .5rem +} + +.bs-popover-auto[x-placement^=bottom]>.arrow, +.bs-popover-bottom>.arrow { + top: calc((.5rem + 1px) * -1) +} + +.bs-popover-auto[x-placement^=bottom]>.arrow::before, +.bs-popover-bottom>.arrow::before { + top: 0; + border-width: 0 .5rem .5rem .5rem; + border-bottom-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[x-placement^=bottom]>.arrow::after, +.bs-popover-bottom>.arrow::after { + top: 1px; + border-width: 0 .5rem .5rem .5rem; + border-bottom-color: #fff +} + +.bs-popover-auto[x-placement^=bottom] .popover-header::before, +.bs-popover-bottom .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -.5rem; + content: '%23dc3545'; + border-bottom: 1px solid #f7f7f7 +} + +.bs-popover-auto[x-placement^=left], +.bs-popover-left { + margin-right: .5rem +} + +.bs-popover-auto[x-placement^=left]>.arrow, +.bs-popover-left>.arrow { + right: calc((.5rem + 1px) * -1); + width: .5rem; + height: 1rem; + margin: 6px 0 +} + +.bs-popover-auto[x-placement^=left]>.arrow::before, +.bs-popover-left>.arrow::before { + right: 0; + border-width: .5rem 0 .5rem .5rem; + border-left-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[x-placement^=left]>.arrow::after, +.bs-popover-left>.arrow::after { + right: 1px; + border-width: .5rem 0 .5rem .5rem; + border-left-color: #fff +} + +.popover-header { + padding: .5rem .75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(6px - 1px); + border-top-right-radius: calc(6px - 1px) +} + +.popover-header:empty { + display: none +} + +.popover-body { + padding: .5rem .75rem; + color: #212529 +} + +.carousel { + position: relative +} + +.carousel.pointer-event { + touch-action: pan-y +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} + +.carousel-inner::after { + display: block; + clear: both; + content: 'M0 0l3 3m0-3L0 3' +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transition: -webkit-transform .6s ease-in-out; + transition: -webkit-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + transition: transform .6s ease-in-out, -webkit-transform .6s ease-in-out +} + +@media (prefers-reduced-motion:reduce) { + .carousel-item { + -webkit-transition: none; + transition: none + } + +} + +.carousel-item-next, +.carousel-item-prev, +.carousel-item.active { + display: block +} + +.active.carousel-item-right, +.carousel-item-next:not(.carousel-item-left) { + -webkit-transform: translateX(100%); + transform: translateX(100%) +} + +.active.carousel-item-left, +.carousel-item-prev:not(.carousel-item-right) { + -webkit-transform: translateX(-100%); + transform: translateX(-100%) +} + +.carousel-fade .carousel-item { + opacity: 0; + -webkit-transition-property: opacity; + transition-property: opacity; + -webkit-transform: none; + transform: none +} + +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right, +.carousel-fade .carousel-item.active { + z-index: 1; + opacity: 1 +} + +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + -webkit-transition: 0s .6s opacity; + transition: 0s .6s opacity +} + +@media (prefers-reduced-motion:reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + -webkit-transition: none; + transition: none + } + +} + +.carousel-control-next, +.carousel-control-prev { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: .5; + -webkit-transition: opacity .15s ease; + transition: opacity .15s ease +} + +@media (prefers-reduced-motion:reduce) { + .carousel-control-next, + .carousel-control-prev { + -webkit-transition: none; + transition: none + } + +} + +.carousel-control-next:focus, +.carousel-control-next:hover, +.carousel-control-prev:focus, +.carousel-control-prev:hover { + color: #fff; + text-decoration: none; + outline: 0; + opacity: .9 +} + +.carousel-control-prev { + left: 0 +} + +.carousel-control-next { + right: 0 +} + +.carousel-control-next-icon, +.carousel-control-prev-icon { + display: inline-block; + width: 20px; + height: 20px; + background: no-repeat 50%/100% 100% +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e") +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e") +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: -webkit-box; + display: flex; + -webkit-box-pack: center; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none +} + +.carousel-indicators li { + box-sizing: content-box; + -webkit-box-flex: 0; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + -webkit-transition: opacity .6s ease; + transition: opacity .6s ease +} + +@media (prefers-reduced-motion:reduce) { + .carousel-indicators li { + -webkit-transition: none; + transition: none + } + +} + +.carousel-indicators .active { + opacity: 1 +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center +} + +@-webkit-keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } + +} + +@keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } + +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: .25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: spinner-border .75s linear infinite; + animation: spinner-border .75s linear infinite +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: .2em +} + +@-webkit-keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0) + } + + 50% { + opacity: 1 + } + +} + +@keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0) + } + + 50% { + opacity: 1 + } + +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: spinner-grow .75s linear infinite; + animation: spinner-grow .75s linear infinite +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem +} + +.align-baseline { + vertical-align: baseline !important +} + +.align-top { + vertical-align: top !important +} + +.align-middle { + vertical-align: middle !important +} + +.align-bottom { + vertical-align: bottom !important +} + +.align-text-bottom { + vertical-align: text-bottom !important +} + +.align-text-top { + vertical-align: text-top !important +} + +.bg-primary { + background-color: #047006 !important +} + +a.bg-primary:focus, +a.bg-primary:hover, +button.bg-primary:focus, +button.bg-primary:hover { + background-color: #023f03 !important +} + +.bg-secondary { + background-color: grey !important +} + +a.bg-secondary:focus, +a.bg-secondary:hover, +button.bg-secondary:focus, +button.bg-secondary:hover { + background-color: #676767 !important +} + +.bg-success { + background-color: #047006 !important +} + +a.bg-success:focus, +a.bg-success:hover, +button.bg-success:focus, +button.bg-success:hover { + background-color: #00ad72 !important +} + +.bg-info { + background-color: #6c61f6 !important +} + +a.bg-info:focus, +a.bg-info:hover, +button.bg-info:focus, +button.bg-info:hover { + background-color: #3f31f3 !important +} + +.bg-warning { + background-color: #f0825f !important +} + +a.bg-warning:focus, +a.bg-warning:hover, +button.bg-warning:focus, +button.bg-warning:hover { + background-color: #ec5e30 !important +} + +.bg-danger { + background-color: #ff5f66 !important +} + +a.bg-danger:focus, +a.bg-danger:hover, +button.bg-danger:focus, +button.bg-danger:hover { + background-color: #ff2c35 !important +} + +.bg-light { + background-color: #dfdfdf !important +} + +a.bg-light:focus, +a.bg-light:hover, +button.bg-light:focus, +button.bg-light:hover { + background-color: #c6c6c6 !important +} + +.bg-dark { + background-color: #74767b !important +} + +a.bg-dark:focus, +a.bg-dark:hover, +button.bg-dark:focus, +button.bg-dark:hover { + background-color: #5b5d61 !important +} + +.bg-white { + background-color: #fff !important +} + +a.bg-white:focus, +a.bg-white:hover, +button.bg-white:focus, +button.bg-white:hover { + background-color: #e6e6e6 !important +} + +.bg-white { + background-color: #fff !important +} + +.bg-transparent { + background-color: transparent !important +} + +.border { + border: 1px solid #f2f4f9 !important +} + +.border-top { + border-top: 1px solid #f2f4f9 !important +} + +.border-right { + border-right: 1px solid #f2f4f9 !important +} + +.border-bottom { + border-bottom: 1px solid #f2f4f9 !important +} + +.border-left { + border-left: 1px solid #f2f4f9 !important +} + +.border-0 { + border: 0 !important +} + +.border-top-0 { + border-top: 0 !important +} + +.border-right-0 { + border-right: 0 !important +} + +.border-bottom-0 { + border-bottom: 0 !important +} + +.border-left-0 { + border-left: 0 !important +} + +.border-primary { + border-color: #047006 !important +} + +.border-secondary { + border-color: grey !important +} + +.border-success { + border-color: #047006 !important +} + +.border-info { + border-color: #6c61f6 !important +} + +.border-warning { + border-color: #f0825f !important +} + +.border-danger { + border-color: #ff5f66 !important +} + +.border-light { + border-color: #dfdfdf !important +} + +.border-dark { + border-color: #74767b !important +} + +.border-white { + border-color: #fff !important +} + +.border-white { + border-color: #fff !important +} + +.rounded-sm { + border-radius: .2rem !important +} + +.rounded { + border-radius: 2px !important +} + +.rounded-top { + border-top-left-radius: 2px !important; + border-top-right-radius: 2px !important +} + +.rounded-right { + border-top-right-radius: 2px !important; + border-bottom-right-radius: 2px !important +} + +.rounded-bottom { + border-bottom-right-radius: 2px !important; + border-bottom-left-radius: 2px !important +} + +.rounded-left { + border-top-left-radius: 2px !important; + border-bottom-left-radius: 2px !important +} + +.rounded-lg { + border-radius: 6px !important +} + +.rounded-circle { + border-radius: 50% !important +} + +.rounded-pill { + border-radius: 50rem !important +} + +.rounded-0 { + border-radius: 0 !important +} + +.clearfix::after { + display: block; + clear: both; + content: '.5' +} + +.d-none { + display: none !important +} + +.d-inline { + display: inline !important +} + +.d-inline-block { + display: inline-block !important +} + +.d-block { + display: block !important +} + +.d-table { + display: table !important +} + +.d-table-row { + display: table-row !important +} + +.d-table-cell { + display: table-cell !important +} + +.d-flex { + display: -webkit-box !important; + display: flex !important +} + +.d-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important +} + +@media (min-width:576px) { + .d-sm-none { + display: none !important + } + + .d-sm-inline { + display: inline !important + } + + .d-sm-inline-block { + display: inline-block !important + } + + .d-sm-block { + display: block !important + } + + .d-sm-table { + display: table !important + } + + .d-sm-table-row { + display: table-row !important + } + + .d-sm-table-cell { + display: table-cell !important + } + + .d-sm-flex { + display: -webkit-box !important; + display: flex !important + } + + .d-sm-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important + } + +} + +@media (min-width:768px) { + .d-md-none { + display: none !important + } + + .d-md-inline { + display: inline !important + } + + .d-md-inline-block { + display: inline-block !important + } + + .d-md-block { + display: block !important + } + + .d-md-table { + display: table !important + } + + .d-md-table-row { + display: table-row !important + } + + .d-md-table-cell { + display: table-cell !important + } + + .d-md-flex { + display: -webkit-box !important; + display: flex !important + } + + .d-md-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important + } + +} + +@media (min-width:992px) { + .d-lg-none { + display: none !important + } + + .d-lg-inline { + display: inline !important + } + + .d-lg-inline-block { + display: inline-block !important + } + + .d-lg-block { + display: block !important + } + + .d-lg-table { + display: table !important + } + + .d-lg-table-row { + display: table-row !important + } + + .d-lg-table-cell { + display: table-cell !important + } + + .d-lg-flex { + display: -webkit-box !important; + display: flex !important + } + + .d-lg-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important + } + +} + +@media (min-width:1200px) { + .d-xl-none { + display: none !important + } + + .d-xl-inline { + display: inline !important + } + + .d-xl-inline-block { + display: inline-block !important + } + + .d-xl-block { + display: block !important + } + + .d-xl-table { + display: table !important + } + + .d-xl-table-row { + display: table-row !important + } + + .d-xl-table-cell { + display: table-cell !important + } + + .d-xl-flex { + display: -webkit-box !important; + display: flex !important + } + + .d-xl-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important + } + +} + +@media print { + .d-print-none { + display: none !important + } + + .d-print-inline { + display: inline !important + } + + .d-print-inline-block { + display: inline-block !important + } + + .d-print-block { + display: block !important + } + + .d-print-table { + display: table !important + } + + .d-print-table-row { + display: table-row !important + } + + .d-print-table-cell { + display: table-cell !important + } + + .d-print-flex { + display: -webkit-box !important; + display: flex !important + } + + .d-print-inline-flex { + display: -webkit-inline-box !important; + display: inline-flex !important + } + +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden +} + +.embed-responsive::before { + display: block; + content: '3' +} + +.embed-responsive .embed-responsive-item, +.embed-responsive embed, +.embed-responsive iframe, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0 +} + +.embed-responsive-21by9::before { + padding-top: 42.85714% +} + +.embed-responsive-16by9::before { + padding-top: 56.25% +} + +.embed-responsive-4by3::before { + padding-top: 75% +} + +.embed-responsive-1by1::before { + padding-top: 100% +} + +.embed-responsive-21by9::before { + padding-top: 42.85714% +} + +.embed-responsive-16by9::before { + padding-top: 56.25% +} + +.embed-responsive-4by3::before { + padding-top: 75% +} + +.embed-responsive-1by1::before { + padding-top: 100% +} + +.flex-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + flex-direction: row !important +} + +.flex-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + flex-direction: column !important +} + +.flex-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + flex-direction: row-reverse !important +} + +.flex-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + flex-direction: column-reverse !important +} + +.flex-wrap { + flex-wrap: wrap !important +} + +.flex-nowrap { + flex-wrap: nowrap !important +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important +} + +.flex-fill { + -webkit-box-flex: 1 !important; + flex: 1 1 auto !important +} + +.flex-grow-0 { + -webkit-box-flex: 0 !important; + flex-grow: 0 !important +} + +.flex-grow-1 { + -webkit-box-flex: 1 !important; + flex-grow: 1 !important +} + +.flex-shrink-0 { + flex-shrink: 0 !important +} + +.flex-shrink-1 { + flex-shrink: 1 !important +} + +.justify-content-start { + -webkit-box-pack: start !important; + justify-content: flex-start !important +} + +.justify-content-end { + -webkit-box-pack: end !important; + justify-content: flex-end !important +} + +.justify-content-center { + -webkit-box-pack: center !important; + justify-content: center !important +} + +.justify-content-between { + -webkit-box-pack: justify !important; + justify-content: space-between !important +} + +.justify-content-around { + justify-content: space-around !important +} + +.align-items-start { + -webkit-box-align: start !important; + align-items: flex-start !important +} + +.align-items-end { + -webkit-box-align: end !important; + align-items: flex-end !important +} + +.align-items-center { + -webkit-box-align: center !important; + align-items: center !important +} + +.align-items-baseline { + -webkit-box-align: baseline !important; + align-items: baseline !important +} + +.align-items-stretch { + -webkit-box-align: stretch !important; + align-items: stretch !important +} + +.align-content-start { + align-content: flex-start !important +} + +.align-content-end { + align-content: flex-end !important +} + +.align-content-center { + align-content: center !important +} + +.align-content-between { + align-content: space-between !important +} + +.align-content-around { + align-content: space-around !important +} + +.align-content-stretch { + align-content: stretch !important +} + +.align-self-auto { + align-self: auto !important +} + +.align-self-start { + align-self: flex-start !important +} + +.align-self-end { + align-self: flex-end !important +} + +.align-self-center { + align-self: center !important +} + +.align-self-baseline { + align-self: baseline !important +} + +.align-self-stretch { + align-self: stretch !important +} + +@media (min-width:576px) { + .flex-sm-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + flex-direction: row !important + } + + .flex-sm-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + flex-direction: column !important + } + + .flex-sm-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + flex-direction: row-reverse !important + } + + .flex-sm-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + flex-direction: column-reverse !important + } + + .flex-sm-wrap { + flex-wrap: wrap !important + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-sm-fill { + -webkit-box-flex: 1 !important; + flex: 1 1 auto !important + } + + .flex-sm-grow-0 { + -webkit-box-flex: 0 !important; + flex-grow: 0 !important + } + + .flex-sm-grow-1 { + -webkit-box-flex: 1 !important; + flex-grow: 1 !important + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-sm-start { + -webkit-box-pack: start !important; + justify-content: flex-start !important + } + + .justify-content-sm-end { + -webkit-box-pack: end !important; + justify-content: flex-end !important + } + + .justify-content-sm-center { + -webkit-box-pack: center !important; + justify-content: center !important + } + + .justify-content-sm-between { + -webkit-box-pack: justify !important; + justify-content: space-between !important + } + + .justify-content-sm-around { + justify-content: space-around !important + } + + .align-items-sm-start { + -webkit-box-align: start !important; + align-items: flex-start !important + } + + .align-items-sm-end { + -webkit-box-align: end !important; + align-items: flex-end !important + } + + .align-items-sm-center { + -webkit-box-align: center !important; + align-items: center !important + } + + .align-items-sm-baseline { + -webkit-box-align: baseline !important; + align-items: baseline !important + } + + .align-items-sm-stretch { + -webkit-box-align: stretch !important; + align-items: stretch !important + } + + .align-content-sm-start { + align-content: flex-start !important + } + + .align-content-sm-end { + align-content: flex-end !important + } + + .align-content-sm-center { + align-content: center !important + } + + .align-content-sm-between { + align-content: space-between !important + } + + .align-content-sm-around { + align-content: space-around !important + } + + .align-content-sm-stretch { + align-content: stretch !important + } + + .align-self-sm-auto { + align-self: auto !important + } + + .align-self-sm-start { + align-self: flex-start !important + } + + .align-self-sm-end { + align-self: flex-end !important + } + + .align-self-sm-center { + align-self: center !important + } + + .align-self-sm-baseline { + align-self: baseline !important + } + + .align-self-sm-stretch { + align-self: stretch !important + } + +} + +@media (min-width:768px) { + .flex-md-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + flex-direction: row !important + } + + .flex-md-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + flex-direction: column !important + } + + .flex-md-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + flex-direction: row-reverse !important + } + + .flex-md-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + flex-direction: column-reverse !important + } + + .flex-md-wrap { + flex-wrap: wrap !important + } + + .flex-md-nowrap { + flex-wrap: nowrap !important + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-md-fill { + -webkit-box-flex: 1 !important; + flex: 1 1 auto !important + } + + .flex-md-grow-0 { + -webkit-box-flex: 0 !important; + flex-grow: 0 !important + } + + .flex-md-grow-1 { + -webkit-box-flex: 1 !important; + flex-grow: 1 !important + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-md-start { + -webkit-box-pack: start !important; + justify-content: flex-start !important + } + + .justify-content-md-end { + -webkit-box-pack: end !important; + justify-content: flex-end !important + } + + .justify-content-md-center { + -webkit-box-pack: center !important; + justify-content: center !important + } + + .justify-content-md-between { + -webkit-box-pack: justify !important; + justify-content: space-between !important + } + + .justify-content-md-around { + justify-content: space-around !important + } + + .align-items-md-start { + -webkit-box-align: start !important; + align-items: flex-start !important + } + + .align-items-md-end { + -webkit-box-align: end !important; + align-items: flex-end !important + } + + .align-items-md-center { + -webkit-box-align: center !important; + align-items: center !important + } + + .align-items-md-baseline { + -webkit-box-align: baseline !important; + align-items: baseline !important + } + + .align-items-md-stretch { + -webkit-box-align: stretch !important; + align-items: stretch !important + } + + .align-content-md-start { + align-content: flex-start !important + } + + .align-content-md-end { + align-content: flex-end !important + } + + .align-content-md-center { + align-content: center !important + } + + .align-content-md-between { + align-content: space-between !important + } + + .align-content-md-around { + align-content: space-around !important + } + + .align-content-md-stretch { + align-content: stretch !important + } + + .align-self-md-auto { + align-self: auto !important + } + + .align-self-md-start { + align-self: flex-start !important + } + + .align-self-md-end { + align-self: flex-end !important + } + + .align-self-md-center { + align-self: center !important + } + + .align-self-md-baseline { + align-self: baseline !important + } + + .align-self-md-stretch { + align-self: stretch !important + } + +} + +@media (min-width:992px) { + .flex-lg-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + flex-direction: row !important + } + + .flex-lg-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + flex-direction: column !important + } + + .flex-lg-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + flex-direction: row-reverse !important + } + + .flex-lg-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + flex-direction: column-reverse !important + } + + .flex-lg-wrap { + flex-wrap: wrap !important + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-lg-fill { + -webkit-box-flex: 1 !important; + flex: 1 1 auto !important + } + + .flex-lg-grow-0 { + -webkit-box-flex: 0 !important; + flex-grow: 0 !important + } + + .flex-lg-grow-1 { + -webkit-box-flex: 1 !important; + flex-grow: 1 !important + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-lg-start { + -webkit-box-pack: start !important; + justify-content: flex-start !important + } + + .justify-content-lg-end { + -webkit-box-pack: end !important; + justify-content: flex-end !important + } + + .justify-content-lg-center { + -webkit-box-pack: center !important; + justify-content: center !important + } + + .justify-content-lg-between { + -webkit-box-pack: justify !important; + justify-content: space-between !important + } + + .justify-content-lg-around { + justify-content: space-around !important + } + + .align-items-lg-start { + -webkit-box-align: start !important; + align-items: flex-start !important + } + + .align-items-lg-end { + -webkit-box-align: end !important; + align-items: flex-end !important + } + + .align-items-lg-center { + -webkit-box-align: center !important; + align-items: center !important + } + + .align-items-lg-baseline { + -webkit-box-align: baseline !important; + align-items: baseline !important + } + + .align-items-lg-stretch { + -webkit-box-align: stretch !important; + align-items: stretch !important + } + + .align-content-lg-start { + align-content: flex-start !important + } + + .align-content-lg-end { + align-content: flex-end !important + } + + .align-content-lg-center { + align-content: center !important + } + + .align-content-lg-between { + align-content: space-between !important + } + + .align-content-lg-around { + align-content: space-around !important + } + + .align-content-lg-stretch { + align-content: stretch !important + } + + .align-self-lg-auto { + align-self: auto !important + } + + .align-self-lg-start { + align-self: flex-start !important + } + + .align-self-lg-end { + align-self: flex-end !important + } + + .align-self-lg-center { + align-self: center !important + } + + .align-self-lg-baseline { + align-self: baseline !important + } + + .align-self-lg-stretch { + align-self: stretch !important + } + +} + +@media (min-width:1200px) { + .flex-xl-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + flex-direction: row !important + } + + .flex-xl-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + flex-direction: column !important + } + + .flex-xl-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + flex-direction: row-reverse !important + } + + .flex-xl-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + flex-direction: column-reverse !important + } + + .flex-xl-wrap { + flex-wrap: wrap !important + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important + } + + .flex-xl-fill { + -webkit-box-flex: 1 !important; + flex: 1 1 auto !important + } + + .flex-xl-grow-0 { + -webkit-box-flex: 0 !important; + flex-grow: 0 !important + } + + .flex-xl-grow-1 { + -webkit-box-flex: 1 !important; + flex-grow: 1 !important + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important + } + + .justify-content-xl-start { + -webkit-box-pack: start !important; + justify-content: flex-start !important + } + + .justify-content-xl-end { + -webkit-box-pack: end !important; + justify-content: flex-end !important + } + + .justify-content-xl-center { + -webkit-box-pack: center !important; + justify-content: center !important + } + + .justify-content-xl-between { + -webkit-box-pack: justify !important; + justify-content: space-between !important + } + + .justify-content-xl-around { + justify-content: space-around !important + } + + .align-items-xl-start { + -webkit-box-align: start !important; + align-items: flex-start !important + } + + .align-items-xl-end { + -webkit-box-align: end !important; + align-items: flex-end !important + } + + .align-items-xl-center { + -webkit-box-align: center !important; + align-items: center !important + } + + .align-items-xl-baseline { + -webkit-box-align: baseline !important; + align-items: baseline !important + } + + .align-items-xl-stretch { + -webkit-box-align: stretch !important; + align-items: stretch !important + } + + .align-content-xl-start { + align-content: flex-start !important + } + + .align-content-xl-end { + align-content: flex-end !important + } + + .align-content-xl-center { + align-content: center !important + } + + .align-content-xl-between { + align-content: space-between !important + } + + .align-content-xl-around { + align-content: space-around !important + } + + .align-content-xl-stretch { + align-content: stretch !important + } + + .align-self-xl-auto { + align-self: auto !important + } + + .align-self-xl-start { + align-self: flex-start !important + } + + .align-self-xl-end { + align-self: flex-end !important + } + + .align-self-xl-center { + align-self: center !important + } + + .align-self-xl-baseline { + align-self: baseline !important + } + + .align-self-xl-stretch { + align-self: stretch !important + } + +} + +.float-left { + float: left !important +} + +.float-right { + float: right !important +} + +.float-none { + float: none !important +} + +@media (min-width:576px) { + .float-sm-left { + float: left !important + } + + .float-sm-right { + float: right !important + } + + .float-sm-none { + float: none !important + } + +} + +@media (min-width:768px) { + .float-md-left { + float: left !important + } + + .float-md-right { + float: right !important + } + + .float-md-none { + float: none !important + } + +} + +@media (min-width:992px) { + .float-lg-left { + float: left !important + } + + .float-lg-right { + float: right !important + } + + .float-lg-none { + float: none !important + } + +} + +@media (min-width:1200px) { + .float-xl-left { + float: left !important + } + + .float-xl-right { + float: right !important + } + + .float-xl-none { + float: none !important + } + +} + +.overflow-auto { + overflow: auto !important +} + +.overflow-hidden { + overflow: hidden !important +} + +.position-static { + position: static !important +} + +.position-relative { + position: relative !important +} + +.position-absolute { + position: absolute !important +} + +.position-fixed { + position: fixed !important +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030 +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030 +} + +@supports ((position:-webkit-sticky) or (position:sticky)) { + .sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } + +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0 +} + +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal +} + +.shadow-sm { + box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important +} + +.shadow { + box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15) !important +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, .175) !important +} + +.shadow-none { + box-shadow: none !important +} + +.w-25 { + width: 25% !important +} + +.w-50 { + width: 50% !important +} + +.w-75 { + width: 75% !important +} + +.w-100 { + width: 100% !important +} + +.w-auto { + width: auto !important +} + +.h-25 { + height: 25% !important +} + +.h-50 { + height: 50% !important +} + +.h-75 { + height: 75% !important +} + +.h-100 { + height: 100% !important +} + +.h-auto { + height: auto !important +} + +.mw-100 { + max-width: 100% !important +} + +.mh-100 { + max-height: 100% !important +} + +.min-vw-100 { + min-width: 100vw !important +} + +.min-vh-100 { + min-height: 100vh !important +} + +.vw-100 { + width: 100vw !important +} + +.vh-100 { + height: 100vh !important +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: '.5'; + background-color: rgba(0, 0, 0, 0) +} + +.m-0 { + margin: 0 !important +} + +.mt-0, +.my-0 { + margin-top: 0 !important +} + +.mr-0, +.mx-0 { + margin-right: 0 !important +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important +} + +.ml-0, +.mx-0 { + margin-left: 0 !important +} + +.m-1 { + margin: .25rem !important +} + +.mt-1, +.my-1 { + margin-top: .25rem !important +} + +.mr-1, +.mx-1 { + margin-right: .25rem !important +} + +.mb-1, +.my-1 { + margin-bottom: .25rem !important +} + +.ml-1, +.mx-1 { + margin-left: .25rem !important +} + +.m-2 { + margin: .5rem !important +} + +.mt-2, +.my-2 { + margin-top: .5rem !important +} + +.mr-2, +.mx-2 { + margin-right: .5rem !important +} + +.mb-2, +.my-2 { + margin-bottom: .5rem !important +} + +.ml-2, +.mx-2 { + margin-left: .5rem !important +} + +.m-3 { + margin: 1rem !important +} + +.mt-3, +.my-3 { + margin-top: 1rem !important +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important +} + +.m-4 { + margin: 1.5rem !important +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important +} + +.m-5 { + margin: 3rem !important +} + +.mt-5, +.my-5 { + margin-top: 3rem !important +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important +} + +.p-0 { + padding: 0 !important +} + +.pt-0, +.py-0 { + padding-top: 0 !important +} + +.pr-0, +.px-0 { + padding-right: 0 !important +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important +} + +.pl-0, +.px-0 { + padding-left: 0 !important +} + +.p-1 { + padding: .25rem !important +} + +.pt-1, +.py-1 { + padding-top: .25rem !important +} + +.pr-1, +.px-1 { + padding-right: .25rem !important +} + +.pb-1, +.py-1 { + padding-bottom: .25rem !important +} + +.pl-1, +.px-1 { + padding-left: .25rem !important +} + +.p-2 { + padding: .5rem !important +} + +.pt-2, +.py-2 { + padding-top: .5rem !important +} + +.pr-2, +.px-2 { + padding-right: .5rem !important +} + +.pb-2, +.py-2 { + padding-bottom: .5rem !important +} + +.pl-2, +.px-2 { + padding-left: .5rem !important +} + +.p-3 { + padding: 1rem !important +} + +.pt-3, +.py-3 { + padding-top: 1rem !important +} + +.pr-3, +.px-3 { + padding-right: 1rem !important +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important +} + +.pl-3, +.px-3 { + padding-left: 1rem !important +} + +.p-4 { + padding: 1.5rem !important +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important +} + +.p-5 { + padding: 3rem !important +} + +.pt-5, +.py-5 { + padding-top: 3rem !important +} + +.pr-5, +.px-5 { + padding-right: 3rem !important +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important +} + +.pl-5, +.px-5 { + padding-left: 3rem !important +} + +.m-n1 { + margin: -.25rem !important +} + +.mt-n1, +.my-n1 { + margin-top: -.25rem !important +} + +.mr-n1, +.mx-n1 { + margin-right: -.25rem !important +} + +.mb-n1, +.my-n1 { + margin-bottom: -.25rem !important +} + +.ml-n1, +.mx-n1 { + margin-left: -.25rem !important +} + +.m-n2 { + margin: -.5rem !important +} + +.mt-n2, +.my-n2 { + margin-top: -.5rem !important +} + +.mr-n2, +.mx-n2 { + margin-right: -.5rem !important +} + +.mb-n2, +.my-n2 { + margin-bottom: -.5rem !important +} + +.ml-n2, +.mx-n2 { + margin-left: -.5rem !important +} + +.m-n3 { + margin: -1rem !important +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important +} + +.m-n4 { + margin: -1.5rem !important +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important +} + +.m-n5 { + margin: -3rem !important +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important +} + +.m-auto { + margin: auto !important +} + +.mt-auto, +.my-auto { + margin-top: auto !important +} + +.mr-auto, +.mx-auto { + margin-right: auto !important +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important +} + +.ml-auto, +.mx-auto { + margin-left: auto !important +} + +@media (min-width:576px) { + .m-sm-0 { + margin: 0 !important + } + + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important + } + + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important + } + + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important + } + + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important + } + + .m-sm-1 { + margin: .25rem !important + } + + .mt-sm-1, + .my-sm-1 { + margin-top: .25rem !important + } + + .mr-sm-1, + .mx-sm-1 { + margin-right: .25rem !important + } + + .mb-sm-1, + .my-sm-1 { + margin-bottom: .25rem !important + } + + .ml-sm-1, + .mx-sm-1 { + margin-left: .25rem !important + } + + .m-sm-2 { + margin: .5rem !important + } + + .mt-sm-2, + .my-sm-2 { + margin-top: .5rem !important + } + + .mr-sm-2, + .mx-sm-2 { + margin-right: .5rem !important + } + + .mb-sm-2, + .my-sm-2 { + margin-bottom: .5rem !important + } + + .ml-sm-2, + .mx-sm-2 { + margin-left: .5rem !important + } + + .m-sm-3 { + margin: 1rem !important + } + + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important + } + + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important + } + + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important + } + + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important + } + + .m-sm-4 { + margin: 1.5rem !important + } + + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important + } + + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important + } + + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important + } + + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important + } + + .m-sm-5 { + margin: 3rem !important + } + + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important + } + + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important + } + + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important + } + + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important + } + + .p-sm-0 { + padding: 0 !important + } + + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important + } + + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important + } + + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important + } + + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important + } + + .p-sm-1 { + padding: .25rem !important + } + + .pt-sm-1, + .py-sm-1 { + padding-top: .25rem !important + } + + .pr-sm-1, + .px-sm-1 { + padding-right: .25rem !important + } + + .pb-sm-1, + .py-sm-1 { + padding-bottom: .25rem !important + } + + .pl-sm-1, + .px-sm-1 { + padding-left: .25rem !important + } + + .p-sm-2 { + padding: .5rem !important + } + + .pt-sm-2, + .py-sm-2 { + padding-top: .5rem !important + } + + .pr-sm-2, + .px-sm-2 { + padding-right: .5rem !important + } + + .pb-sm-2, + .py-sm-2 { + padding-bottom: .5rem !important + } + + .pl-sm-2, + .px-sm-2 { + padding-left: .5rem !important + } + + .p-sm-3 { + padding: 1rem !important + } + + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important + } + + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important + } + + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important + } + + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important + } + + .p-sm-4 { + padding: 1.5rem !important + } + + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important + } + + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important + } + + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important + } + + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important + } + + .p-sm-5 { + padding: 3rem !important + } + + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important + } + + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important + } + + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important + } + + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important + } + + .m-sm-n1 { + margin: -.25rem !important + } + + .mt-sm-n1, + .my-sm-n1 { + margin-top: -.25rem !important + } + + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -.25rem !important + } + + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -.25rem !important + } + + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -.25rem !important + } + + .m-sm-n2 { + margin: -.5rem !important + } + + .mt-sm-n2, + .my-sm-n2 { + margin-top: -.5rem !important + } + + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -.5rem !important + } + + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -.5rem !important + } + + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -.5rem !important + } + + .m-sm-n3 { + margin: -1rem !important + } + + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important + } + + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important + } + + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important + } + + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important + } + + .m-sm-n4 { + margin: -1.5rem !important + } + + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important + } + + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important + } + + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important + } + + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important + } + + .m-sm-n5 { + margin: -3rem !important + } + + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important + } + + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important + } + + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important + } + + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important + } + + .m-sm-auto { + margin: auto !important + } + + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important + } + + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important + } + + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important + } + + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important + } + +} + +@media (min-width:768px) { + .m-md-0 { + margin: 0 !important + } + + .mt-md-0, + .my-md-0 { + margin-top: 0 !important + } + + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important + } + + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important + } + + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important + } + + .m-md-1 { + margin: .25rem !important + } + + .mt-md-1, + .my-md-1 { + margin-top: .25rem !important + } + + .mr-md-1, + .mx-md-1 { + margin-right: .25rem !important + } + + .mb-md-1, + .my-md-1 { + margin-bottom: .25rem !important + } + + .ml-md-1, + .mx-md-1 { + margin-left: .25rem !important + } + + .m-md-2 { + margin: .5rem !important + } + + .mt-md-2, + .my-md-2 { + margin-top: .5rem !important + } + + .mr-md-2, + .mx-md-2 { + margin-right: .5rem !important + } + + .mb-md-2, + .my-md-2 { + margin-bottom: .5rem !important + } + + .ml-md-2, + .mx-md-2 { + margin-left: .5rem !important + } + + .m-md-3 { + margin: 1rem !important + } + + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important + } + + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important + } + + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important + } + + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important + } + + .m-md-4 { + margin: 1.5rem !important + } + + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important + } + + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important + } + + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important + } + + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important + } + + .m-md-5 { + margin: 3rem !important + } + + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important + } + + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important + } + + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important + } + + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important + } + + .p-md-0 { + padding: 0 !important + } + + .pt-md-0, + .py-md-0 { + padding-top: 0 !important + } + + .pr-md-0, + .px-md-0 { + padding-right: 0 !important + } + + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important + } + + .pl-md-0, + .px-md-0 { + padding-left: 0 !important + } + + .p-md-1 { + padding: .25rem !important + } + + .pt-md-1, + .py-md-1 { + padding-top: .25rem !important + } + + .pr-md-1, + .px-md-1 { + padding-right: .25rem !important + } + + .pb-md-1, + .py-md-1 { + padding-bottom: .25rem !important + } + + .pl-md-1, + .px-md-1 { + padding-left: .25rem !important + } + + .p-md-2 { + padding: .5rem !important + } + + .pt-md-2, + .py-md-2 { + padding-top: .5rem !important + } + + .pr-md-2, + .px-md-2 { + padding-right: .5rem !important + } + + .pb-md-2, + .py-md-2 { + padding-bottom: .5rem !important + } + + .pl-md-2, + .px-md-2 { + padding-left: .5rem !important + } + + .p-md-3 { + padding: 1rem !important + } + + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important + } + + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important + } + + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important + } + + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important + } + + .p-md-4 { + padding: 1.5rem !important + } + + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important + } + + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important + } + + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important + } + + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important + } + + .p-md-5 { + padding: 3rem !important + } + + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important + } + + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important + } + + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important + } + + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important + } + + .m-md-n1 { + margin: -.25rem !important + } + + .mt-md-n1, + .my-md-n1 { + margin-top: -.25rem !important + } + + .mr-md-n1, + .mx-md-n1 { + margin-right: -.25rem !important + } + + .mb-md-n1, + .my-md-n1 { + margin-bottom: -.25rem !important + } + + .ml-md-n1, + .mx-md-n1 { + margin-left: -.25rem !important + } + + .m-md-n2 { + margin: -.5rem !important + } + + .mt-md-n2, + .my-md-n2 { + margin-top: -.5rem !important + } + + .mr-md-n2, + .mx-md-n2 { + margin-right: -.5rem !important + } + + .mb-md-n2, + .my-md-n2 { + margin-bottom: -.5rem !important + } + + .ml-md-n2, + .mx-md-n2 { + margin-left: -.5rem !important + } + + .m-md-n3 { + margin: -1rem !important + } + + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important + } + + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important + } + + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important + } + + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important + } + + .m-md-n4 { + margin: -1.5rem !important + } + + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important + } + + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important + } + + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important + } + + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important + } + + .m-md-n5 { + margin: -3rem !important + } + + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important + } + + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important + } + + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important + } + + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important + } + + .m-md-auto { + margin: auto !important + } + + .mt-md-auto, + .my-md-auto { + margin-top: auto !important + } + + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important + } + + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important + } + + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important + } + +} + +@media (min-width:992px) { + .m-lg-0 { + margin: 0 !important + } + + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important + } + + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important + } + + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important + } + + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important + } + + .m-lg-1 { + margin: .25rem !important + } + + .mt-lg-1, + .my-lg-1 { + margin-top: .25rem !important + } + + .mr-lg-1, + .mx-lg-1 { + margin-right: .25rem !important + } + + .mb-lg-1, + .my-lg-1 { + margin-bottom: .25rem !important + } + + .ml-lg-1, + .mx-lg-1 { + margin-left: .25rem !important + } + + .m-lg-2 { + margin: .5rem !important + } + + .mt-lg-2, + .my-lg-2 { + margin-top: .5rem !important + } + + .mr-lg-2, + .mx-lg-2 { + margin-right: .5rem !important + } + + .mb-lg-2, + .my-lg-2 { + margin-bottom: .5rem !important + } + + .ml-lg-2, + .mx-lg-2 { + margin-left: .5rem !important + } + + .m-lg-3 { + margin: 1rem !important + } + + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important + } + + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important + } + + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important + } + + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important + } + + .m-lg-4 { + margin: 1.5rem !important + } + + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important + } + + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important + } + + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important + } + + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important + } + + .m-lg-5 { + margin: 3rem !important + } + + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important + } + + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important + } + + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important + } + + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important + } + + .p-lg-0 { + padding: 0 !important + } + + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important + } + + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important + } + + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important + } + + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important + } + + .p-lg-1 { + padding: .25rem !important + } + + .pt-lg-1, + .py-lg-1 { + padding-top: .25rem !important + } + + .pr-lg-1, + .px-lg-1 { + padding-right: .25rem !important + } + + .pb-lg-1, + .py-lg-1 { + padding-bottom: .25rem !important + } + + .pl-lg-1, + .px-lg-1 { + padding-left: .25rem !important + } + + .p-lg-2 { + padding: .5rem !important + } + + .pt-lg-2, + .py-lg-2 { + padding-top: .5rem !important + } + + .pr-lg-2, + .px-lg-2 { + padding-right: .5rem !important + } + + .pb-lg-2, + .py-lg-2 { + padding-bottom: .5rem !important + } + + .pl-lg-2, + .px-lg-2 { + padding-left: .5rem !important + } + + .p-lg-3 { + padding: 1rem !important + } + + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important + } + + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important + } + + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important + } + + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important + } + + .p-lg-4 { + padding: 1.5rem !important + } + + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important + } + + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important + } + + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important + } + + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important + } + + .p-lg-5 { + padding: 3rem !important + } + + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important + } + + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important + } + + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important + } + + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important + } + + .m-lg-n1 { + margin: -.25rem !important + } + + .mt-lg-n1, + .my-lg-n1 { + margin-top: -.25rem !important + } + + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -.25rem !important + } + + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -.25rem !important + } + + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -.25rem !important + } + + .m-lg-n2 { + margin: -.5rem !important + } + + .mt-lg-n2, + .my-lg-n2 { + margin-top: -.5rem !important + } + + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -.5rem !important + } + + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -.5rem !important + } + + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -.5rem !important + } + + .m-lg-n3 { + margin: -1rem !important + } + + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important + } + + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important + } + + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important + } + + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important + } + + .m-lg-n4 { + margin: -1.5rem !important + } + + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important + } + + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important + } + + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important + } + + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important + } + + .m-lg-n5 { + margin: -3rem !important + } + + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important + } + + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important + } + + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important + } + + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important + } + + .m-lg-auto { + margin: auto !important + } + + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important + } + + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important + } + + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important + } + + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important + } + +} + +@media (min-width:1200px) { + .m-xl-0 { + margin: 0 !important + } + + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important + } + + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important + } + + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important + } + + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important + } + + .m-xl-1 { + margin: .25rem !important + } + + .mt-xl-1, + .my-xl-1 { + margin-top: .25rem !important + } + + .mr-xl-1, + .mx-xl-1 { + margin-right: .25rem !important + } + + .mb-xl-1, + .my-xl-1 { + margin-bottom: .25rem !important + } + + .ml-xl-1, + .mx-xl-1 { + margin-left: .25rem !important + } + + .m-xl-2 { + margin: .5rem !important + } + + .mt-xl-2, + .my-xl-2 { + margin-top: .5rem !important + } + + .mr-xl-2, + .mx-xl-2 { + margin-right: .5rem !important + } + + .mb-xl-2, + .my-xl-2 { + margin-bottom: .5rem !important + } + + .ml-xl-2, + .mx-xl-2 { + margin-left: .5rem !important + } + + .m-xl-3 { + margin: 1rem !important + } + + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important + } + + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important + } + + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important + } + + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important + } + + .m-xl-4 { + margin: 1.5rem !important + } + + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important + } + + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important + } + + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important + } + + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important + } + + .m-xl-5 { + margin: 3rem !important + } + + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important + } + + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important + } + + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important + } + + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important + } + + .p-xl-0 { + padding: 0 !important + } + + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important + } + + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important + } + + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important + } + + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important + } + + .p-xl-1 { + padding: .25rem !important + } + + .pt-xl-1, + .py-xl-1 { + padding-top: .25rem !important + } + + .pr-xl-1, + .px-xl-1 { + padding-right: .25rem !important + } + + .pb-xl-1, + .py-xl-1 { + padding-bottom: .25rem !important + } + + .pl-xl-1, + .px-xl-1 { + padding-left: .25rem !important + } + + .p-xl-2 { + padding: .5rem !important + } + + .pt-xl-2, + .py-xl-2 { + padding-top: .5rem !important + } + + .pr-xl-2, + .px-xl-2 { + padding-right: .5rem !important + } + + .pb-xl-2, + .py-xl-2 { + padding-bottom: .5rem !important + } + + .pl-xl-2, + .px-xl-2 { + padding-left: .5rem !important + } + + .p-xl-3 { + padding: 1rem !important + } + + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important + } + + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important + } + + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important + } + + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important + } + + .p-xl-4 { + padding: 1.5rem !important + } + + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important + } + + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important + } + + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important + } + + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important + } + + .p-xl-5 { + padding: 3rem !important + } + + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important + } + + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important + } + + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important + } + + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important + } + + .m-xl-n1 { + margin: -.25rem !important + } + + .mt-xl-n1, + .my-xl-n1 { + margin-top: -.25rem !important + } + + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -.25rem !important + } + + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -.25rem !important + } + + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -.25rem !important + } + + .m-xl-n2 { + margin: -.5rem !important + } + + .mt-xl-n2, + .my-xl-n2 { + margin-top: -.5rem !important + } + + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -.5rem !important + } + + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -.5rem !important + } + + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -.5rem !important + } + + .m-xl-n3 { + margin: -1rem !important + } + + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important + } + + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important + } + + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important + } + + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important + } + + .m-xl-n4 { + margin: -1.5rem !important + } + + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important + } + + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important + } + + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important + } + + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important + } + + .m-xl-n5 { + margin: -3rem !important + } + + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important + } + + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important + } + + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important + } + + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important + } + + .m-xl-auto { + margin: auto !important + } + + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important + } + + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important + } + + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important + } + + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important + } + +} + +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important +} + +.text-justify { + text-align: justify !important +} + +.text-wrap { + white-space: normal !important +} + +.text-nowrap { + white-space: nowrap !important +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.text-left { + text-align: left !important +} + +.text-right { + text-align: right !important +} + +.text-center { + text-align: center !important +} + +@media (min-width:576px) { + .text-sm-left { + text-align: left !important + } + + .text-sm-right { + text-align: right !important + } + + .text-sm-center { + text-align: center !important + } + +} + +@media (min-width:768px) { + .text-md-left { + text-align: left !important + } + + .text-md-right { + text-align: right !important + } + + .text-md-center { + text-align: center !important + } + +} + +@media (min-width:992px) { + .text-lg-left { + text-align: left !important + } + + .text-lg-right { + text-align: right !important + } + + .text-lg-center { + text-align: center !important + } + +} + +@media (min-width:1200px) { + .text-xl-left { + text-align: left !important + } + + .text-xl-right { + text-align: right !important + } + + .text-xl-center { + text-align: center !important + } + +} + +.text-lowercase { + text-transform: lowercase !important +} + +.text-uppercase { + text-transform: uppercase !important +} + +.text-capitalize { + text-transform: capitalize !important +} + +.font-weight-light { + font-weight: 300 !important +} + +.font-weight-lighter { + font-weight: lighter !important +} + +.font-weight-normal { + font-weight: 400 !important +} + +.font-weight-bold { + font-weight: 700 !important +} + +.font-weight-bolder { + font-weight: bolder !important +} + +.font-italic { + font-style: italic !important +} + +.text-white { + color: #fff !important +} + +.text-primary { + color: #047006 !important +} + +a.text-primary:focus, +a.text-primary:hover { + color: #012602 !important +} + +.text-secondary { + color: grey !important +} + +a.text-secondary:focus, +a.text-secondary:hover { + color: #5a5a5a !important +} + +.text-success { + color: #047006 !important +} + +a.text-success:focus, +a.text-success:hover { + color: #009461 !important +} + +.text-info { + color: #6c61f6 !important +} + +a.text-info:focus, +a.text-info:hover { + color: #2919f2 !important +} + +.text-warning { + color: #f0825f !important +} + +a.text-warning:focus, +a.text-warning:hover { + color: #e94b19 !important +} + +.text-danger { + color: #ff5f66 !important +} + +a.text-danger:focus, +a.text-danger:hover { + color: #ff131d !important +} + +.text-light { + color: #dfdfdf !important +} + +a.text-light:focus, +a.text-light:hover { + color: #b9b9b9 !important +} + +.text-dark { + color: #74767b !important +} + +a.text-dark:focus, +a.text-dark:hover { + color: #4f5054 !important +} + +.text-white { + color: #fff !important +} + +a.text-white:focus, +a.text-white:hover { + color: #d9d9d9 !important +} + +.text-body { + color: #212529 !important +} + +.text-muted { + color: #adb5bd !important +} + +.text-black-50 { + color: rgba(0, 0, 0, .5) !important +} + +.text-white-50 { + color: rgba(255, 255, 255, .5) !important +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0 +} + +.text-decoration-none { + text-decoration: none !important +} + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important +} + +.text-reset { + color: inherit !important +} + +.visible { + visibility: visible !important +} + +.invisible { + visibility: hidden !important +} + +@media print { + *, + ::after, + ::before { + text-shadow: none !important; + box-shadow: none !important + } + + a:not(.btn) { + text-decoration: underline + } + + abbr[title]::after { + content: '3'attr(title) ")" + } + + pre { + white-space: pre-wrap !important + } + + blockquote, + pre { + border: 1px solid #adb5bd; + page-break-inside: avoid + } + + thead { + display: table-header-group + } + + img, + tr { + page-break-inside: avoid + } + + h2, + h3, + p { + orphans: 3; + widows: 3 + } + + h2, + h3 { + page-break-after: avoid + } + + @page { + size: a3 + } + + body { + min-width: 992px !important + } + + .container { + min-width: 992px !important + } + + .navbar { + display: none + } + + .badge { + border: 1px solid #000 + } + + .table { + border-collapse: collapse !important + } + + .table td, + .table th { + background-color: #fff !important + } + + .table-bordered td, + .table-bordered th { + border: 1px solid #dee2e6 !important + } + + .table-dark { + color: inherit + } + + .table-dark tbody+tbody, + .table-dark td, + .table-dark th, + .table-dark thead th { + border-color: #f2f4f9 + } + + .table .thead-dark th { + color: inherit; + border-color: #f2f4f9 + } + +} + +.dev-info { + position: fixed; + color: grey; + font-size: smaller; + left: 8px; + z-index: 120 +} + +.versionstring { + top: 70px; + right: 8px; + left: auto +} + +.grd-time-used { + bottom: 0 +} + +.t-header { + display: -webkit-box; + display: flex; + height: 70px; + background: #f9fafb; + z-index: 100 +} + +@media (max-width:991.98px) { + .t-header { + padding-left: 5px; + padding-right: 5px + } + +} + +.t-header .t-header-brand-wrapper { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + height: 70px; + width: 17rem; + min-width: 17rem; + max-width: 17rem; + background: #fff; + z-index: 100; + padding-left: 18px +} + +.t-header .t-header-brand-wrapper a { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + color: #dfdfdf; + font-family: Roboto, sans-serif; + font-weight: 500; + font-size: 1.25rem +} + +.t-header .t-header-brand-wrapper a .logo { + max-width: 100%; + width: 110px +} + +.t-header .t-header-brand-wrapper a .logo-mini { + display: none; + max-width: 100%; + width: 35px +} + +.t-header .t-header-brand-wrapper a p { + color: inherit; + font-size: inherit; + font-weight: inherit; + margin-bottom: 0 +} + +@media (max-width:991.98px) { + .t-header .t-header-brand-wrapper { + padding-left: 0; + -webkit-box-pack: center; + justify-content: center + } + + .t-header .t-header-brand-wrapper a .logo-mini { + width: 25px + } + +} + +.t-header .t-header-content-wrapper { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + width: 100%; + max-width: 100%; + padding: 0 2.5rem +} + +@media (max-width:991.98px) { + .t-header .t-header-content-wrapper { + padding: 0 1rem + } + +} + +.t-header .t-header-content-wrapper .t-header-search-box { + display: -webkit-box; + display: flex; + width: 40%; + height: 45px; + border: none; + background: #edf0f3; + border-radius: 4px; + -webkit-transition: .3s ease-in-out; + transition: .3s ease-in-out; + -webkit-transition-property: background; + transition-property: background +} + +@media (max-width:580px) { + .t-header .t-header-content-wrapper .t-header-search-box { + display: none + } + +} + +.t-header .t-header-content-wrapper .t-header-search-box .input-group-prepend .input-group-text { + border: none; + background: 0 0; + font-size: 1.5rem; + padding-left: 15px; + line-height: 23px +} + +.t-header .t-header-content-wrapper .t-header-search-box .form-control { + height: inherit; + border: none; + background: 0 0; + font-size: .875rem; + font-family: Roboto, sans-serif; + font-weight: 500; + padding-left: 0 +} + +.t-header .t-header-content-wrapper .t-header-search-box .form-control.placeholder { + font-size: inherit; + font-family: inherit; + font-weight: inherit +} + +.t-header .t-header-content-wrapper .t-header-search-box .form-control:-moz-placeholder { + font-size: inherit; + font-family: inherit; + font-weight: inherit +} + +.t-header .t-header-content-wrapper .t-header-search-box .form-control::-moz-placeholder { + font-size: inherit; + font-family: inherit; + font-weight: inherit +} + +.t-header .t-header-content-wrapper .t-header-search-box .form-control:-ms-input-placeholder { + font-size: inherit; + font-family: inherit; + font-weight: inherit +} + +.t-header .t-header-content-wrapper .t-header-search-box .form-control::-webkit-input-placeholder { + font-size: inherit; + font-family: inherit; + font-weight: inherit +} + +.t-header .t-header-content-wrapper .t-header-search-box:hover { + background: #e4e8ed +} + +.t-header .t-header-content-wrapper .t-header-content { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + width: 100%; + max-width: 100% +} + +.t-header .t-header-content-wrapper .t-header-content .nav .nav-item .nav-link { + position: relative; + font-family: Roboto, sans-serif +} + +.t-header .t-header-content-wrapper .t-header-content .nav .nav-item .nav-link i { + color: #525c5d +} + +.t-header .t-header-content-wrapper .t-header-content .nav .nav-item .nav-link .notification-indicator { + position: absolute; + top: 12px; + right: 12px +} + +.t-header .t-header-content-wrapper .t-header-content .nav .nav-item:last-child .nav-link { + padding-right: 0 +} + +.t-header .t-header-toggler { + background: 0 0; + border: none; + margin-left: auto +} + +.t-header .t-header-toggler svg.logo { + width: 50px; + height: 50px; + cursor: pointer; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) +} + +.t-header .t-header-toggler svg.logo path { + fill: none; + -webkit-transition: stroke-dashoffset .35s cubic-bezier(.25, -.25, .75, 1.25), stroke-dasharray .35s cubic-bezier(.25, -.25, .75, 1.25); + transition: stroke-dashoffset .35s cubic-bezier(.25, -.25, .75, 1.25), stroke-dasharray .35s cubic-bezier(.25, -.25, .75, 1.25); + stroke-width: 8px; + stroke-linecap: round; + stroke: #adb5bd; + stroke-dashoffset: -20px +} + +.t-header .t-header-toggler svg.logo .bottom, +.t-header .t-header-toggler svg.logo .middle, +.t-header .t-header-toggler svg.logo .top { + stroke-dasharray: 60px 300px +} + +.t-header .t-header-toggler.arrow path.bottom, +.t-header .t-header-toggler.arrow path.top { + stroke-dasharray: 25px 300px; + stroke-dashoffset: -230px +} + +.t-header .t-header-toggler i { + font-size: 1.375rem +} + +.t-header .t-header-toggler.t-header-mobile-toggler { + margin-left: 0; + margin-right: 15px +} + +.t-header.fixed-top { + position: fixed +} + +.header-fixed .t-header { + position: fixed; + top: 0; + right: 0; + left: 0; + width: 100%; + z-index: 100 +} + +.header-fixed .sidebar { + padding-top: 70px +} + +.header-fixed .sidebar .t-header-brand-wrapper { + position: fixed; + left: 0; + top: 0; + z-index: 100; + width: 17rem; + box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .05) +} + +.header-fixed .sidebar .navigation-menu { + z-index: 1 +} + +.sidebar { + position: relative; + display: block; + height: 100%; + min-height: 100vh; + width: 17rem; + min-width: 17rem; + max-width: 17rem; + background: #fff +} + +.sidebar .sidebar-header { + border-bottom: 1px solid #2c3744 +} + +.sidebar .navigation-menu { + padding-left: 0; + padding-bottom: 80px; + margin-bottom: 0; + margin-top: 18px +} + +.sidebar .navigation-menu li { + display: block; + margin: 0; + -webkit-transition-duration: .25s; + transition-duration: .25s; + -webkit-transition-timing-function: cubic-bezier(.26, .66, .45, .78); + transition-timing-function: cubic-bezier(.26, .66, .45, .78); + -webkit-transition-property: background; + transition-property: background +} + +.sidebar .navigation-menu li.nav-category-divider { + position: -webkit-sticky; + position: sticky; + top: 64px; + display: block; + background: #fff; + margin: 15px 0 0 0; + padding: 20px 30px 10px 30px; + font-size: 10px; + color: #047006; + z-index: 1; + font-family: Roboto, sans-serif; + font-weight: 500 +} + +.sidebar .navigation-menu li.nav-category-divider:first-child { + margin-top: 0 +} + +.sidebar .navigation-menu li a { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-orient: horizontal; + -webkit-box-direction: reverse; + flex-direction: row-reverse; + -webkit-box-pack: end; + justify-content: flex-end; + padding: 12px 30px 12px 30px; + font-size: 13px; + line-height: 1; + color: #525c5d; + letter-spacing: .03rem; + font-weight: 500; + max-width: 100%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden +} + +.sidebar .navigation-menu li a .link-icon { + margin-right: 15px; + line-height: 1; + color: #525c5d; + font-size: 1.1875rem +} + +.sidebar .navigation-menu li:last-child a { + border-bottom: none +} + +.sidebar .navigation-menu li .navigation-submenu { + background: #fafafa; + padding: 0 0 10px 30px +} + +.sidebar .navigation-menu li .navigation-submenu.collapsing { + -webkit-transition: .2s ease-in; + transition: .2s ease-in +} + +.sidebar .navigation-menu li .navigation-submenu li { + display: inherit +} + +.sidebar .navigation-menu li .navigation-submenu li a { + display: block; + padding: calc(9px) 30px calc(9px) calc(30px + 2px); + opacity: .8; + letter-spacing: .03rem; + font-weight: 400; + font-size: calc(13px - 1px); + -webkit-transition: .3s ease-in-out; + transition: .3s ease-in-out; + -webkit-transition-property: color; + transition-property: color +} + +.sidebar .navigation-menu li .navigation-submenu li a[data-toggle=collapse] { + position: relative +} + +.sidebar .navigation-menu li .navigation-submenu li a[data-toggle=collapse]:after { + content: '.5'; + height: 7px; + width: 7px; + border-radius: 25px; + position: absolute; + right: calc(30px + 4px); + top: 14px +} + +.sidebar .navigation-menu li .navigation-submenu li a.active { + color: #047006 +} + +.sidebar .navigation-menu li .navigation-submenu li a:hover { + color: #047006 +} + +.sidebar .navigation-menu li .navigation-submenu li:first-child a { + padding-top: 10px +} + +.sidebar .navigation-menu li .navigation-submenu li:first-child a:after { + top: 15px +} + +.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+1) a:after { + background: #047006 +} + +.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+2) a:after { + background: #047006 +} + +.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+3) a:after { + background: #ff5f66 +} + +.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+4) a:after { + background: #f0825f +} + +.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+5) a:after { + background: #6c61f6 +} + +.sidebar .navigation-menu li .navigation-submenu li .navigation-submenu { + padding-left: 0 +} + +.sidebar .navigation-menu li .navigation-submenu li .navigation-submenu li a { + opacity: .5 +} + +.sidebar .navigation-menu li.active a .link-title { + color: #047006 +} + +.sidebar .navigation-menu li.active a .link-icon { + color: #047006 +} + +.sidebar .navigation-menu>li:not(.nav-category-divider):hover { + background: #fafafa +} + +.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse] { + position: relative +} + +.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse]:after { + content: '3'; + font-family: "Material Design Icons"; + font-size: 15px; + text-rendering: auto; + line-height: inherit; + font-weight: bolder; + position: absolute; + top: 13px; + right: 30px; + display: block; + -webkit-transition: .3s; + transition: .3s; + -webkit-transition-property: -webkit-transform; + transition-property: -webkit-transform; + transition-property: transform; + transition-property: transform, -webkit-transform; + color: #839092 +} + +.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse][aria-expanded=true] { + background: #fafafa +} + +.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse][aria-expanded=true]:after { + -webkit-transform: rotate(90deg); + transform: rotate(90deg) +} + +.sidebar .sidebar_footer { + display: block; + position: fixed; + bottom: 0; + left: 0; + margin-top: auto; + width: inherit; + z-index: 2; + background: #fff +} + +.sidebar .sidebar_footer .admin-access-level { + position: absolute; + bottom: 0; + display: -webkit-box; + display: flex; + -webkit-box-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + align-items: center; + z-index: 9999; + height: auto; + width: 100%; + background: #fff; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + padding: 10px 20px; + box-shadow: -7px -2px 25px -5px rgba(0, 0, 0, .12) +} + +.sidebar .sidebar_footer .admin-access-level .user-type-wrapper { + padding: 0 0 0 10px +} + +.sidebar .sidebar_footer .admin-access-level .user-type-wrapper .user_name { + color: #525c5d; + margin-bottom: 8px; + line-height: 1; + max-width: 100%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + max-width: 95px; + font-family: Roboto, sans-serif; + font-weight: 500; + letter-spacing: .03rem +} + +.sidebar .sidebar_footer .admin-access-level .user-type-wrapper .user_access_level { + color: #74767b; + line-height: 1 +} + +.sidebar .sidebar_footer .admin-access-level .user-type-wrapper .status-indicator { + margin-right: 5px +} + +.sidebar .sidebar_footer .admin-access-level .arrow { + color: #525c5d; + margin-left: auto; + font-size: 20px; + line-height: 1; + -webkit-transition: .3s; + transition: .3s +} + +.sidebar .sidebar_footer .user-account { + display: block; + width: 100%; + border-radius: 0; + border: none; + margin-bottom: -100vh; + opacity: 0; + -webkit-transition: .3s; + transition: .3s; + border-right: 1px solid #f2f4f9; + box-shadow: -7px -2px 25px -5px rgba(0, 0, 0, .12) +} + +.sidebar .sidebar_footer .user-account:before { + display: none +} + +.sidebar .sidebar_footer .user-account .user-profile-item-tittle { + background: 0 0; + padding: 20px 18px 10px 18px; + z-index: 1; + color: #adb5bd; + font-family: Roboto, sans-serif; + font-weight: 500 +} + +.sidebar .sidebar_footer .user-account .user-profile-itemcategory { + background: 0 0; + margin-bottom: 10px; + border-bottom: 1px solid #f2f4f9; + padding-bottom: 10px; + font-family: Roboto, sans-serif; + font-weight: 500; + letter-spacing: .03rem +} + +.sidebar .sidebar_footer .user-account .user-profile-item { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + background: inherit; + padding: 10px 18px; + -webkit-transition: .3s; + transition: .3s; + z-index: 1; + background: 0 0; + color: #525c5d; + font-size: 13px; + font-family: Roboto, sans-serif; + font-weight: 500; + letter-spacing: .03rem +} + +.sidebar .sidebar_footer .user-account .user-profile-item:hover { + background: #f5f5f5 +} + +.sidebar .sidebar_footer .user-account .user-profile-item i { + margin-right: 10px; + font-size: 18px; + line-height: 1; + color: inherit +} + +.sidebar .sidebar_footer .user-account .user-profile-item img { + margin-right: 10px +} + +.sidebar .sidebar_footer .user-account .btn-logout { + width: 91%; + max-width: 91%; + margin: 15px 10px 30px 10px; + border-radius: 4px +} + +.sidebar .sidebar_footer.opened { + background: #fff +} + +.sidebar .sidebar_footer.opened .admin-access-level { + background: #fff +} + +.sidebar .sidebar_footer.opened .admin-access-level .arrow { + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg) +} + +.sidebar .sidebar_footer.opened .user-account { + margin-bottom: 60px; + opacity: 1; + background: #fff +} + +footer { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 2rem 2.5rem; + max-width: 1140px; + margin-left: auto; + margin-right: auto +} + +@media (max-width:991.98px) { + footer { + padding: 20px 0 30px 0 + } + +} + +footer ul { + margin-left: 0; + padding-left: 0 +} + +footer ul li { + display: inline-block; + padding: 0 10px 0 0; + line-height: 1 +} + +footer ul li:not(:last-child) { + margin-right: 10px; + border-right: 1px solid #f2f4f9 +} + +footer ul li a { + font-family: Roboto, sans-serif; + font-weight: 400; + letter-spacing: .03rem; + color: #565656 +} + +pre.cake-error { + z-index: 220; + position: absolute; + background-color: #fff +} + +.alert-notification-wrapper { + position: fixed; + left: 17rem; + right: 0; + z-index: 999 +} + +@media (max-width:991.98px) { + .alert-notification-wrapper { + left: 0 + } + +} + +.alert-notification-wrapper.top { + top: 70px +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter { + border: 2px solid #55acee; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter i { + color: #55acee +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link { + background: 0 0; + color: #55acee +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link:hover { + color: #2795e9 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook { + border: 2px solid #0084ff; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook i { + color: #0084ff +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link { + background: 0 0; + color: #0084ff +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link:hover { + color: #006acc +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-google { + border: 2px solid #dd4b39; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-google i { + color: #dd4b39 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link { + background: 0 0; + color: #dd4b39 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link:hover { + color: #c23321 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin { + border: 2px solid #0077b5; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin i { + color: #0077b5 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link { + background: 0 0; + color: #0077b5 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link:hover { + color: #005582 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest { + border: 2px solid #bd081c; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest i { + color: #bd081c +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link { + background: 0 0; + color: #bd081c +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link:hover { + color: #8c0615 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube { + border: 2px solid #cd201f; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube i { + color: #cd201f +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link { + background: 0 0; + color: #cd201f +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link:hover { + color: #a11918 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-github { + border: 2px solid #333; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-github i { + color: #333 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link { + background: 0 0; + color: #333 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link:hover { + color: #1a1a1a +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-behance { + border: 2px solid #0454f6; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-behance i { + color: #0454f6 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link { + background: 0 0; + color: #0454f6 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link:hover { + color: #0343c4 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble { + border: 2px solid #ea4c89; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble i { + color: #ea4c89 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link { + background: 0 0; + color: #ea4c89 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link:hover { + color: #e51e6b +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit { + border: 2px solid #ed4333; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit i { + color: #ed4333 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link { + background: 0 0; + color: #ed4333 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link:hover { + color: #da2413 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram { + border: 2px solid #ff759b; + color: #101010 +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram i { + color: #ff759b +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link { + background: 0 0; + color: #ff759b +} + +.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link:hover { + color: #ff4276 +} + +.btn-inverse-primary { + background: rgba(4, 112, 6, .15); + color: #047006 +} + +.btn-inverse-primary i { + color: inherit +} + +.btn-inverse-primary:hover { + background: rgba(4, 112, 6, .8); + color: #fff +} + +.btn-inverse-secondary { + background: rgba(128, 128, 128, .15); + color: grey +} + +.btn-inverse-secondary i { + color: inherit +} + +.btn-inverse-secondary:hover { + background: rgba(128, 128, 128, .8); + color: #fff +} + +.btn-inverse-success { + background: rgba(0, 224, 147, .15); + color: #047006 +} + +.btn-inverse-success i { + color: inherit +} + +.btn-inverse-success:hover { + background: rgba(0, 224, 147, .8); + color: #fff +} + +.btn-inverse-info { + background: rgba(108, 97, 246, .15); + color: #6c61f6 +} + +.btn-inverse-info i { + color: inherit +} + +.btn-inverse-info:hover { + background: rgba(108, 97, 246, .8); + color: #fff +} + +.btn-inverse-warning { + background: rgba(240, 130, 95, .15); + color: #f0825f +} + +.btn-inverse-warning i { + color: inherit +} + +.btn-inverse-warning:hover { + background: rgba(240, 130, 95, .8); + color: #fff +} + +.btn-inverse-danger { + background: rgba(255, 95, 102, .15); + color: #ff5f66 +} + +.btn-inverse-danger i { + color: inherit +} + +.btn-inverse-danger:hover { + background: rgba(255, 95, 102, .8); + color: #fff +} + +.btn-inverse-light { + background: rgba(223, 223, 223, .15); + color: #dfdfdf +} + +.btn-inverse-light i { + color: inherit +} + +.btn-inverse-light:hover { + background: rgba(223, 223, 223, .8); + color: #fff +} + +.btn-inverse-dark { + background: rgba(116, 118, 123, .15); + color: #74767b +} + +.btn-inverse-dark i { + color: inherit +} + +.btn-inverse-dark:hover { + background: rgba(116, 118, 123, .8); + color: #fff +} + +.btn-inverse-white { + background: rgba(255, 255, 255, .15); + color: #fff +} + +.btn-inverse-white i { + color: inherit +} + +.btn-inverse-white:hover { + background: rgba(255, 255, 255, .8); + color: #fff +} + +.btn:not(.social-btn-outlined).btn-twitter { + background: #55acee; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-twitter:hover { + background: #2795e9 +} + +.btn:not(.social-btn-outlined).btn-twitter.btn-link { + background: 0 0; + color: #55acee +} + +.btn:not(.social-btn-outlined).btn-twitter.btn-link:hover { + color: #2795e9 +} + +.btn:not(.social-btn-outlined).btn-facebook { + background: #0084ff; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-facebook:hover { + background: #006acc +} + +.btn:not(.social-btn-outlined).btn-facebook.btn-link { + background: 0 0; + color: #0084ff +} + +.btn:not(.social-btn-outlined).btn-facebook.btn-link:hover { + color: #006acc +} + +.btn:not(.social-btn-outlined).btn-google { + background: #dd4b39; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-google:hover { + background: #c23321 +} + +.btn:not(.social-btn-outlined).btn-google.btn-link { + background: 0 0; + color: #dd4b39 +} + +.btn:not(.social-btn-outlined).btn-google.btn-link:hover { + color: #c23321 +} + +.btn:not(.social-btn-outlined).btn-linkedin { + background: #0077b5; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-linkedin:hover { + background: #005582 +} + +.btn:not(.social-btn-outlined).btn-linkedin.btn-link { + background: 0 0; + color: #0077b5 +} + +.btn:not(.social-btn-outlined).btn-linkedin.btn-link:hover { + color: #005582 +} + +.btn:not(.social-btn-outlined).btn-pinterest { + background: #bd081c; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-pinterest:hover { + background: #8c0615 +} + +.btn:not(.social-btn-outlined).btn-pinterest.btn-link { + background: 0 0; + color: #bd081c +} + +.btn:not(.social-btn-outlined).btn-pinterest.btn-link:hover { + color: #8c0615 +} + +.btn:not(.social-btn-outlined).btn-youtube { + background: #cd201f; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-youtube:hover { + background: #a11918 +} + +.btn:not(.social-btn-outlined).btn-youtube.btn-link { + background: 0 0; + color: #cd201f +} + +.btn:not(.social-btn-outlined).btn-youtube.btn-link:hover { + color: #a11918 +} + +.btn:not(.social-btn-outlined).btn-github { + background: #333; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-github:hover { + background: #1a1a1a +} + +.btn:not(.social-btn-outlined).btn-github.btn-link { + background: 0 0; + color: #333 +} + +.btn:not(.social-btn-outlined).btn-github.btn-link:hover { + color: #1a1a1a +} + +.btn:not(.social-btn-outlined).btn-behance { + background: #0454f6; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-behance:hover { + background: #0343c4 +} + +.btn:not(.social-btn-outlined).btn-behance.btn-link { + background: 0 0; + color: #0454f6 +} + +.btn:not(.social-btn-outlined).btn-behance.btn-link:hover { + color: #0343c4 +} + +.btn:not(.social-btn-outlined).btn-dribbble { + background: #ea4c89; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-dribbble:hover { + background: #e51e6b +} + +.btn:not(.social-btn-outlined).btn-dribbble.btn-link { + background: 0 0; + color: #ea4c89 +} + +.btn:not(.social-btn-outlined).btn-dribbble.btn-link:hover { + color: #e51e6b +} + +.btn:not(.social-btn-outlined).btn-reddit { + background: #ed4333; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-reddit:hover { + background: #da2413 +} + +.btn:not(.social-btn-outlined).btn-reddit.btn-link { + background: 0 0; + color: #ed4333 +} + +.btn:not(.social-btn-outlined).btn-reddit.btn-link:hover { + color: #da2413 +} + +.btn:not(.social-btn-outlined).btn-instagram { + background: #ff759b; + border: none; + color: #fff +} + +.btn:not(.social-btn-outlined).btn-instagram:hover { + background: #ff4276 +} + +.btn:not(.social-btn-outlined).btn-instagram.btn-link { + background: 0 0; + color: #ff759b +} + +.btn:not(.social-btn-outlined).btn-instagram.btn-link:hover { + color: #ff4276 +} + +.btn-group label.btn.btn-primary:not(:disabled):not(.disabled).active { + background: #000e01 +} + +.btn-group label.btn.btn-secondary:not(:disabled):not(.disabled).active { + background: #4d4d4d +} + +.btn-group label.btn.btn-success:not(:disabled):not(.disabled).active { + background: #007a50 +} + +.btn-group label.btn.btn-info:not(:disabled):not(.disabled).active { + background: #1d0de4 +} + +.btn-group label.btn.btn-warning:not(:disabled):not(.disabled).active { + background: #d54314 +} + +.btn-group label.btn.btn-danger:not(:disabled):not(.disabled).active { + background: #f8000b +} + +.btn-group label.btn.btn-light:not(:disabled):not(.disabled).active { + background: #acacac +} + +.btn-group label.btn.btn-dark:not(:disabled):not(.disabled).active { + background: #424447 +} + +.btn-group label.btn.btn-white:not(:disabled):not(.disabled).active { + background: #ccc +} + +.btn-outline-primary { + border: 2px solid #047006 +} + +.btn-outline-secondary { + border: 2px solid grey +} + +.btn-outline-success { + border: 2px solid #047006 +} + +.btn-outline-info { + border: 2px solid #6c61f6 +} + +.btn-outline-warning { + border: 2px solid #f0825f +} + +.btn-outline-danger { + border: 2px solid #ff5f66 +} + +.btn-outline-light { + border: 2px solid #dfdfdf +} + +.btn-outline-dark { + border: 2px solid #74767b +} + +.btn-outline-white { + border: 2px solid #fff +} + +.btn-group label.btn input { + display: none +} + +.btn { + display: -webkit-inline-box; + display: inline-flex; + -webkit-box-pack: center; + justify-content: center; + -webkit-box-align: center; + align-items: center; + -webkit-transition: .3s ease; + transition: .3s ease; + -webkit-transition-property: background, color; + transition-property: background, color; + font-size: .875rem; + font-family: Roboto, sans-serif; + font-weight: 600; + letter-spacing: .03rem +} + +.btn:not([class*=btn-inverse]):not(.component-flat) { + box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2) +} + +.btn i { + font-size: 1.25rem +} + +.btn-group-lg>.btn, +.btn.btn-lg { + height: 55px; + max-height: 55px; + padding: 15px 30px; + font-size: 1.125rem +} + +.btn-group-sm>.btn, +.btn.btn-sm { + height: 35px; + max-height: 35px; + padding: 4px 15px; + font-size: .875rem +} + +.btn.btn-xs { + height: 25px; + max-height: 25px; + padding: 0 10px; + line-height: 1; + font-size: .75rem +} + +.btn.btn-xs.has-icon i, +.btn.btn-xs.has-icon span { + font-size: .8125rem; + margin-right: 5px +} + +.btn { + height: 40px; + max-height: 40px; + padding: 5px 20px +} + +.btn.active { + box-shadow: none +} + +.btn.social-icon-btn { + height: 40px; + width: 40px +} + +.btn.social-btn i { + margin-right: 10px +} + +.btn.social-btn-outlined i { + margin-right: 10px +} + +.btn.has-icon i, +.btn.has-icon span { + font-size: 1.25rem; + margin-right: 10px; + line-height: 1 +} + +.btn.btn-outline-secondary { + color: #1a1a1a; + border-color: #676767 +} + +.btn.btn-info, +.btn.btn-warning { + color: #fff +} + +.btn.btn-light { + background: #fff; + color: #000 +} + +.btn.dropdown-dotted-list { + background: #fff +} + +.btn.dropdown-toggle-split { + padding: 0 8px +} + +.btn.action-btn { + display: -webkit-inline-box; + display: inline-flex; + -webkit-box-pack: center; + justify-content: center; + -webkit-box-align: center; + align-items: center; + padding: 0; + height: 40px; + width: 40px +} + +.btn.action-btn i { + font-size: 1.25rem; + width: 26px; + display: -webkit-box; + display: flex; + -webkit-box-pack: center; + justify-content: center; + -webkit-box-align: center; + align-items: center; + line-height: 23px; + vertical-align: middle; + font-size: 1.25rem +} + +.btn.action-btn i:before { + width: inherit; + height: inherit; + line-height: inherit; + font-size: inherit +} + +.btn.action-btn.btn-xs { + height: 30px; + width: 30px +} + +.btn-group-sm>.btn.action-btn, +.btn.action-btn.btn-sm { + height: 35px; + width: 35px +} + +.btn-group-lg>.btn.action-btn, +.btn.action-btn.btn-lg { + height: 50px; + width: 50px +} + +.btn-group-lg>.btn.action-btn i, +.btn.action-btn.btn-lg i { + font-size: 1.875rem; + line-height: 24px +} + +.btn.action-btn.btn-refresh.clicked i { + color: #047006; + -webkit-animation: rotate360 .8s linear infinite; + animation: rotate360 .8s linear infinite +} + +.btn.action-btn.btn-like.clicked i { + color: #ff5f66; + -webkit-animation: bounceIn .8s linear 1; + animation: bounceIn .8s linear 1 +} + +.btn.action-btn.btn-like.clicked:hover i { + color: #fff +} + +.btn.btn-rounded { + border-radius: 50px +} + +.flag-germany { + width: 40px; + height: 28px; + background: red; + border-top: 9px solid #000; + border-bottom: 9px solid #fc0; + display: block +} + +.flag-england { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==); + background-size: cover; + width: 40px; + height: 28px; + display: block +} + +.language-active { + background-color: #f9fafb; + padding: 2px +} + +.language-inactive { + padding: 2px; + background-color: transparent +} + +.is-invalid .form-control { + background-color: rgba(240, 130, 95, .2); + border: none +} + +.is-invalid .invalid-feedback { + display: block +} + +.is-valid .form-control { + background-color: rgba(4, 112, 6, .2); + border: none +} + +.form-control { + padding-left: 20px; + padding-right: 20px; + color: rgba(16, 16, 16, .8) +} + +.form-control.placeholder { + font-weight: inherit; + color: inherit; + font-size: inherit +} + +.form-control:-moz-placeholder { + font-weight: inherit; + color: inherit; + font-size: inherit +} + +.form-control::-moz-placeholder { + font-weight: inherit; + color: inherit; + font-size: inherit +} + +.form-control:-ms-input-placeholder { + font-weight: inherit; + color: inherit; + font-size: inherit +} + +.form-control::-webkit-input-placeholder { + font-weight: inherit; + color: inherit; + font-size: inherit +} + +.form-control.is-invalid { + background-color: rgba(240, 130, 95, .2); + border: none +} + +.form-control.is-valid { + background-color: rgba(4, 112, 6, .2); + border: none +} + +.input-group-text { + background-color: #f6f7f9; + color: #101010; + border-color: #f2f4f9; + padding: 0 10px; + font-size: 17px +} + +.is-valid .input-group-text { + background-color: rgba(4, 112, 6, .2); + color: #047006 +} + +.is-invalid .input-group-text { + background-color: rgba(240, 130, 95, .2); + color: #f0825f +} + +.form-group { + margin-bottom: 20px +} + +.form-group.input-rounded .form-control { + border-radius: 25px +} + +.custom-file .custom-file-label { + padding: 8px .75rem; + height: 41px +} + +.custom-file .custom-file-label:after { + padding: 1.45rem .8rem; + line-height: 0 +} + +.custom-select, +.custom-select[multiple] { + background: #f6f7f9; + border-color: #f0f2f5; + color: rgba(16, 16, 16, .8) +} + +.custom-select option, +.custom-select[multiple] option { + background: #f6f7f9; + color: rgba(16, 16, 16, .8); + display: block; + border-bottom: 1px solid #f2f4f9; + padding: 5px 10px +} + +.custom-select option:checked, +.custom-select[multiple] option:checked { + background: #f6f7f9 +} + +.custom-select option[selected], +.custom-select[multiple] option[selected] { + background: #f6f7f9; + display: block +} + +.custom-select[multiple] { + padding: 0; + border-radius: 2px +} + +.custom-control-input:focus~.custom-control-label::before { + box-shadow: none +} + +.custom-switch .custom-control-label::after { + box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2); + background: #047006 +} + +.tab-container.tab-bg-primary .nav-pills .nav-item .nav-link, +.tab-container.tab-bg-primary .nav-tabs .nav-item .nav-link { + color: #047006 +} + +.tab-container.tab-bg-primary .nav-pills .nav-item .nav-link i, +.tab-container.tab-bg-primary .nav-tabs .nav-item .nav-link i { + color: inherit +} + +.tab-container.tab-bg-primary .nav-pills .nav-item .nav-link.active, +.tab-container.tab-bg-primary .nav-tabs .nav-item .nav-link.active { + background: #047006; + color: #fff +} + +.tab-container.tab-bg-primary .tab-content { + background: #047006; + color: #fff +} + +.tab-container.tab-bg-secondary .nav-pills .nav-item .nav-link, +.tab-container.tab-bg-secondary .nav-tabs .nav-item .nav-link { + color: grey +} + +.tab-container.tab-bg-secondary .nav-pills .nav-item .nav-link i, +.tab-container.tab-bg-secondary .nav-tabs .nav-item .nav-link i { + color: inherit +} + +.tab-container.tab-bg-secondary .nav-pills .nav-item .nav-link.active, +.tab-container.tab-bg-secondary .nav-tabs .nav-item .nav-link.active { + background: grey; + color: #fff +} + +.tab-container.tab-bg-secondary .tab-content { + background: grey; + color: #fff +} + +.tab-container.tab-bg-success .nav-pills .nav-item .nav-link, +.tab-container.tab-bg-success .nav-tabs .nav-item .nav-link { + color: #047006 +} + +.tab-container.tab-bg-success .nav-pills .nav-item .nav-link i, +.tab-container.tab-bg-success .nav-tabs .nav-item .nav-link i { + color: inherit +} + +.tab-container.tab-bg-success .nav-pills .nav-item .nav-link.active, +.tab-container.tab-bg-success .nav-tabs .nav-item .nav-link.active { + background: #047006; + color: #fff +} + +.tab-container.tab-bg-success .tab-content { + background: #047006; + color: #fff +} + +.tab-container.tab-bg-info .nav-pills .nav-item .nav-link, +.tab-container.tab-bg-info .nav-tabs .nav-item .nav-link { + color: #6c61f6 +} + +.tab-container.tab-bg-info .nav-pills .nav-item .nav-link i, +.tab-container.tab-bg-info .nav-tabs .nav-item .nav-link i { + color: inherit +} + +.tab-container.tab-bg-info .nav-pills .nav-item .nav-link.active, +.tab-container.tab-bg-info .nav-tabs .nav-item .nav-link.active { + background: #6c61f6; + color: #fff +} + +.tab-container.tab-bg-info .tab-content { + background: #6c61f6; + color: #fff +} + +.tab-container.tab-bg-warning .nav-pills .nav-item .nav-link, +.tab-container.tab-bg-warning .nav-tabs .nav-item .nav-link { + color: #f0825f +} + +.tab-container.tab-bg-warning .nav-pills .nav-item .nav-link i, +.tab-container.tab-bg-warning .nav-tabs .nav-item .nav-link i { + color: inherit +} + +.tab-container.tab-bg-warning .nav-pills .nav-item .nav-link.active, +.tab-container.tab-bg-warning .nav-tabs .nav-item .nav-link.active { + background: #f0825f; + color: #fff +} + +.tab-container.tab-bg-warning .tab-content { + background: #f0825f; + color: #fff +} + +.tab-container.tab-bg-danger .nav-pills .nav-item .nav-link, +.tab-container.tab-bg-danger .nav-tabs .nav-item .nav-link { + color: #ff5f66 +} + +.tab-container.tab-bg-danger .nav-pills .nav-item .nav-link i, +.tab-container.tab-bg-danger .nav-tabs .nav-item .nav-link i { + color: inherit +} + +.tab-container.tab-bg-danger .nav-pills .nav-item .nav-link.active, +.tab-container.tab-bg-danger .nav-tabs .nav-item .nav-link.active { + background: #ff5f66; + color: #fff +} + +.tab-container.tab-bg-danger .tab-content { + background: #ff5f66; + color: #fff +} + +.tab-container.tab-bg-light .nav-pills .nav-item .nav-link, +.tab-container.tab-bg-light .nav-tabs .nav-item .nav-link { + color: #dfdfdf +} + +.tab-container.tab-bg-light .nav-pills .nav-item .nav-link i, +.tab-container.tab-bg-light .nav-tabs .nav-item .nav-link i { + color: inherit +} + +.tab-container.tab-bg-light .nav-pills .nav-item .nav-link.active, +.tab-container.tab-bg-light .nav-tabs .nav-item .nav-link.active { + background: #dfdfdf; + color: #fff +} + +.tab-container.tab-bg-light .tab-content { + background: #dfdfdf; + color: #fff +} + +.tab-container.tab-bg-dark .nav-pills .nav-item .nav-link, +.tab-container.tab-bg-dark .nav-tabs .nav-item .nav-link { + color: #74767b +} + +.tab-container.tab-bg-dark .nav-pills .nav-item .nav-link i, +.tab-container.tab-bg-dark .nav-tabs .nav-item .nav-link i { + color: inherit +} + +.tab-container.tab-bg-dark .nav-pills .nav-item .nav-link.active, +.tab-container.tab-bg-dark .nav-tabs .nav-item .nav-link.active { + background: #74767b; + color: #fff +} + +.tab-container.tab-bg-dark .tab-content { + background: #74767b; + color: #fff +} + +.tab-container.tab-bg-white .nav-pills .nav-item .nav-link, +.tab-container.tab-bg-white .nav-tabs .nav-item .nav-link { + color: #fff +} + +.tab-container.tab-bg-white .nav-pills .nav-item .nav-link i, +.tab-container.tab-bg-white .nav-tabs .nav-item .nav-link i { + color: inherit +} + +.tab-container.tab-bg-white .nav-pills .nav-item .nav-link.active, +.tab-container.tab-bg-white .nav-tabs .nav-item .nav-link.active { + background: #fff; + color: #fff +} + +.tab-container.tab-bg-white .tab-content { + background: #fff; + color: #fff +} + +.nav-tabs { + border-bottom: 1px solid #f2f4f9 +} + +.tab-container .nav-pills, +.tab-container .nav-tabs { + border-bottom: none +} + +.tab-container .nav-pills .nav-item .nav-link, +.tab-container .nav-tabs .nav-item .nav-link { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: start; + justify-content: start; + font-family: Roboto, sans-serif; + font-weight: 500; + letter-spacing: 1; + padding: 7px 13px; + border: none; + -webkit-transition-duration: .3s; + transition-duration: .3s; + -webkit-transition-property: background, color; + transition-property: background, color +} + +.tab-container .nav-pills .nav-item .nav-link i, +.tab-container .nav-tabs .nav-item .nav-link i { + font-size: 20px; + line-height: 1 +} + +.tab-container .nav-pills .nav-item .nav-link .tab-tittle, +.tab-container .nav-tabs .nav-item .nav-link .tab-tittle { + display: inline-block +} + +.tab-container .nav-pills .nav-item .nav-link .tab-tittle.prepend, +.tab-container .nav-tabs .nav-item .nav-link .tab-tittle.prepend { + margin-left: 10px +} + +.tab-container .nav-pills .nav-item .nav-link .tab-tittle.append, +.tab-container .nav-tabs .nav-item .nav-link .tab-tittle.append { + margin-right: 10px +} + +.tab-container .tab-content { + padding: 30px 20px 20px 20px; + width: 100%; + background: #f0f2f5 +} + +.tab-container .nav-tabs .nav-link { + color: #101010 +} + +.tab-container .nav-tabs .nav-link i { + color: #101010 +} + +.tab-container .nav-tabs .nav-link.active { + background: #f7f7f7; + color: #047006 +} + +.tab-container .nav-tabs .nav-link.active i { + color: inherit +} + +.tab-container .nav-pills { + margin: 10px +} + +.tab-container .nav-pills .nav-link.active { + box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2); + color: #fff +} + +.tab-container.vertical-tabs { + display: -webkit-box; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + -webkit-box-flex: 1; + flex-grow: 1 +} + +.tab-container.vertical-tabs .nav-pills, +.tab-container.vertical-tabs .nav-tabs { + float: left; + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column +} + +.table, +table { + margin-bottom: 0 +} + +.table tfoot tr th, +.table thead tr th, +table tfoot tr th, +table thead tr th { + border-bottom-width: 1px; + font-family: Roboto, sans-serif; + font-weight: 500 +} + +.table tbody tr, +table tbody tr { + -webkit-transition-duration: .5s; + transition-duration: .5s +} + +.table tbody tr td, +table tbody tr td { + font-family: Roboto, sans-serif; + font-weight: 400; + vertical-align: middle +} + +.table tbody tr td .input-frame:after, +table tbody tr td .input-frame:after { + top: 5px +} + +.table tbody tr td span, +table tbody tr td span { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center +} + +.table tbody tr td span .status-indicator, +table tbody tr td span .status-indicator { + margin-right: 5px +} + +.table tbody tr td .image, +table tbody tr td .image { + max-width: 75px; + width: 100% +} + +.table tbody tr.text-align-edge td:first-child, +table tbody tr.text-align-edge td:first-child { + padding-left: 0; + text-align: left +} + +.table tbody tr.text-align-edge td:last-child, +table tbody tr.text-align-edge td:last-child { + padding-right: 0; + text-align: right +} + +.table td, +.table th, +table td, +table th { + white-space: nowrap +} + +.table:not(.table-dark) thead tr.solid-header th, +table:not(.table-dark) thead tr.solid-header th { + background: #fafafa; + border-top: 1px solid #f2f4f9 +} + +.table:not(.table-dark) tfoot, +.table:not(.table-dark) thead, +table:not(.table-dark) tfoot, +table:not(.table-dark) thead { + background: #e1e4e6 +} + +.table:not(.table-dark) tfoot tr th, +.table:not(.table-dark) thead tr th, +table:not(.table-dark) tfoot tr th, +table:not(.table-dark) thead tr th { + background: #fff; + color: #101010 +} + +.table:not(.table-dark) tbody tr[class*=bg], +table:not(.table-dark) tbody tr[class*=bg] { + box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2) +} + +.table:not(.table-dark) tbody tr[class*=bg] td, +table:not(.table-dark) tbody tr[class*=bg] td { + color: #fff; + border: none +} + +.table:not(.table-dark) tbody tr td, +table:not(.table-dark) tbody tr td { + color: #101010 +} + +.table:not(.table-bordered) tfoot tr th, +.table:not(.table-bordered) thead tr th, +table:not(.table-bordered) tfoot tr th, +table:not(.table-bordered) thead tr th { + border-top: none +} + +.table.info-table tr td, +.table.info-table tr th, +table.info-table tr td, +table.info-table tr th { + text-align: right +} + +.table.info-table tr td:first-child, +.table.info-table tr th:first-child, +table.info-table tr td:first-child, +table.info-table tr th:first-child { + text-align: left +} + +.table.info-table tr td.actions, +.table.info-table tr th.actions, +table.info-table tr td.actions, +table.info-table tr th.actions { + padding-left: 0 +} + +.tippy-tooltip[data-animation=fade][data-state=hidden] { + opacity: 0 +} + +.tippy-iOS { + cursor: pointer !important; + -webkit-tap-highlight-color: transparent +} + +.tippy-popper { + pointer-events: none; + max-width: calc(100vw - 10px); + -webkit-transition-timing-function: cubic-bezier(.165, .84, .44, 1); + transition-timing-function: cubic-bezier(.165, .84, .44, 1); + -webkit-transition-property: -webkit-transform; + transition-property: -webkit-transform; + transition-property: transform; + transition-property: transform, -webkit-transform +} + +.tippy-tooltip { + position: relative; + color: #fff; + border-radius: 4px; + font-size: 14px; + line-height: 1.4; + background-color: #333; + -webkit-transition-property: visibility, opacity, -webkit-transform; + transition-property: visibility, opacity, -webkit-transform; + transition-property: visibility, opacity, transform; + transition-property: visibility, opacity, transform, -webkit-transform; + outline: 0 +} + +.tippy-tooltip[data-placement^=top]>.tippy-arrow { + border-width: 8px 8px 0; + border-top-color: #333; + margin: 0 3px; + -webkit-transform-origin: 50% 0; + transform-origin: 50% 0; + bottom: -7px +} + +.tippy-tooltip[data-placement^=bottom]>.tippy-arrow { + border-width: 0 8px 8px; + border-bottom-color: #333; + margin: 0 3px; + -webkit-transform-origin: 50% 7px; + transform-origin: 50% 7px; + top: -7px +} + +.tippy-tooltip[data-placement^=left]>.tippy-arrow { + border-width: 8px 0 8px 8px; + border-left-color: #333; + margin: 3px 0; + -webkit-transform-origin: 0 50%; + transform-origin: 0 50%; + right: -7px +} + +.tippy-tooltip[data-placement^=right]>.tippy-arrow { + border-width: 8px 8px 8px 0; + border-right-color: #333; + margin: 3px 0; + -webkit-transform-origin: 7px 50%; + transform-origin: 7px 50%; + left: -7px +} + +.tippy-tooltip[data-interactive][data-state=visible] { + pointer-events: auto +} + +.tippy-tooltip[data-inertia][data-state=visible] { + -webkit-transition-timing-function: cubic-bezier(.54, 1.5, .38, 1.11); + transition-timing-function: cubic-bezier(.54, 1.5, .38, 1.11) +} + +.tippy-arrow { + position: absolute; + border-color: transparent; + border-style: solid +} + +.tippy-content { + padding: 5px 9px +} + +.tippy-tooltip { + color: #101010; + background-color: #f9fafb; + border-radius: 0; + font-size: 12px +} + +.tippy-tooltip .tippy-content b { + color: #047006 +} + +.tippy-tooltip .tippy-content ul { + list-style-type: none; + padding-left: 4px +} + +.tippy-tooltip .tippy-content .mdi { + font-size: 16px +} + +.tippy-tooltip .tippy-content .grid-header { + padding: 5px 10px; + margin-bottom: 5px +} + +.page-body { + background: #fff +} + +.page-content-wrapper { + background: #f9fafb; + border-left: 1px solid #f2f4f9 +} + +@media (min-width:992px) { + .t-header .t-header-content-wrapper { + border-left: 1px solid #f2f4f9 + } + +} + +@media (min-width:768px) { + .page-body { + position: relative; + display: grid; + max-width: 100%; + grid-template-columns: 17rem calc(100vw - 17rem); + -webkit-transition: .3s; + transition: .3s + } + + .page-body .page-content-wrapper { + position: relative; + width: 100%; + min-height: 100vh; + padding: 1.5rem 2.5rem calc(90px + 1.5rem); + margin-top: 70px + } + + .page-body .page-content-wrapper .page-content-wrapper-inner { + max-width: 1140px; + margin-left: auto; + margin-right: auto + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header { + position: -webkit-sticky; + position: sticky; + top: 70px; + background: #f9fafb; + z-index: 99 + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb { + padding: 1rem 1rem 1rem 21px; + margin-left: -20px; + margin-right: -20px; + background: #f9fafb + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item { + color: #565656; + letter-spacing: .03rem; + font-family: Roboto, sans-serif; + font-weight: 500 + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item a { + color: inherit + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item.active { + color: #047006 + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-title-heading { + color: #565656; + font-size: 1.5rem; + font-family: Roboto, sans-serif; + font-weight: 500; + margin-bottom: 0 + } + + .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-description { + opacity: .7; + margin-top: 15px + } + + body.sidebar-minimized .t-header .t-header-brand-wrapper { + background: #f9fafb + } + + body.sidebar-minimized .t-header .t-header-content-wrapper { + border-left: #f9fafb + } + + body.sidebar-minimized .page-body { + grid-template-columns: 0 100% + } + + body.sidebar-minimized .page-body .sidebar .sidebar_footer { + left: -17rem + } + + body.sidebar-minimized .page-body .sidebar .nav-category-divider { + position: initial + } + +} + +@media (max-width:991.98px) { + .t-header { + width: 100vw + } + + .t-header .t-header-brand-wrapper { + background: #f9fafb; + width: 4rem; + min-width: 4rem; + max-width: 4rem + } + + .t-header .t-header-brand-wrapper a .logo { + -webkit-animation-name: menuItemFadeIn; + animation-name: menuItemFadeIn; + -webkit-animation-duration: .25s; + animation-duration: .25s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + display: none + } + + @-webkit-keyframes menuItemFadeIn { + from { + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + display: none; + opacity: 0 + } + + to { + display: block; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + + } + + @keyframes menuItemFadeIn { + from { + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + display: none; + opacity: 0 + } + + to { + display: block; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + + } + + .t-header .t-header-brand-wrapper a .logo-mini { + display: block + } + + .page-body { + display: -webkit-box; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + overflow: hidden; + max-width: 100% + } + + .page-body .sidebar { + position: relative; + left: 0; + z-index: 99; + width: 15rem; + min-width: 15rem; + max-width: 15rem; + margin-left: -15rem; + -webkit-transition-duration: .2s; + transition-duration: .2s; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-property: margin-left, width; + transition-property: margin-left, width + } + + .page-body .sidebar .sidebar_footer { + -webkit-transition-duration: .2s; + transition-duration: .2s; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-property: left; + transition-property: left; + left: -15rem + } + + .page-body .page-content-wrapper { + padding: 20px 20px; + min-width: 100vw; + margin-left: 0; + -webkit-transition-duration: .2s; + transition-duration: .2s; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-property: margin-left; + transition-property: margin-left + } + + .page-body .page-content-wrapper .viewport-header .breadcrumb { + background: 0 0; + padding-left: 0 + } + + .page-body .page-content-wrapper footer { + position: relative + } + + .page-body.sidebar-collpased .sidebar { + margin-left: 0; + min-width: 15rem + } + + .page-body.sidebar-collpased .sidebar .sidebar_footer { + left: 0 + } + +} + +@media (max-width:767.98px) { + .page-body .page-content-wrapper { + padding: 80px 20px 0 20px + } + +} + +.profile-img.bg-inverse-primary { + color: #047006 +} + +.profile-img.bg-inverse-secondary { + color: grey +} + +.profile-img.bg-inverse-success { + color: #047006 +} + +.profile-img.bg-inverse-info { + color: #6c61f6 +} + +.profile-img.bg-inverse-warning { + color: #f0825f +} + +.profile-img.bg-inverse-danger { + color: #ff5f66 +} + +.profile-img.bg-inverse-light { + color: #dfdfdf +} + +.profile-img.bg-inverse-dark { + color: #74767b +} + +.profile-img.bg-inverse-white { + color: #fff +} + +.notification-indicator-primary { + background: #047006 +} + +.notification-indicator-primary:before { + content: '3'; + background: rgba(4, 112, 6, .5) +} + +.notification-indicator-secondary { + background: grey +} + +.notification-indicator-secondary:before { + content: '.5'; + background: rgba(128, 128, 128, .5) +} + +.notification-indicator-success { + background: #047006 +} + +.notification-indicator-success:before { + content: 'http://www.w3.org/2000/svg'; + background: rgba(0, 224, 147, .5) +} + +.notification-indicator-info { + background: #6c61f6 +} + +.notification-indicator-info:before { + content: '0 0 4 5'; + background: rgba(108, 97, 246, .5) +} + +.notification-indicator-warning { + background: #f0825f +} + +.notification-indicator-warning:before { + content: '%23343a40'; + background: rgba(240, 130, 95, .5) +} + +.notification-indicator-danger { + background: #ff5f66 +} + +.notification-indicator-danger:before { + content: 'M2 0L0 2h4zm0 5L0 3h4z'; + background: rgba(255, 95, 102, .5) +} + +.notification-indicator-light { + background: #dfdfdf +} + +.notification-indicator-light:before { + content: 'http://www.w3.org/2000/svg'; + background: rgba(223, 223, 223, .5) +} + +.notification-indicator-dark { + background: #74767b +} + +.notification-indicator-dark:before { + content: '%23dc3545'; + background: rgba(116, 118, 123, .5) +} + +.notification-indicator-white { + background: #fff +} + +.notification-indicator-white:before { + content: '-2 -2 7 7'; + background: rgba(255, 255, 255, .5) +} + +.border-top { + border-top-style: solid; + border-top-color: #f2f4f9; + border-top-width: 1px +} + +.border-right { + border-right-style: solid; + border-right-color: #f2f4f9; + border-right-width: 1px +} + +.border-bottom { + border-bottom-style: solid; + border-bottom-color: #f2f4f9; + border-bottom-width: 1px +} + +.border-left { + border-left-style: solid; + border-left-color: #f2f4f9; + border-left-width: 1px +} + +.ellipsor { + max-width: 100%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden +} + +.text-gray { + color: #565656 +} + +.overflow-hidden { + overflow: hidden +} + +.pos-relative { + position: relative +} + +.profile-img { + width: 40px; + height: 40px; + overflow: hidden +} + +.profile-img:not(.component-flat) { + box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2) +} + +.profile-img:not(.img-sm):not(.img-lg):not(.img-xl) img { + width: 40px; + height: 40px +} + +.profile-img:not(.img-rounded) { + border-radius: 6px +} + +.profile-img.no-avatar { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + text-align: center; + text-transform: uppercase; + font-family: Roboto, sans-serif; + font-weight: 600 +} + +.profile-img.img-rounded { + border-radius: 100% +} + +.grouped-images { + display: -webkit-box; + display: flex +} + +.grouped-images .plus-text, +.grouped-images img { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + text-align: center; + border-radius: 100%; + overflow: hidden; + margin-right: -10px; + margin-right: -10px; + border: 3px solid #fff; + background: #f0f2f5; + color: #565656; + font-family: Roboto, sans-serif; + font-weight: 700; + letter-spacing: .03rem +} + +.grouped-images .plus-text:not(.img-sm):not(.img-lg):not(.img-xl), +.grouped-images img:not(.img-sm):not(.img-lg):not(.img-xl) { + width: 40px; + height: 40px +} + +.img-sm { + width: 30px; + height: 30px +} + +.img-lg { + width: 80px; + height: 80px +} + +.img-xl { + width: 100px; + height: 100px +} + +.mdi.mdi-1x:before { + font-size: 1.25rem +} + +.mdi.mdi-2x:before { + font-size: 1.5625rem +} + +.mdi.mdi-3x:before { + font-size: 1.875rem +} + +.mdi.mdi-4x:before { + font-size: 2.1875rem +} + +.mdi.mdi-5x:before { + font-size: 2.5rem +} + +.mdi.mdi-6x:before { + font-size: 3.125rem +} + +.mdi.mdi-7x:before { + font-size: 3.75rem +} + +.status-indicator { + display: inline-block; + width: 12px; + min-width: 12px; + height: 12px; + border-radius: 4px +} + +.status-indicator.rounded-indicator { + border-radius: 50px +} + +.status-indicator.small { + width: 7px; + min-width: 7px; + height: 7px +} + +.text-black { + color: #101010 +} + +.notification-indicator { + display: block; + width: 7px; + height: 7px; + border-radius: 100%; + z-index: 0 +} + +.notification-indicator.notification-indicator-ripple:before { + content: '%23dc3545'; + display: block; + width: 26px; + height: 26px; + z-index: -1; + position: absolute; + top: -9px; + left: -9px; + border-radius: 100%; + opacity: 0; + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + mix-blend-mode: screen; + -webkit-animation: ripple 1.2s ease-out; + animation: ripple 1.2s ease-out; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite +} + +.logo { + display: block; + margin: 0 auto; + width: 280px +} + +.logo img { + width: 100% +} + +.grid { + background: #fff; + border-radius: 6px; + box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2); + margin-bottom: 1.5rem; + border: 1px solid rgba(238, 238, 238, .75) +} + +.grid-header { + padding: 15px 20px; + margin-bottom: 15px; + font-family: Roboto, sans-serif; + font-weight: 500; + letter-spacing: .03rem; + background: #f9fafb; + border-left: 3px solid #047006; + border-radius: 0 6px 0 0 +} + +.grid-title { + opacity: .9; + margin-bottom: 25px +} + +.close { + color: #101010 +} + +.split-header { + display: -webkit-box; + display: flex; + -webkit-box-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + align-items: center +} + +.split-header .content-wrapper { + display: -webkit-box; + display: flex +} + +.split-header .content-wrapper a i, +.split-header .content-wrapper span i { + font-size: 20px; + color: #adb5bd; + -webkit-transition: .3s ease color; + transition: .3s ease color +} + +.split-header .content-wrapper a i:hover, +.split-header .content-wrapper span i:hover { + color: #047006 +} + +.split-header .content-wrapper.v-centered { + -webkit-box-align: center; + align-items: center +} + +.split-header .content-wrapper.h-centered { + -webkit-box-pack: center; + justify-content: center +} + +.grid-body { + padding: 20px 25px 20px +} + +.card-title { + font-family: Roboto, sans-serif; + font-weight: 500; + color: #313131; + margin-bottom: 0 +} + +.equel-grid { + display: -webkit-box; + display: flex; + -webkit-box-align: stretch; + align-items: stretch +} + +.equel-grid .grid { + width: 100%; + min-width: 100% +} + +.showcase_row_area { + margin-bottom: 20px +} + +.showcase_row_area .showcase_text_area { + text-align: right +} + +@media (max-width:767.98px) { + .showcase_row_area .showcase_text_area { + text-align: left + } + +} + +.showcase_row_area .showcase_content_area { + margin-bottom: -10px +} + +.showcase_row_area .showcase_content_area .btn { + margin-right: 5px; + margin-bottom: 10px +} + +.showcase_row_area:last-child { + margin-bottom: 0 +} + +.content-preview { + width: 45px; + height: 45px +} + +.content-preview.rounded { + border-radius: 100% +} + +.btn:not(.disabled),.cursor_pointer,a { + cursor: pointer +} + +.grd-positive-currency { + color: #047006 +} + +.grd-negative-currency { + color: red +} + +.color-success { + color: var(--success) +} + +.color-danger { + color: var(--danger) +} + +.color-warning { + color: var(--warning) +} + +.color-primary { + color: var(--primary) +} + +.btn-gradido-orange { + color: #fff; + background-color: #ffa600; + border-color: #ffa600 +} + +.visible-modal { + display: block +} + +.margin-top-10 { + margin-top: 10px +} + +.pull-right { + float: right +} + +.pull-right-row { + display: block; + margin-right: 10px +} + +.display-block { + display: block +} + +p.grd_small { + margin-top: 2px; + margin-bottom: 2px +} + +ul.grd-no-style { + list-style-type: none +} + +.center-ul-container ul { + padding-left: 0; + margin-bottom: 0; + text-align: center +} + +.center-ul-container ul .grd-error { + margin-top: 5px; + color: #8b0000 +} + +.grd-alert-color { + color: #ff5f66 !important +} + +.grd-success-color { + color: #047006 !important +} + +.grd-orange-color { + color: #ffa600 +} + +.hidden { + display: none +} + +.alert { + cursor: pointer +} + +.table.table-auto-break td, +.table.table-auto-break th { + white-space: pre-line +} diff --git a/community_server/webroot/css/styles.css b/community_server/webroot/css/styles.css new file mode 100644 index 000000000..143cbdc08 --- /dev/null +++ b/community_server/webroot/css/styles.css @@ -0,0 +1,347 @@ +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* + Created on : 30.10.2019, 09:26:42 + Author : einhornimmond +*/ +.dev-info { + position: fixed; + color: grey; + font-size: smaller; + left: 8px; +} +.grd-time-used { + bottom: 0; +} +.versionstring { + top: 0; +} +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* + Created on : 12.07.2019, 07:59:32 + Author : einhornimmond +*/ +div[role='grd_dialog'] { + position: fixed; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + top: 0; + left: 0; +} +div.grd_modal-dialog { + margin-top: 100px; + min-height: 200px; + max-width: 1000px; + margin-left: auto; + margin-right: auto; + background-color: white; + color: black; + border: 1px solid grey; +} +div.grd_modal-dialog.grd_dialog-large { + margin-top: 5px; + width: 90%; +} +div.grd_modal-body { + padding: 25px; +} +div.grd_modal-header { + background-color: rgba(0, 0, 0, 0.1); + padding: 5px; + padding-left: 15px; + border: 1px solid grey; + color: black; +} +div.grd_modal-footer { + background-color: rgba(0, 0, 0, 0.1); + height: 40px; +} +.grd_modal-footer a, +.grd_modal-footer button { + float: right; + padding: 9px; + margin-right: 10px; + border: 1px solid grey; +} +.grd_modal-footer a:hover, +.grd_modal-footer button:hover { + background-color: rgba(255, 255, 255, 0.5); +} +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* + Created on : 30.10.2019, 14:41:57 + Author : einhornimmond +*/ +/* Button */ +/*a.grd_bn,a.grd_bn:visited { + color:black; + text-decoration: none; +} +*/ +.grd-form-bn:hover, +.grd-active { + background-color: lightgray; + border-color: black; +} +.grd-form-bn { + padding: 5px; + border: 1px solid grey; + display: table-cell; + text-align: center; + vertical-align: middle; + color: #444; +} +a.grd-form-bn, +a.grd-form-bn:visited { + color: black; + text-decoration: none; +} +.grd-form-bn-succeed { + background-color: lightcyan; + color: green; + margin-top: 3px; + margin-bottom: 3px; +} +.grd-form-bn-succeed:not([disabled]):hover { + background-color: lightgreen; +} +.grd-form-bn-discard { + margin-left: 5px; + border: 1px solid red; + color: red; + cursor: pointer; +} +/* +.grd_large-bn { + width:100vw; + height:25vh; + font-size: 8vh; +} + +.grd_bg-bn { + width:50vw; + height:25vh; + font-size: 7vh; +} + +.gr_md-bn { + width:50vw; + height:25vh; + font-size: 6vh; +} +*/ +/* form elements */ +.grd_textarea { + border: 1px solid grey; + background-color: rgba(0, 0, 0, 0.05); + padding: 5px; + font-style: italic; +} +.grd-input label { + display: block; +} +input.grd-privkey { + width: 465px; +} +input.grd-pubkey { + width: 465px; +} +input.grd-non-der-keys { + width: 900px; +} +input:not([type='radio']) { + width: 200px; +} +label:not(.grd_radio_label) { + width: 80px; + display: inline-block; +} +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* + Created on : 13.10.2019, 15:43:58 + Author : einhornimmond +*/ +.grd-time-used { + position: fixed; + bottom: 0; + left: 0; + color: grey; + font-size: smaller; +} +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* + Created on : 30.10.2019, 16:04:16 + Author : einhornimmond +*/ +/* messages, update flash */ +.grd-error { + color: red; + border: 1px solid rgba(255, 0, 0, 0.5); + padding: 5px; +} +.grd-info { + border: 1px dotted gray; + padding: 5px; +} +.grd-success { + padding: 5px; + color: green; +} +.flash-messages .message { + padding: 5px; +} +.flash-messages .success { + color: green; +} +.flash-messages .error { + color: red; +} +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* + Created on : 30.10.2019, 14:16:16 + Author : einhornimmond +*/ +/* navbar */ +nav.grd-left-bar { + position: fixed; + top: 80.5px; +} +nav .grd-nav-bn { + width: 120px; +} +nav ul { + margin-top: 0; + padding-left: 0; +} +/* buttons */ +.grd-nav-bn:hover, +.grd-active { + background-color: lightgray; + border-color: black; +} +.grd-nav-bn { + padding: 10px; + border: 1px solid grey; + display: table-cell; + text-align: center; + vertical-align: middle; + color: grey; +} +.grd-nav-without-border { + border: none; +} +.grd-nav-bn-large { + width: 40vw; + height: 18vh; + font-size: 35px; +} +a.grd-nav-bn, +a.grd-nav-bn:visited { + color: black; + text-decoration: none; +} +.grd-nav-bn-discard { + color: darkred !important; +} +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* + Created on : 07.07.2019, 16:20:15 + Author : einhornimmond +*/ +/* content container */ +.grd_container { + max-width: 820px; + margin-left: auto; + margin-right: auto; +} +.grd_container_small { + max-width: 500px; +} +.grd_text { + max-width: 550px; + margin-bottom: 5px; +} +.grd_text-max-width { + max-width: 550px; +} +/* layout helper */ +.grd_margin_5 { + margin: 5px; +} +.grd-margin-top-10 { + margin-top: 10px; +} +.grd-width-200 { + width: 200px; +} +.grd-padding-top-bottom-5 { + padding-top: 5px; + padding-bottom: 5px; +} +.grd-padding-top-bottom-10 { + padding-top: 10px; + padding-bottom: 10px; +} +.grd_margin-bottom { + margin-bottom: 5px; +} +.grd_right { + float: right; +} +a.grd_invisible_link { + color: black; + text-decoration: none; +} +a.grd_invisible_link:hover { + color: grey; +} +.grd_clickable { + cursor: pointer; +} +ul.grd-no-style { + list-style: none; +} +p.grd_small { + margin-top: 2px; + margin-bottom: 2px; +} +.grd-default-currency { + color: grey; +} +.grd-positive-currency { + color: green; +} +.grd-negative-currency { + color: red; +} +.admin-border { + border-color: #ffa600; +} diff --git a/community_server/webroot/favicon.ico b/community_server/webroot/favicon.ico new file mode 100644 index 000000000..5b44f2027 Binary files /dev/null and b/community_server/webroot/favicon.ico differ diff --git a/community_server/webroot/font/cakedingbats-webfont.eot b/community_server/webroot/font/cakedingbats-webfont.eot new file mode 100644 index 000000000..e8605d926 Binary files /dev/null and b/community_server/webroot/font/cakedingbats-webfont.eot differ diff --git a/community_server/webroot/font/cakedingbats-webfont.svg b/community_server/webroot/font/cakedingbats-webfont.svg new file mode 100644 index 000000000..d1e0c98f7 --- /dev/null +++ b/community_server/webroot/font/cakedingbats-webfont.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/community_server/webroot/font/cakedingbats-webfont.ttf b/community_server/webroot/font/cakedingbats-webfont.ttf new file mode 100644 index 000000000..13d54454e Binary files /dev/null and b/community_server/webroot/font/cakedingbats-webfont.ttf differ diff --git a/community_server/webroot/font/cakedingbats-webfont.woff b/community_server/webroot/font/cakedingbats-webfont.woff new file mode 100644 index 000000000..073baab11 Binary files /dev/null and b/community_server/webroot/font/cakedingbats-webfont.woff differ diff --git a/community_server/webroot/font/cakedingbats-webfont.woff2 b/community_server/webroot/font/cakedingbats-webfont.woff2 new file mode 100644 index 000000000..6e71eaf53 Binary files /dev/null and b/community_server/webroot/font/cakedingbats-webfont.woff2 differ diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.eot b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.eot new file mode 100644 index 000000000..3e035411c Binary files /dev/null and b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.eot differ diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf new file mode 100644 index 000000000..db76e5796 Binary files /dev/null and b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf differ diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff new file mode 100644 index 000000000..5f10918f0 Binary files /dev/null and b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff differ diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2 b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2 new file mode 100644 index 000000000..34df5fe02 Binary files /dev/null and b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2 differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Black.ttf b/community_server/webroot/fonts/Roboto/Roboto-Black.ttf new file mode 100644 index 000000000..689fe5cb3 Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Black.ttf differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Bold.ttf b/community_server/webroot/fonts/Roboto/Roboto-Bold.ttf new file mode 100644 index 000000000..d3f01ad24 Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Bold.ttf differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Light.ttf b/community_server/webroot/fonts/Roboto/Roboto-Light.ttf new file mode 100644 index 000000000..219063a57 Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Light.ttf differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Medium.ttf b/community_server/webroot/fonts/Roboto/Roboto-Medium.ttf new file mode 100644 index 000000000..1a7f3b0bb Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Medium.ttf differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Regular.ttf b/community_server/webroot/fonts/Roboto/Roboto-Regular.ttf new file mode 100644 index 000000000..2c97eeadf Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Regular.ttf differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Thin.ttf b/community_server/webroot/fonts/Roboto/Roboto-Thin.ttf new file mode 100644 index 000000000..b74a4fd1a Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Thin.ttf differ diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.eot b/community_server/webroot/fonts/materialdesignicons-webfont.eot new file mode 100644 index 000000000..fe283ac48 Binary files /dev/null and b/community_server/webroot/fonts/materialdesignicons-webfont.eot differ diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.svg b/community_server/webroot/fonts/materialdesignicons-webfont.svg new file mode 100644 index 000000000..b356c2977 --- /dev/null +++ b/community_server/webroot/fonts/materialdesignicons-webfont.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.ttf b/community_server/webroot/fonts/materialdesignicons-webfont.ttf new file mode 100644 index 000000000..3219fca04 Binary files /dev/null and b/community_server/webroot/fonts/materialdesignicons-webfont.ttf differ diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.woff b/community_server/webroot/fonts/materialdesignicons-webfont.woff new file mode 100644 index 000000000..abe1e47ef Binary files /dev/null and b/community_server/webroot/fonts/materialdesignicons-webfont.woff differ diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.woff2 b/community_server/webroot/fonts/materialdesignicons-webfont.woff2 new file mode 100644 index 000000000..47e8a2c3e Binary files /dev/null and b/community_server/webroot/fonts/materialdesignicons-webfont.woff2 differ diff --git a/community_server/webroot/img/50x50.png b/community_server/webroot/img/50x50.png new file mode 100644 index 000000000..7eb2b9ad8 Binary files /dev/null and b/community_server/webroot/img/50x50.png differ diff --git a/community_server/webroot/img/cake-logo.png b/community_server/webroot/img/cake-logo.png new file mode 100644 index 000000000..41939ef5a Binary files /dev/null and b/community_server/webroot/img/cake-logo.png differ diff --git a/community_server/webroot/img/cake.icon.png b/community_server/webroot/img/cake.icon.png new file mode 100644 index 000000000..394fa42d5 Binary files /dev/null and b/community_server/webroot/img/cake.icon.png differ diff --git a/community_server/webroot/img/cake.logo.svg b/community_server/webroot/img/cake.logo.svg new file mode 100644 index 000000000..e73abb54b --- /dev/null +++ b/community_server/webroot/img/cake.logo.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/community_server/webroot/img/cake.power.gif b/community_server/webroot/img/cake.power.gif new file mode 100644 index 000000000..8f8d570a2 Binary files /dev/null and b/community_server/webroot/img/cake.power.gif differ diff --git a/community_server/webroot/img/logo_half.png b/community_server/webroot/img/logo_half.png new file mode 100644 index 000000000..d6852eab8 Binary files /dev/null and b/community_server/webroot/img/logo_half.png differ diff --git a/community_server/webroot/img/logo_half.webp b/community_server/webroot/img/logo_half.webp new file mode 100644 index 000000000..d0e6c245b Binary files /dev/null and b/community_server/webroot/img/logo_half.webp differ diff --git a/community_server/webroot/img/logo_schrift.png b/community_server/webroot/img/logo_schrift.png new file mode 100644 index 000000000..062997764 Binary files /dev/null and b/community_server/webroot/img/logo_schrift.png differ diff --git a/community_server/webroot/img/logo_schrift.webp b/community_server/webroot/img/logo_schrift.webp new file mode 100644 index 000000000..bff8a245d Binary files /dev/null and b/community_server/webroot/img/logo_schrift.webp differ diff --git a/community_server/webroot/img/logo_schrift_half.png b/community_server/webroot/img/logo_schrift_half.png new file mode 100644 index 000000000..5dfb1b3ac Binary files /dev/null and b/community_server/webroot/img/logo_schrift_half.png differ diff --git a/community_server/webroot/img/logo_schrift_half.webp b/community_server/webroot/img/logo_schrift_half.webp new file mode 100644 index 000000000..fa7d49642 Binary files /dev/null and b/community_server/webroot/img/logo_schrift_half.webp differ diff --git a/community_server/webroot/index.php b/community_server/webroot/index.php new file mode 100644 index 000000000..2e697aedc --- /dev/null +++ b/community_server/webroot/index.php @@ -0,0 +1,41 @@ +emit($server->run()); + diff --git a/community_server/webroot/js/basic.js b/community_server/webroot/js/basic.js new file mode 100644 index 000000000..df53065fe --- /dev/null +++ b/community_server/webroot/js/basic.js @@ -0,0 +1,116 @@ +// cross browser dom is ready module from: +// https://www.competa.com/blog/cross-browser-document-ready-with-vanilla-javascript/ +var domIsReady = (function(domIsReady) { + var isBrowserIeOrNot = function() { + return (!document.attachEvent || typeof document.attachEvent === "undefined" ? 'not-ie' : 'ie'); + } + + domIsReady = function(callback) { + if (callback && typeof callback === 'function') { + if (isBrowserIeOrNot() !== 'ie') { + document.addEventListener("DOMContentLoaded", function() { + return callback(); + }); + } else { + document.attachEvent("onreadystatechange", function() { + if (document.readyState === "complete") { + return callback(); + } + }); + } + } else { + console.error('The callback is not a function!'); + } + } + + return domIsReady; +})(domIsReady || {}); + + +// vanilla ajax request, json get +function getJson(basisUrl, method, successFunction, errorFunction, timeoutFunction) { + var xhr = new XMLHttpRequest(); + + xhr.onload = function(e) { + var xhr = e.target; + //console.log(xhr); + var jsonReturn = []; + if (xhr.responseType === 'json') { + jsonReturn = xhr.response; + } else { + jsonReturn = JSON.parse(xhr.responseText); + } + successFunction(jsonReturn); + } + xhr.onerror = function(e) { + errorFunction(e); + } + xhr.ontimeout = function(e) { + timeoutFunction(e); + } + + var bustCache = '&' + new Date().getTime(); + //oReq.open('GET', e.target.dataset.url + bustCache, true); + xhr.open('GET', basisUrl + '?method=' + method + bustCache, true); + xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); + xhr.responseType = 'json'; + xhr.send(); +} + +// cross browser dom is ready +(function(document, window, domIsReady, undefined) { + domIsReady(function() { + var DesktopToggler = document.querySelector('#nav-action'); + var MobileToggler = document.querySelector('#nav-action-mobile'); + var HeaderToggle = document.querySelector('.t-header-toggler'); + + // SIDEBAR TOGGLE FUNCTION FOR LARGE SCREENS (SCREEN "LG" AND UP) + if (DesktopToggler) { + DesktopToggler.addEventListener('click', function() { + console.log('toggler clicked / Desktop'); + if (document.querySelector('.nav-menu').classList.contains('initial')) { + document.querySelector('.nav-menu').classList.remove('initial'); + document.querySelector('.nav-menu').classList.add('nav-menu-minimized'); + } else { + document.querySelector('.nav-menu').classList.toggle('nav-menu-minimized'); + document.querySelector('.nav-menu').classList.toggle('nav-menu-maximized'); + } + let big = document.querySelectorAll('.logo.big'); + big.forEach(function(el) { + el.classList.toggle('visible'); + }); + let small = document.querySelectorAll('.logo.small'); + small.forEach(function(el) { + el.classList.toggle('visible'); + }); + }); + } + + // SIDEBAR TOGGLE FUNCTION FOR MOBILE (SCREEN "MD" AND DOWN) + if (MobileToggler) { + MobileToggler.addEventListener('click', function() { + console.log('toggler clicked / Desktop'); + if (document.querySelector('.nav-menu').classList.contains('initial')) { + document.querySelector('.nav-menu').classList.remove('initial'); + document.querySelector('.nav-menu').classList.toggle('nav-menu-maximized'); + } else { + document.querySelector('.nav-menu').classList.toggle('nav-menu-minimized'); + document.querySelector('.nav-menu').classList.toggle('nav-menu-maximized'); + } + let big = document.querySelectorAll('.logo.big'); + big.forEach(function(el) { + el.classList.toggle('visible'); + }); + let small = document.querySelectorAll('.logo.small'); + small.forEach(function(el) { + el.classList.toggle('visible'); + }); + }); + } + if (HeaderToggle) { + HeaderToggle.addEventListener('click', function() { + HeaderToggle.classList.toggle('arrow'); + }); + } + }); +})(document, window, domIsReady); \ No newline at end of file diff --git a/community_server/webroot/js/core.js b/community_server/webroot/js/core.js new file mode 100644 index 000000000..9678001c2 --- /dev/null +++ b/community_server/webroot/js/core.js @@ -0,0 +1 @@ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(T,e){"use strict";var t=[],x=T.document,i=Object.getPrototypeOf,a=t.slice,g=t.concat,l=t.push,r=t.indexOf,n={},o=n.toString,m=n.hasOwnProperty,s=m.toString,u=s.call(Object),v={},y=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},_=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,noModule:!0};function b(e,t,n){var i,r=(t=t||x).createElement("script");if(r.text=e,n)for(i in c)n[i]&&(r[i]=n[i]);t.head.appendChild(r).parentNode.removeChild(r)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var C=function(e,t){return new C.fn.init(e,t)},f=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function h(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!y(e)&&!_(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+P+")"+P+"*"),K=new RegExp("="+P+"*([^\\]'\"]*?)"+P+"*\\]","g"),$=new RegExp(F),Q=new RegExp("^"+q+"$"),V={ID:new RegExp("^#("+q+")"),CLASS:new RegExp("^\\.("+q+")"),TAG:new RegExp("^("+q+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},z=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,X=/^[^{]+\{\s*\[native \w/,G=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,J=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),ee=function(e,t,n){var i="0x"+t-65536;return i!=i||n?t:i<0?String.fromCharCode(i+65536):String.fromCharCode(i>>10|55296,1023&i|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ie=function(){E()},re=ye(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{O.apply(t=j.call(y.childNodes),y.childNodes),t[y.childNodes.length].nodeType}catch(n){O={apply:t.length?function(e,t){k.apply(e,j.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}function oe(e,t,n,i){var r,o,s,a,l,u,c,f=t&&t.ownerDocument,h=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==h&&9!==h&&11!==h)return n;if(!i&&((t?t.ownerDocument||t:y)!==T&&E(t),t=t||T,x)){if(11!==h&&(l=G.exec(e)))if(r=l[1]){if(9===h){if(!(s=t.getElementById(r)))return n;if(s.id===r)return n.push(s),n}else if(f&&(s=f.getElementById(r))&&v(t,s)&&s.id===r)return n.push(s),n}else{if(l[2])return O.apply(n,t.getElementsByTagName(e)),n;if((r=l[3])&&d.getElementsByClassName&&t.getElementsByClassName)return O.apply(n,t.getElementsByClassName(r)),n}if(d.qsa&&!D[e+" "]&&(!m||!m.test(e))){if(1!==h)f=t,c=e;else if("object"!==t.nodeName.toLowerCase()){for((a=t.getAttribute("id"))?a=a.replace(te,ne):t.setAttribute("id",a=C),o=(u=p(e)).length;o--;)u[o]="#"+a+" "+ve(u[o]);c=u.join(","),f=J.test(e)&&ge(t.parentNode)||t}if(c)try{return O.apply(n,f.querySelectorAll(c)),n}catch(e){}finally{a===C&&t.removeAttribute("id")}}}return g(e.replace(W,"$1"),t,n,i)}function se(){var i=[];return function e(t,n){return i.push(t+" ")>b.cacheLength&&delete e[i.shift()],e[t+" "]=n}}function ae(e){return e[C]=!0,e}function le(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ue(e,t){for(var n=e.split("|"),i=n.length;i--;)b.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function de(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&re(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function pe(s){return ae(function(o){return o=+o,ae(function(e,t){for(var n,i=s([],e.length,o),r=i.length;r--;)e[n=i[r]]&&(e[n]=!(t[n]=e[n]))})})}function ge(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in d=oe.support={},r=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},E=oe.setDocument=function(e){var t,n,i=e?e.ownerDocument||e:y;return i!==T&&9===i.nodeType&&i.documentElement&&(s=(T=i).documentElement,x=!r(T),y!==T&&(n=T.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",ie,!1):n.attachEvent&&n.attachEvent("onunload",ie)),d.attributes=le(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=le(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=X.test(T.getElementsByClassName),d.getById=le(function(e){return s.appendChild(e).id=C,!T.getElementsByName||!T.getElementsByName(C).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&x){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(Z,ee);return function(e){var t=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&x){var n,i,r,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(r=t.getElementsByName(e),i=0;o=r[i++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],r=0,o=t.getElementsByTagName(e);if("*"!==e)return o;for(;n=o[r++];)1===n.nodeType&&i.push(n);return i},b.find.CLASS=d.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&x)return t.getElementsByClassName(e)},a=[],m=[],(d.qsa=X.test(T.querySelectorAll))&&(le(function(e){s.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+P+"*(?:value|"+H+")"),e.querySelectorAll("[id~="+C+"-]").length||m.push("~="),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+C+"+*").length||m.push(".#.+[+~]")}),le(function(e){e.innerHTML="";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+P+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),s.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(d.matchesSelector=X.test(c=s.matches||s.webkitMatchesSelector||s.mozMatchesSelector||s.oMatchesSelector||s.msMatchesSelector))&&le(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),a.push("!=",F)}),m=m.length&&new RegExp(m.join("|")),a=a.length&&new RegExp(a.join("|")),t=X.test(s.compareDocumentPosition),v=t||X.test(s.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,i=t&&t.parentNode;return e===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):e.compareDocumentPosition&&16&e.compareDocumentPosition(i)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},A=t?function(e,t){if(e===t)return u=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument===y&&v(y,e)?-1:t===T||t.ownerDocument===y&&v(y,t)?1:l?L(l,e)-L(l,t):0:4&n?-1:1)}:function(e,t){if(e===t)return u=!0,0;var n,i=0,r=e.parentNode,o=t.parentNode,s=[e],a=[t];if(!r||!o)return e===T?-1:t===T?1:r?-1:o?1:l?L(l,e)-L(l,t):0;if(r===o)return ce(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?ce(s[i],a[i]):s[i]===y?-1:a[i]===y?1:0}),T},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==T&&E(e),t=t.replace(K,"='$1']"),d.matchesSelector&&x&&!D[t+" "]&&(!a||!a.test(t))&&(!m||!m.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&$.test(n)&&(t=p(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=h[e+" "];return t||(t=new RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&h(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,i,r){return function(e){var t=oe.attr(e,n);return null==t?"!="===i:!i||(t+="","="===i?t===r:"!="===i?t!==r:"^="===i?r&&0===t.indexOf(r):"*="===i?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function N(e,n,i){return y(n)?C.grep(e,function(e,t){return!!n.call(e,t,e)!==i}):n.nodeType?C.grep(e,function(e){return e===n!==i}):"string"!=typeof n?C.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(C.fn.init=function(e,t,n){var i,r;if(!e)return this;if(n=n||I,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):y(e)?void 0!==n.ready?n.ready(e):e(C):C.makeArray(e,this);if(!(i="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:k.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof C?t[0]:t,C.merge(this,C.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:x,!0)),A.test(i[1])&&C.isPlainObject(t))for(i in t)y(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(r=x.getElementById(i[2]))&&(this[0]=r,this.length=1),this}).prototype=C.fn,I=C(x);var O=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function L(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t=C(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]+)/i,ce=/^$|^module$|\/(?:java|ecma)script/i,fe={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function he(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?C.merge([e],n):n}function de(e,t){for(var n=0,i=e.length;nx",v.noCloneChecked=!!pe.cloneNode(!0).lastChild.defaultValue;var ye=x.documentElement,_e=/^key/,be=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,we=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function Te(){return!1}function xe(){try{return x.activeElement}catch(e){}}function Ce(e,t,n,i,r,o){var s,a;if("object"==typeof t){for(a in"string"!=typeof n&&(i=i||n,n=void 0),t)Ce(e,a,n,i,t[a],o);return e}if(null==i&&null==r?(r=n,i=n=void 0):null==r&&("string"==typeof n?(r=i,i=void 0):(r=i,i=n,n=void 0)),!1===r)r=Te;else if(!r)return e;return 1===o&&(s=r,(r=function(e){return C().off(e),s.apply(this,arguments)}).guid=s.guid||(s.guid=C.guid++)),e.each(function(){C.event.add(this,t,r,i,n)})}C.event={global:{},add:function(t,e,n,i,r){var o,s,a,l,u,c,f,h,d,p,g,m=Y.get(t);if(m)for(n.handler&&(n=(o=n).handler,r=o.selector),r&&C.find.matchesSelector(ye,r),n.guid||(n.guid=C.guid++),(l=m.events)||(l=m.events={}),(s=m.handle)||(s=m.handle=function(e){return void 0!==C&&C.event.triggered!==e.type?C.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)d=g=(a=we.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),d&&(f=C.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,f=C.event.special[d]||{},c=C.extend({type:d,origType:g,data:i,handler:n,guid:n.guid,selector:r,needsContext:r&&C.expr.match.needsContext.test(r),namespace:p.join(".")},o),(h=l[d])||((h=l[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(d,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),r?h.splice(h.delegateCount++,0,c):h.push(c),C.event.global[d]=!0)},remove:function(e,t,n,i,r){var o,s,a,l,u,c,f,h,d,p,g,m=Y.hasData(e)&&Y.get(e);if(m&&(l=m.events)){for(u=(t=(t||"").match(H)||[""]).length;u--;)if(d=g=(a=we.exec(t[u])||[])[1],p=(a[2]||"").split(".").sort(),d){for(f=C.event.special[d]||{},h=l[d=(i?f.delegateType:f.bindType)||d]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=h.length;o--;)c=h[o],!r&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(h.splice(o,1),c.selector&&h.delegateCount--,f.remove&&f.remove.call(e,c));s&&!h.length&&(f.teardown&&!1!==f.teardown.call(e,p,m.handle)||C.removeEvent(e,d,m.handle),delete l[d])}else for(d in l)C.event.remove(e,d+t[u],n,i,!0);C.isEmptyObject(l)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,i,r,o,s,a=C.event.fix(e),l=new Array(arguments.length),u=(Y.get(this,"events")||{})[a.type]||[],c=C.event.special[a.type]||{};for(l[0]=a,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,De=/\s*$/g;function Ie(e,t){return D(e,"table")&&D(11!==t.nodeType?t:t.firstChild,"tr")&&C(e).children("tbody")[0]||e}function ke(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function je(e,t){var n,i,r,o,s,a,l,u;if(1===t.nodeType){if(Y.hasData(e)&&(o=Y.access(e),s=Y.set(t,o),u=o.events))for(r in delete s.handle,s.events={},u)for(n=0,i=u[r].length;n")},clone:function(e,t,n){var i,r,o,s,a,l,u,c=e.cloneNode(!0),f=C.contains(e.ownerDocument,e);if(!(v.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||C.isXMLDoc(e)))for(s=he(c),i=0,r=(o=he(e)).length;i").prop({charset:n.scriptCharset,src:n.url}).on("load error",r=function(e){i.remove(),r=null,e&&t("error"===e.type?404:200,e.type)}),x.head.appendChild(i[0])},abort:function(){r&&r()}}});var Bt,Ut=[],Kt=/(=)\?(?=&|$)|\?\?/;C.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Ut.pop()||C.expando+"_"+bt++;return this[e]=!0,e}}),C.ajaxPrefilter("json jsonp",function(e,t,n){var i,r,o,s=!1!==e.jsonp&&(Kt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Kt.test(e.data)&&"data");if(s||"jsonp"===e.dataTypes[0])return i=e.jsonpCallback=y(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,s?e[s]=e[s].replace(Kt,"$1"+i):!1!==e.jsonp&&(e.url+=(wt.test(e.url)?"&":"?")+e.jsonp+"="+i),e.converters["script json"]=function(){return o||C.error(i+" was not called"),o[0]},e.dataTypes[0]="json",r=T[i],T[i]=function(){o=arguments},n.always(function(){void 0===r?C(T).removeProp(i):T[i]=r,e[i]&&(e.jsonpCallback=t.jsonpCallback,Ut.push(i)),o&&y(r)&&r(o[0]),o=r=void 0}),"script"}),v.createHTMLDocument=((Bt=x.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Bt.childNodes.length),C.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((i=(t=x.implementation.createHTMLDocument("")).createElement("base")).href=x.location.href,t.head.appendChild(i)):t=x),o=!n&&[],(r=A.exec(e))?[t.createElement(r[1])]:(r=ve([e],t,o),o&&o.length&&C(o).remove(),C.merge([],r.childNodes)));var i,r,o},C.fn.load=function(e,t,n){var i,r,o,s=this,a=e.indexOf(" ");return-1").append(C.parseHTML(e)).find(i):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},C.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){C.fn[t]=function(e){return this.on(t,e)}}),C.expr.pseudos.animated=function(t){return C.grep(C.timers,function(e){return t===e.elem}).length},C.offset={setOffset:function(e,t,n){var i,r,o,s,a,l,u=C.css(e,"position"),c=C(e),f={};"static"===u&&(e.style.position="relative"),a=c.offset(),o=C.css(e,"top"),l=C.css(e,"left"),r=("absolute"===u||"fixed"===u)&&-1<(o+l).indexOf("auto")?(s=(i=c.position()).top,i.left):(s=parseFloat(o)||0,parseFloat(l)||0),y(t)&&(t=t.call(e,n,C.extend({},a))),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+r),"using"in t?t.using.call(e,f):c.css(f)}},C.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){C.offset.setOffset(this,t,e)});var e,n,i=this[0];return i?i.getClientRects().length?(e=i.getBoundingClientRect(),n=i.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,i=this[0],r={top:0,left:0};if("fixed"===C.css(i,"position"))t=i.getBoundingClientRect();else{for(t=this.offset(),n=i.ownerDocument,e=i.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===C.css(e,"position");)e=e.parentNode;e&&e!==i&&1===e.nodeType&&((r=C(e).offset()).top+=C.css(e,"borderTopWidth",!0),r.left+=C.css(e,"borderLeftWidth",!0))}return{top:t.top-r.top-C.css(i,"marginTop",!0),left:t.left-r.left-C.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===C.css(e,"position");)e=e.offsetParent;return e||ye})}}),C.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,r){var o="pageYOffset"===r;C.fn[t]=function(e){return B(this,function(e,t,n){var i;if(_(e)?i=e:9===e.nodeType&&(i=e.defaultView),void 0===n)return i?i[r]:e[t];i?i.scrollTo(o?i.pageXOffset:n,o?n:i.pageYOffset):e[t]=n},t,e,arguments.length)}}),C.each(["top","left"],function(e,n){C.cssHooks[n]=Me(v.pixelPosition,function(e,t){if(t)return t=Fe(e,n),Pe.test(t)?C(e).position()[n]+"px":t})}),C.each({Height:"height",Width:"width"},function(s,a){C.each({padding:"inner"+s,content:a,"":"outer"+s},function(i,o){C.fn[o]=function(e,t){var n=arguments.length&&(i||"boolean"!=typeof e),r=i||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var i;return _(e)?0===o.indexOf("outer")?e["inner"+s]:e.document.documentElement["client"+s]:9===e.nodeType?(i=e.documentElement,Math.max(e.body["scroll"+s],i["scroll"+s],e.body["offset"+s],i["offset"+s],i["client"+s])):void 0===n?C.css(e,t,r):C.style(e,t,n,r)},a,n?e:void 0,n)}})}),C.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){C.fn[n]=function(e,t){return 0=i.clientWidth&&n>=i.clientHeight}),c=0l[e]&&!i.escapeWithReference&&(n=I(c[t],l[e]-("right"===e?c.width:c.height))),Q({},t,n)}};return u.forEach(function(e){var t=-1===["left","top"].indexOf(e)?"secondary":"primary";c=V({},c,f[t](e))}),e.offsets.popper=c,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,r=e.placement.split("-")[0],o=P,s=-1!==["top","bottom"].indexOf(r),a=s?"right":"bottom",l=s?"left":"top",u=s?"width":"height";return n[a]o(i[a])&&(e.offsets.popper[l]=o(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!A(e.instance.modifiers,"arrow","keepTogether"))return e;var i=t.element;if("string"==typeof i){if(!(i=e.instance.popper.querySelector(i)))return e}else if(!e.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var r=e.placement.split("-")[0],o=e.offsets,s=o.popper,a=o.reference,l=-1!==["left","right"].indexOf(r),u=l?"height":"width",c=l?"Top":"Left",f=c.toLowerCase(),h=l?"left":"top",d=l?"bottom":"right",p=T(i)[u];a[d]-ps[d]&&(e.offsets.popper[f]+=a[f]+p-s[d]),e.offsets.popper=w(e.offsets.popper);var g=a[f]+a[u]/2-p/2,m=b(e.instance.popper),v=parseFloat(m["margin"+c],10),y=parseFloat(m["border"+c+"Width"],10),_=g-e.offsets.popper[f]-v-y;return _=k(I(s[u]-p,_),0),e.arrowElement=i,e.offsets.arrow=(Q(n={},f,q(_)),Q(n,h,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(p,g){if(e(p.instance.modifiers,"inner"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var m=h(p.instance.popper,p.instance.reference,g.padding,g.boundariesElement,p.positionFixed),v=p.placement.split("-")[0],y=x(v),_=p.placement.split("-")[1]||"",b=[];switch(g.behavior){case G:b=[v,y];break;case J:b=i(v);break;case Z:b=i(v,!0);break;default:b=g.behavior}return b.forEach(function(e,t){if(v!==e||b.length===t+1)return p;v=p.placement.split("-")[0],y=x(v);var n,i=p.offsets.popper,r=p.offsets.reference,o=P,s="left"===v&&o(i.right)>o(r.left)||"right"===v&&o(i.left)o(r.top)||"bottom"===v&&o(i.top)o(m.right),u=o(i.top)o(m.bottom),f="left"===v&&a||"right"===v&&l||"top"===v&&u||"bottom"===v&&c,h=-1!==["top","bottom"].indexOf(v),d=!!g.flipVariations&&(h&&"start"===_&&a||h&&"end"===_&&l||!h&&"start"===_&&u||!h&&"end"===_&&c);(s||f||d)&&(p.flipped=!0,(s||f)&&(v=b[t+1]),d&&(_="end"===(n=_)?"start":"start"===n?"end":n),p.placement=v+(_?"-"+_:""),p.offsets.popper=V({},p.offsets.popper,C(p.instance.popper,p.offsets.reference,p.placement)),p=S(p.instance.modifiers,p,"flip"))}),p},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,r=i.popper,o=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return r[s?"left":"top"]=o[n]-(a?r[s?"width":"height"]:0),e.placement=x(t),e.offsets.popper=w(r),e}},hide:{order:800,enabled:!0,fn:function(e){if(!A(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=L(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottomn.right||t.top>n.bottom||t.rightthis._items.length-1||e<0))if(this._isSliding)p(this._element).one(O.SLID,function(){return t.to(e)});else{if(n===e)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right
    ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]}},Re="show",Fe={HIDE:"hide"+Ie,HIDDEN:"hidden"+Ie,SHOW:"show"+Ie,SHOWN:"shown"+Ie,INSERTED:"inserted"+Ie,CLICK:"click"+Ie,FOCUSIN:"focusin"+Ie,FOCUSOUT:"focusout"+Ie,MOUSEENTER:"mouseenter"+Ie,MOUSELEAVE:"mouseleave"+Ie},Me="fade",We="show",Be="hover",Ue="focus",Ke=function(){function i(e,t){if(void 0===f)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=p(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(We))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var e=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(e);var n=g.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var r=this.getTipElement(),o=g.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&p(r).addClass(Me);var s="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(r).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(r).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new f(this.element,r,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}}),p(r).addClass(We),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var u=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,p(t.element).trigger(t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(p(this.tip).hasClass(Me)){var c=g.getTransitionDurationFromElement(this.tip);p(this.tip).one(g.TRANSITION_END,u).emulateTransitionEnd(c)}else u()}},e.hide=function(e){var t=this,n=this.getTipElement(),i=p.Event(this.constructor.Event.HIDE),r=function(){t._hoverState!==Re&&n.parentNode&&n.parentNode.removeChild(n),t._cleanTipClass(),t.element.removeAttribute("aria-describedby"),p(t.element).trigger(t.constructor.Event.HIDDEN),null!==t._popper&&t._popper.destroy(),e&&e()};if(p(this.element).trigger(i),!i.isDefaultPrevented()){if(p(n).removeClass(We),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger.click=!1,this._activeTrigger[Ue]=!1,this._activeTrigger[Be]=!1,p(this.tip).hasClass(Me)){var o=g.getTransitionDurationFromElement(n);p(n).one(g.TRANSITION_END,r).emulateTransitionEnd(o)}else r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){p(this.getTipElement()).addClass(Oe+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(p(e.querySelectorAll(".tooltip-inner")),this.getTitle()),p(e).removeClass(Me+" "+We)},e.setElementContent=function(e,t){"object"!=typeof t||!t.nodeType&&!t.jquery?this.config.html?(this.config.sanitize&&(t=De(t,this.config.whiteList,this.config.sanitizeFn)),e.html(t)):e.text(t):this.config.html?p(t).parent().is(e)||e.empty().append(t):e.text(p(t).text())},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e||(e="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),e},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:g.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},e._getAttachment=function(e){return Pe[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if("manual"!==e){var t=e===Be?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Be?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}}),p(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==e)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Ue:Be]=!0),p(t.getTipElement()).hasClass(We)||t._hoverState===Re?t._hoverState=Re:(clearTimeout(t._timeout),t._hoverState=Re,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===Re&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Ue:Be]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState="out",t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){"out"===t._hoverState&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){var t=p(this.element).data();return Object.keys(t).forEach(function(e){-1!==Le.indexOf(e)&&delete t[e]}),"number"==typeof(e=l({},this.constructor.Default,t,"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),g.typeCheckConfig(Ae,e,this.constructor.DefaultType),e.sanitize&&(e.template=De(e.template,e.whiteList,e.sanitizeFn)),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(je);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(p(e).removeClass(Me),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=p(this).data(Ne),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),p(this).data(Ne,e)),"string"==typeof n)){if(void 0===e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return qe}},{key:"NAME",get:function(){return Ae}},{key:"DATA_KEY",get:function(){return Ne}},{key:"Event",get:function(){return Fe}},{key:"EVENT_KEY",get:function(){return Ie}},{key:"DefaultType",get:function(){return He}}]),i}();p.fn[Ae]=Ke._jQueryInterface,p.fn[Ae].Constructor=Ke,p.fn[Ae].noConflict=function(){return p.fn[Ae]=ke,Ke._jQueryInterface};var $e="popover",Qe="bs.popover",Ve="."+Qe,ze=p.fn[$e],Ye="bs-popover",Xe=new RegExp("(^|\\s)"+Ye+"\\S+","g"),Ge=l({},Ke.Default,{placement:"right",trigger:"click",content:"",template:''}),Je=l({},Ke.DefaultType,{content:"(string|element|function)"}),Ze={HIDE:"hide"+Ve,HIDDEN:"hidden"+Ve,SHOW:"show"+Ve,SHOWN:"shown"+Ve,INSERTED:"inserted"+Ve,CLICK:"click"+Ve,FOCUSIN:"focusin"+Ve,FOCUSOUT:"focusout"+Ve,MOUSEENTER:"mouseenter"+Ve,MOUSELEAVE:"mouseleave"+Ve},et=function(e){var t,n;function i(){return e.apply(this,arguments)||this}n=e,(t=i).prototype=Object.create(n.prototype),(t.prototype.constructor=t).__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(e){p(this.getTipElement()).addClass(Ye+"-"+e)},r.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},r.setContent=function(){var e=p(this.getTipElement());this.setElementContent(e.find(".popover-header"),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find(".popover-body"),t),e.removeClass("fade show")},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(Xe);null!==t&&0=this._offsets[r]&&(void 0===this._offsets[r+1]||e li > .active",wt=function(){function i(e){this._element=e}var e=i.prototype;return e.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&p(this._element).hasClass(yt)||p(this._element).hasClass("disabled"))){var e,i,t=p(this._element).closest(".nav, .list-group")[0],r=g.getSelectorFromElement(this._element);if(t){var o="UL"===t.nodeName||"OL"===t.nodeName?bt:_t;i=(i=p.makeArray(p(t).find(o)))[i.length-1]}var s=p.Event(vt.HIDE,{relatedTarget:this._element}),a=p.Event(vt.SHOW,{relatedTarget:i});if(i&&p(i).trigger(s),p(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,t);var l=function(){var e=p.Event(vt.HIDDEN,{relatedTarget:n._element}),t=p.Event(vt.SHOWN,{relatedTarget:i});p(i).trigger(e),p(n._element).trigger(t)};e?this._activate(e,e.parentNode,l):l()}}},e.dispose=function(){p.removeData(this._element,pt),this._element=null},e._activate=function(e,t,n){var i=this,r=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?p(t).children(_t):p(t).find(bt))[0],o=n&&r&&p(r).hasClass("fade"),s=function(){return i._transitionComplete(e,r,n)};if(r&&o){var a=g.getTransitionDurationFromElement(r);p(r).removeClass("show").one(g.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},e._transitionComplete=function(e,t,n){if(t){p(t).removeClass(yt);var i=p(t.parentNode).find("> .dropdown-menu .active")[0];i&&p(i).removeClass(yt),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}if(p(e).addClass(yt),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),g.reflow(e),e.classList.contains("fade")&&e.classList.add("show"),e.parentNode&&p(e.parentNode).hasClass("dropdown-menu")){var r=p(e).closest(".dropdown")[0];if(r){var o=[].slice.call(r.querySelectorAll(".dropdown-toggle"));p(o).addClass(yt)}e.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var e=p(this),t=e.data(pt);if(t||(t=new i(this),e.data(pt,t)),"string"==typeof n){if(void 0===t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();p(document).on(vt.CLICK_DATA_API,'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',function(e){e.preventDefault(),wt._jQueryInterface.call(p(this),"show")}),p.fn.tab=wt._jQueryInterface,p.fn.tab.Constructor=wt,p.fn.tab.noConflict=function(){return p.fn.tab=mt,wt._jQueryInterface};var Et="toast",Tt="bs.toast",xt="."+Tt,Ct=p.fn[Et],St={CLICK_DISMISS:"click.dismiss"+xt,HIDE:"hide"+xt,HIDDEN:"hidden"+xt,SHOW:"show"+xt,SHOWN:"shown"+xt},Dt="show",At="showing",Nt={animation:"boolean",autohide:"boolean",delay:"number"},It={animation:!0,autohide:!0,delay:500},kt=function(){function i(e,t){this._element=e,this._config=this._getConfig(t),this._timeout=null,this._setListeners()}var e=i.prototype;return e.show=function(){var e=this;p(this._element).trigger(St.SHOW),this._config.animation&&this._element.classList.add("fade");var t=function(){e._element.classList.remove(At),e._element.classList.add(Dt),p(e._element).trigger(St.SHOWN),e._config.autohide&&e.hide()};if(this._element.classList.remove("hide"),this._element.classList.add(At),this._config.animation){var n=g.getTransitionDurationFromElement(this._element);p(this._element).one(g.TRANSITION_END,t).emulateTransitionEnd(n)}else t()},e.hide=function(e){var t=this;this._element.classList.contains(Dt)&&(p(this._element).trigger(St.HIDE),e?this._close():this._timeout=setTimeout(function(){t._close()},this._config.delay))},e.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(Dt)&&this._element.classList.remove(Dt),p(this._element).off(St.CLICK_DISMISS),p.removeData(this._element,Tt),this._element=null,this._config=null},e._getConfig=function(e){return e=l({},It,p(this._element).data(),"object"==typeof e&&e?e:{}),g.typeCheckConfig(Et,e,this.constructor.DefaultType),e},e._setListeners=function(){var e=this;p(this._element).on(St.CLICK_DISMISS,'[data-dismiss="toast"]',function(){return e.hide(!0)})},e._close=function(){var e=this,t=function(){e._element.classList.add("hide"),p(e._element).trigger(St.HIDDEN)};if(this._element.classList.remove(Dt),this._config.animation){var n=g.getTransitionDurationFromElement(this._element);p(this._element).one(g.TRANSITION_END,t).emulateTransitionEnd(n)}else t()},i._jQueryInterface=function(n){return this.each(function(){var e=p(this),t=e.data(Tt);if(t||(t=new i(this,"object"==typeof n&&n),e.data(Tt,t)),"string"==typeof n){if(void 0===t[n])throw new TypeError('No method named "'+n+'"');t[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"DefaultType",get:function(){return Nt}},{key:"Default",get:function(){return It}}]),i}();p.fn[Et]=kt._jQueryInterface,p.fn[Et].Constructor=kt,p.fn[Et].noConflict=function(){return p.fn[Et]=Ct,kt._jQueryInterface},function(){if(void 0===p)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=p.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||4<=e[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),e.Util=g,e.Alert=c,e.Button=E,e.Carousel=P,e.Collapse=Y,e.Dropdown=ce,e.Modal=Te,e.Popover=et,e.Scrollspy=dt,e.Tab=wt,e.Toast=kt,e.Tooltip=Ke,Object.defineProperty(e,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/community_server/webroot/js/ensurePassphrase.js b/community_server/webroot/js/ensurePassphrase.js new file mode 100644 index 000000000..485946050 --- /dev/null +++ b/community_server/webroot/js/ensurePassphrase.js @@ -0,0 +1,1927 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],2:[function(require,module,exports){ +(function (setImmediate,clearImmediate){ +var nextTick = require('process/browser.js').nextTick; +var apply = Function.prototype.apply; +var slice = Array.prototype.slice; +var immediateIds = {}; +var nextImmediateId = 0; + +// DOM APIs, for completeness + +exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); +}; +exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); +}; +exports.clearTimeout = +exports.clearInterval = function(timeout) { timeout.close(); }; + +function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; +} +Timeout.prototype.unref = Timeout.prototype.ref = function() {}; +Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); +}; + +// Does not start the time, just sets up the members needed. +exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; +}; + +exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; +}; + +exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } +}; + +// That's not how node.js implements it but the exposed api is the same. +exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; +}; + +exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; +}; +}).call(this,require("timers").setImmediate,require("timers").clearImmediate) +},{"process/browser.js":1,"timers":2}],3:[function(require,module,exports){ +(function (global,setImmediate){ +new function() { + +function Vnode(tag, key, attrs0, children, text, dom) { + return {tag: tag, key: key, attrs: attrs0, children: children, text: text, dom: dom, domSize: undefined, state: {}, events: undefined, instance: undefined, skip: false} +} +Vnode.normalize = function(node) { + if (Array.isArray(node)) return Vnode("[", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined) + if (node != null && typeof node !== "object") return Vnode("#", undefined, undefined, node === false ? "" : node, undefined, undefined) + return node +} +Vnode.normalizeChildren = function normalizeChildren(children) { + for (var i = 0; i < children.length; i++) { + children[i] = Vnode.normalize(children[i]) + } + return children +} +var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g +var selectorCache = {} +function hyperscript(selector) { + if (selector == null || typeof selector !== "string" && typeof selector.view !== "function") { + throw Error("The selector must be either a string or a component."); + } + if (typeof selector === "string" && selectorCache[selector] === undefined) { + var match, tag, classes = [], attributes = {} + while (match = selectorParser.exec(selector)) { + var type = match[1], value = match[2] + if (type === "" && value !== "") tag = value + else if (type === "#") attributes.id = value + else if (type === ".") classes.push(value) + else if (match[3][0] === "[") { + var attrValue = match[6] + if (attrValue) attrValue = attrValue.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\") + if (match[4] === "class") classes.push(attrValue) + else attributes[match[4]] = attrValue || true + } + } + if (classes.length > 0) attributes.className = classes.join(" ") + selectorCache[selector] = function(attrs, children) { + var hasAttrs = false, childList, text + var className = attrs.className || attrs.class + for (var key in attributes) attrs[key] = attributes[key] + if (className !== undefined) { + if (attrs.class !== undefined) { + attrs.class = undefined + attrs.className = className + } + if (attributes.className !== undefined) attrs.className = attributes.className + " " + className + } + for (var key in attrs) { + if (key !== "key") { + hasAttrs = true + break + } + } + if (Array.isArray(children) && children.length == 1 && children[0] != null && children[0].tag === "#") text = children[0].children + else childList = children + return Vnode(tag || "div", attrs.key, hasAttrs ? attrs : undefined, childList, text, undefined) + } + } + var attrs, children, childrenIndex + if (arguments[1] == null || typeof arguments[1] === "object" && arguments[1].tag === undefined && !Array.isArray(arguments[1])) { + attrs = arguments[1] + childrenIndex = 2 + } + else childrenIndex = 1 + if (arguments.length === childrenIndex + 1) { + children = Array.isArray(arguments[childrenIndex]) ? arguments[childrenIndex] : [arguments[childrenIndex]] + } + else { + children = [] + for (var i = childrenIndex; i < arguments.length; i++) children.push(arguments[i]) + } + if (typeof selector === "string") return selectorCache[selector](attrs || {}, Vnode.normalizeChildren(children)) + return Vnode(selector, attrs && attrs.key, attrs || {}, Vnode.normalizeChildren(children), undefined, undefined) +} +hyperscript.trust = function(html) { + if (html == null) html = "" + return Vnode("<", undefined, undefined, html, undefined, undefined) +} +hyperscript.fragment = function(attrs1, children) { + return Vnode("[", attrs1.key, attrs1, Vnode.normalizeChildren(children), undefined, undefined) +} +var m = hyperscript +/** @constructor */ +var PromisePolyfill = function(executor) { + if (!(this instanceof PromisePolyfill)) throw new Error("Promise must be called with `new`") + if (typeof executor !== "function") throw new TypeError("executor must be a function") + var self = this, resolvers = [], rejectors = [], resolveCurrent = handler(resolvers, true), rejectCurrent = handler(rejectors, false) + var instance = self._instance = {resolvers: resolvers, rejectors: rejectors} + var callAsync = typeof setImmediate === "function" ? setImmediate : setTimeout + function handler(list, shouldAbsorb) { + return function execute(value) { + var then + try { + if (shouldAbsorb && value != null && (typeof value === "object" || typeof value === "function") && typeof (then = value.then) === "function") { + if (value === self) throw new TypeError("Promise can't be resolved w/ itself") + executeOnce(then.bind(value)) + } + else { + callAsync(function() { + if (!shouldAbsorb && list.length === 0) console.error("Possible unhandled promise rejection:", value) + for (var i = 0; i < list.length; i++) list[i](value) + resolvers.length = 0, rejectors.length = 0 + instance.state = shouldAbsorb + instance.retry = function() {execute(value)} + }) + } + } + catch (e) { + rejectCurrent(e) + } + } + } + function executeOnce(then) { + var runs = 0 + function run(fn) { + return function(value) { + if (runs++ > 0) return + fn(value) + } + } + var onerror = run(rejectCurrent) + try {then(run(resolveCurrent), onerror)} catch (e) {onerror(e)} + } + executeOnce(executor) +} +PromisePolyfill.prototype.then = function(onFulfilled, onRejection) { + var self = this, instance = self._instance + function handle(callback, list, next, state) { + list.push(function(value) { + if (typeof callback !== "function") next(value) + else try {resolveNext(callback(value))} catch (e) {if (rejectNext) rejectNext(e)} + }) + if (typeof instance.retry === "function" && state === instance.state) instance.retry() + } + var resolveNext, rejectNext + var promise = new PromisePolyfill(function(resolve, reject) {resolveNext = resolve, rejectNext = reject}) + handle(onFulfilled, instance.resolvers, resolveNext, true), handle(onRejection, instance.rejectors, rejectNext, false) + return promise +} +PromisePolyfill.prototype.catch = function(onRejection) { + return this.then(null, onRejection) +} +PromisePolyfill.resolve = function(value) { + if (value instanceof PromisePolyfill) return value + return new PromisePolyfill(function(resolve) {resolve(value)}) +} +PromisePolyfill.reject = function(value) { + return new PromisePolyfill(function(resolve, reject) {reject(value)}) +} +PromisePolyfill.all = function(list) { + return new PromisePolyfill(function(resolve, reject) { + var total = list.length, count = 0, values = [] + if (list.length === 0) resolve([]) + else for (var i = 0; i < list.length; i++) { + (function(i) { + function consume(value) { + count++ + values[i] = value + if (count === total) resolve(values) + } + if (list[i] != null && (typeof list[i] === "object" || typeof list[i] === "function") && typeof list[i].then === "function") { + list[i].then(consume, reject) + } + else consume(list[i]) + })(i) + } + }) +} +PromisePolyfill.race = function(list) { + return new PromisePolyfill(function(resolve, reject) { + for (var i = 0; i < list.length; i++) { + list[i].then(resolve, reject) + } + }) +} +if (typeof window !== "undefined") { + if (typeof window.Promise === "undefined") window.Promise = PromisePolyfill + var PromisePolyfill = window.Promise +} else if (typeof global !== "undefined") { + if (typeof global.Promise === "undefined") global.Promise = PromisePolyfill + var PromisePolyfill = global.Promise +} else { +} +var buildQueryString = function(object) { + if (Object.prototype.toString.call(object) !== "[object Object]") return "" + var args = [] + for (var key0 in object) { + destructure(key0, object[key0]) + } + return args.join("&") + function destructure(key0, value) { + if (Array.isArray(value)) { + for (var i = 0; i < value.length; i++) { + destructure(key0 + "[" + i + "]", value[i]) + } + } + else if (Object.prototype.toString.call(value) === "[object Object]") { + for (var i in value) { + destructure(key0 + "[" + i + "]", value[i]) + } + } + else args.push(encodeURIComponent(key0) + (value != null && value !== "" ? "=" + encodeURIComponent(value) : "")) + } +} +var _8 = function($window, Promise) { + var callbackCount = 0 + var oncompletion + function setCompletionCallback(callback) {oncompletion = callback} + function finalizer() { + var count = 0 + function complete() {if (--count === 0 && typeof oncompletion === "function") oncompletion()} + return function finalize(promise0) { + var then0 = promise0.then + promise0.then = function() { + count++ + var next = then0.apply(promise0, arguments) + next.then(complete, function(e) { + complete() + if (count === 0) throw e + }) + return finalize(next) + } + return promise0 + } + } + function normalize(args, extra) { + if (typeof args === "string") { + var url = args + args = extra || {} + if (args.url == null) args.url = url + } + return args + } + function request(args, extra) { + var finalize = finalizer() + args = normalize(args, extra) + var promise0 = new Promise(function(resolve, reject) { + if (args.method == null) args.method = "GET" + args.method = args.method.toUpperCase() + var useBody = typeof args.useBody === "boolean" ? args.useBody : args.method !== "GET" && args.method !== "TRACE" + if (typeof args.serialize !== "function") args.serialize = typeof FormData !== "undefined" && args.data instanceof FormData ? function(value) {return value} : JSON.stringify + if (typeof args.deserialize !== "function") args.deserialize = deserialize + if (typeof args.extract !== "function") args.extract = extract + args.url = interpolate(args.url, args.data) + if (useBody) args.data = args.serialize(args.data) + else args.url = assemble(args.url, args.data) + var xhr = new $window.XMLHttpRequest() + xhr.open(args.method, args.url, typeof args.async === "boolean" ? args.async : true, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined) + if (args.serialize === JSON.stringify && useBody) { + xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8") + } + if (args.deserialize === deserialize) { + xhr.setRequestHeader("Accept", "application/json, text/*") + } + if (args.withCredentials) xhr.withCredentials = args.withCredentials + for (var key in args.headers) if ({}.hasOwnProperty.call(args.headers, key)) { + xhr.setRequestHeader(key, args.headers[key]) + } + if (typeof args.config === "function") xhr = args.config(xhr, args) || xhr + xhr.onreadystatechange = function() { + // Don't throw errors on xhr.abort(). XMLHttpRequests ends up in a state of + // xhr.status == 0 and xhr.readyState == 4 if aborted after open, but before completion. + if (xhr.status && xhr.readyState === 4) { + try { + var response = (args.extract !== extract) ? args.extract(xhr, args) : args.deserialize(args.extract(xhr, args)) + if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) { + resolve(cast(args.type, response)) + } + else { + var error = new Error(xhr.responseText) + for (var key in response) error[key] = response[key] + reject(error) + } + } + catch (e) { + reject(e) + } + } + } + if (useBody && (args.data != null)) xhr.send(args.data) + else xhr.send() + }) + return args.background === true ? promise0 : finalize(promise0) + } + function jsonp(args, extra) { + var finalize = finalizer() + args = normalize(args, extra) + var promise0 = new Promise(function(resolve, reject) { + var callbackName = args.callbackName || "_mithril_" + Math.round(Math.random() * 1e16) + "_" + callbackCount++ + var script = $window.document.createElement("script") + $window[callbackName] = function(data) { + script.parentNode.removeChild(script) + resolve(cast(args.type, data)) + delete $window[callbackName] + } + script.onerror = function() { + script.parentNode.removeChild(script) + reject(new Error("JSONP request failed")) + delete $window[callbackName] + } + if (args.data == null) args.data = {} + args.url = interpolate(args.url, args.data) + args.data[args.callbackKey || "callback"] = callbackName + script.src = assemble(args.url, args.data) + $window.document.documentElement.appendChild(script) + }) + return args.background === true? promise0 : finalize(promise0) + } + function interpolate(url, data) { + if (data == null) return url + var tokens = url.match(/:[^\/]+/gi) || [] + for (var i = 0; i < tokens.length; i++) { + var key = tokens[i].slice(1) + if (data[key] != null) { + url = url.replace(tokens[i], data[key]) + } + } + return url + } + function assemble(url, data) { + var querystring = buildQueryString(data) + if (querystring !== "") { + var prefix = url.indexOf("?") < 0 ? "?" : "&" + url += prefix + querystring + } + return url + } + function deserialize(data) { + try {return data !== "" ? JSON.parse(data) : null} + catch (e) {throw new Error(data)} + } + function extract(xhr) {return xhr.responseText} + function cast(type0, data) { + if (typeof type0 === "function") { + if (Array.isArray(data)) { + for (var i = 0; i < data.length; i++) { + data[i] = new type0(data[i]) + } + } + else return new type0(data) + } + return data + } + return {request: request, jsonp: jsonp, setCompletionCallback: setCompletionCallback} +} +var requestService = _8(window, PromisePolyfill) +var coreRenderer = function($window) { + var $doc = $window.document + var $emptyFragment = $doc.createDocumentFragment() + var onevent + function setEventCallback(callback) {return onevent = callback} + //create + function createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) { + for (var i = start; i < end; i++) { + var vnode = vnodes[i] + if (vnode != null) { + insertNode(parent, createNode(vnode, hooks, ns), nextSibling) + } + } + } + function createNode(vnode, hooks, ns) { + var tag = vnode.tag + if (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks) + if (typeof tag === "string") { + switch (tag) { + case "#": return createText(vnode) + case "<": return createHTML(vnode) + case "[": return createFragment(vnode, hooks, ns) + default: return createElement(vnode, hooks, ns) + } + } + else return createComponent(vnode, hooks, ns) + } + function createText(vnode) { + return vnode.dom = $doc.createTextNode(vnode.children) + } + function createHTML(vnode) { + var match1 = vnode.children.match(/^\s*?<(\w+)/im) || [] + var parent = {caption: "table", thead: "table", tbody: "table", tfoot: "table", tr: "tbody", th: "tr", td: "tr", colgroup: "table", col: "colgroup"}[match1[1]] || "div" + var temp = $doc.createElement(parent) + temp.innerHTML = vnode.children + vnode.dom = temp.firstChild + vnode.domSize = temp.childNodes.length + var fragment = $doc.createDocumentFragment() + var child + while (child = temp.firstChild) { + fragment.appendChild(child) + } + return fragment + } + function createFragment(vnode, hooks, ns) { + var fragment = $doc.createDocumentFragment() + if (vnode.children != null) { + var children = vnode.children + createNodes(fragment, children, 0, children.length, hooks, null, ns) + } + vnode.dom = fragment.firstChild + vnode.domSize = fragment.childNodes.length + return fragment + } + function createElement(vnode, hooks, ns) { + var tag = vnode.tag + switch (vnode.tag) { + case "svg": ns = "http://www.w3.org/2000/svg"; break + case "math": ns = "http://www.w3.org/1998/Math/MathML"; break + } + var attrs2 = vnode.attrs + var is = attrs2 && attrs2.is + var element = ns ? + is ? $doc.createElementNS(ns, tag, {is: is}) : $doc.createElementNS(ns, tag) : + is ? $doc.createElement(tag, {is: is}) : $doc.createElement(tag) + vnode.dom = element + if (attrs2 != null) { + setAttrs(vnode, attrs2, ns) + } + if (vnode.attrs != null && vnode.attrs.contenteditable != null) { + setContentEditable(vnode) + } + else { + if (vnode.text != null) { + if (vnode.text !== "") element.textContent = vnode.text + else vnode.children = [Vnode("#", undefined, undefined, vnode.text, undefined, undefined)] + } + if (vnode.children != null) { + var children = vnode.children + createNodes(element, children, 0, children.length, hooks, null, ns) + setLateAttrs(vnode) + } + } + return element + } + function createComponent(vnode, hooks, ns) { + vnode.state = Object.create(vnode.tag) + var view = vnode.tag.view + if (view.reentrantLock != null) return $emptyFragment + view.reentrantLock = true + initLifecycle(vnode.tag, vnode, hooks) + vnode.instance = Vnode.normalize(view.call(vnode.state, vnode)) + view.reentrantLock = null + if (vnode.instance != null) { + if (vnode.instance === vnode) throw Error("A view cannot return the vnode it received as arguments") + var element = createNode(vnode.instance, hooks, ns) + vnode.dom = vnode.instance.dom + vnode.domSize = vnode.dom != null ? vnode.instance.domSize : 0 + return element + } + else { + vnode.domSize = 0 + return $emptyFragment + } + } + //update + function updateNodes(parent, old, vnodes, hooks, nextSibling, ns) { + if (old === vnodes || old == null && vnodes == null) return + else if (old == null) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, undefined) + else if (vnodes == null) removeNodes(old, 0, old.length, vnodes) + else { + if (old.length === vnodes.length) { + var isUnkeyed = false + for (var i = 0; i < vnodes.length; i++) { + if (vnodes[i] != null && old[i] != null) { + isUnkeyed = vnodes[i].key == null && old[i].key == null + break + } + } + if (isUnkeyed) { + for (var i = 0; i < old.length; i++) { + if (old[i] === vnodes[i]) continue + else if (old[i] == null && vnodes[i] != null) insertNode(parent, createNode(vnodes[i], hooks, ns), getNextSibling(old, i + 1, nextSibling)) + else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes) + else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), false, ns) + } + return + } + } + var recycling = isRecyclable(old, vnodes) + if (recycling) old = old.concat(old.pool) + var oldStart = 0, start = 0, oldEnd = old.length - 1, end = vnodes.length - 1, map + while (oldEnd >= oldStart && end >= start) { + var o = old[oldStart], v = vnodes[start] + if (o === v && !recycling) oldStart++, start++ + else if (o == null) oldStart++ + else if (v == null) start++ + else if (o.key === v.key) { + oldStart++, start++ + updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), recycling, ns) + if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling) + } + else { + var o = old[oldEnd] + if (o === v && !recycling) oldEnd--, start++ + else if (o == null) oldEnd-- + else if (v == null) start++ + else if (o.key === v.key) { + updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) + if (recycling || start < end) insertNode(parent, toFragment(o), getNextSibling(old, oldStart, nextSibling)) + oldEnd--, start++ + } + else break + } + } + while (oldEnd >= oldStart && end >= start) { + var o = old[oldEnd], v = vnodes[end] + if (o === v && !recycling) oldEnd--, end-- + else if (o == null) oldEnd-- + else if (v == null) end-- + else if (o.key === v.key) { + updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) + if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling) + if (o.dom != null) nextSibling = o.dom + oldEnd--, end-- + } + else { + if (!map) map = getKeyMap(old, oldEnd) + if (v != null) { + var oldIndex = map[v.key] + if (oldIndex != null) { + var movable = old[oldIndex] + updateNode(parent, movable, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) + insertNode(parent, toFragment(movable), nextSibling) + old[oldIndex].skip = true + if (movable.dom != null) nextSibling = movable.dom + } + else { + var dom = createNode(v, hooks, undefined) + insertNode(parent, dom, nextSibling) + nextSibling = dom + } + } + end-- + } + if (end < start) break + } + createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns) + removeNodes(old, oldStart, oldEnd + 1, vnodes) + } + } + function updateNode(parent, old, vnode, hooks, nextSibling, recycling, ns) { + var oldTag = old.tag, tag = vnode.tag + if (oldTag === tag) { + vnode.state = old.state + vnode.events = old.events + if (shouldUpdate(vnode, old)) return + if (vnode.attrs != null) { + updateLifecycle(vnode.attrs, vnode, hooks, recycling) + } + if (typeof oldTag === "string") { + switch (oldTag) { + case "#": updateText(old, vnode); break + case "<": updateHTML(parent, old, vnode, nextSibling); break + case "[": updateFragment(parent, old, vnode, hooks, nextSibling, ns); break + default: updateElement(old, vnode, hooks, ns) + } + } + else updateComponent(parent, old, vnode, hooks, nextSibling, recycling, ns) + } + else { + removeNode(old, null) + insertNode(parent, createNode(vnode, hooks, ns), nextSibling) + } + } + function updateText(old, vnode) { + if (old.children.toString() !== vnode.children.toString()) { + old.dom.nodeValue = vnode.children + } + vnode.dom = old.dom + } + function updateHTML(parent, old, vnode, nextSibling) { + if (old.children !== vnode.children) { + toFragment(old) + insertNode(parent, createHTML(vnode), nextSibling) + } + else vnode.dom = old.dom, vnode.domSize = old.domSize + } + function updateFragment(parent, old, vnode, hooks, nextSibling, ns) { + updateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns) + var domSize = 0, children = vnode.children + vnode.dom = null + if (children != null) { + for (var i = 0; i < children.length; i++) { + var child = children[i] + if (child != null && child.dom != null) { + if (vnode.dom == null) vnode.dom = child.dom + domSize += child.domSize || 1 + } + } + if (domSize !== 1) vnode.domSize = domSize + } + } + function updateElement(old, vnode, hooks, ns) { + var element = vnode.dom = old.dom + switch (vnode.tag) { + case "svg": ns = "http://www.w3.org/2000/svg"; break + case "math": ns = "http://www.w3.org/1998/Math/MathML"; break + } + if (vnode.tag === "textarea") { + if (vnode.attrs == null) vnode.attrs = {} + if (vnode.text != null) { + vnode.attrs.value = vnode.text //FIXME handle0 multiple children + vnode.text = undefined + } + } + updateAttrs(vnode, old.attrs, vnode.attrs, ns) + if (vnode.attrs != null && vnode.attrs.contenteditable != null) { + setContentEditable(vnode) + } + else if (old.text != null && vnode.text != null && vnode.text !== "") { + if (old.text.toString() !== vnode.text.toString()) old.dom.firstChild.nodeValue = vnode.text + } + else { + if (old.text != null) old.children = [Vnode("#", undefined, undefined, old.text, undefined, old.dom.firstChild)] + if (vnode.text != null) vnode.children = [Vnode("#", undefined, undefined, vnode.text, undefined, undefined)] + updateNodes(element, old.children, vnode.children, hooks, null, ns) + } + } + function updateComponent(parent, old, vnode, hooks, nextSibling, recycling, ns) { + vnode.instance = Vnode.normalize(vnode.tag.view.call(vnode.state, vnode)) + updateLifecycle(vnode.tag, vnode, hooks, recycling) + if (vnode.instance != null) { + if (old.instance == null) insertNode(parent, createNode(vnode.instance, hooks, ns), nextSibling) + else updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, recycling, ns) + vnode.dom = vnode.instance.dom + vnode.domSize = vnode.instance.domSize + } + else if (old.instance != null) { + removeNode(old.instance, null) + vnode.dom = undefined + vnode.domSize = 0 + } + else { + vnode.dom = old.dom + vnode.domSize = old.domSize + } + } + function isRecyclable(old, vnodes) { + if (old.pool != null && Math.abs(old.pool.length - vnodes.length) <= Math.abs(old.length - vnodes.length)) { + var oldChildrenLength = old[0] && old[0].children && old[0].children.length || 0 + var poolChildrenLength = old.pool[0] && old.pool[0].children && old.pool[0].children.length || 0 + var vnodesChildrenLength = vnodes[0] && vnodes[0].children && vnodes[0].children.length || 0 + if (Math.abs(poolChildrenLength - vnodesChildrenLength) <= Math.abs(oldChildrenLength - vnodesChildrenLength)) { + return true + } + } + return false + } + function getKeyMap(vnodes, end) { + var map = {}, i = 0 + for (var i = 0; i < end; i++) { + var vnode = vnodes[i] + if (vnode != null) { + var key2 = vnode.key + if (key2 != null) map[key2] = i + } + } + return map + } + function toFragment(vnode) { + var count0 = vnode.domSize + if (count0 != null || vnode.dom == null) { + var fragment = $doc.createDocumentFragment() + if (count0 > 0) { + var dom = vnode.dom + while (--count0) fragment.appendChild(dom.nextSibling) + fragment.insertBefore(dom, fragment.firstChild) + } + return fragment + } + else return vnode.dom + } + function getNextSibling(vnodes, i, nextSibling) { + for (; i < vnodes.length; i++) { + if (vnodes[i] != null && vnodes[i].dom != null) return vnodes[i].dom + } + return nextSibling + } + function insertNode(parent, dom, nextSibling) { + if (nextSibling && nextSibling.parentNode) parent.insertBefore(dom, nextSibling) + else parent.appendChild(dom) + } + function setContentEditable(vnode) { + var children = vnode.children + if (children != null && children.length === 1 && children[0].tag === "<") { + var content = children[0].children + if (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content + } + else if (vnode.text != null || children != null && children.length !== 0) throw new Error("Child node of a contenteditable must be trusted") + } + //remove + function removeNodes(vnodes, start, end, context) { + for (var i = start; i < end; i++) { + var vnode = vnodes[i] + if (vnode != null) { + if (vnode.skip) vnode.skip = false + else removeNode(vnode, context) + } + } + } + function removeNode(vnode, context) { + var expected = 1, called = 0 + if (vnode.attrs && vnode.attrs.onbeforeremove) { + var result = vnode.attrs.onbeforeremove.call(vnode.state, vnode) + if (result != null && typeof result.then === "function") { + expected++ + result.then(continuation, continuation) + } + } + if (typeof vnode.tag !== "string" && vnode.tag.onbeforeremove) { + var result = vnode.tag.onbeforeremove.call(vnode.state, vnode) + if (result != null && typeof result.then === "function") { + expected++ + result.then(continuation, continuation) + } + } + continuation() + function continuation() { + if (++called === expected) { + onremove(vnode) + if (vnode.dom) { + var count0 = vnode.domSize || 1 + if (count0 > 1) { + var dom = vnode.dom + while (--count0) { + removeNodeFromDOM(dom.nextSibling) + } + } + removeNodeFromDOM(vnode.dom) + if (context != null && vnode.domSize == null && !hasIntegrationMethods(vnode.attrs) && typeof vnode.tag === "string") { //TODO test custom elements + if (!context.pool) context.pool = [vnode] + else context.pool.push(vnode) + } + } + } + } + } + function removeNodeFromDOM(node) { + var parent = node.parentNode + if (parent != null) parent.removeChild(node) + } + function onremove(vnode) { + if (vnode.attrs && vnode.attrs.onremove) vnode.attrs.onremove.call(vnode.state, vnode) + if (typeof vnode.tag !== "string" && vnode.tag.onremove) vnode.tag.onremove.call(vnode.state, vnode) + if (vnode.instance != null) onremove(vnode.instance) + else { + var children = vnode.children + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + var child = children[i] + if (child != null) onremove(child) + } + } + } + } + //attrs2 + function setAttrs(vnode, attrs2, ns) { + for (var key2 in attrs2) { + setAttr(vnode, key2, null, attrs2[key2], ns) + } + } + function setAttr(vnode, key2, old, value, ns) { + var element = vnode.dom + if (key2 === "key" || key2 === "is" || (old === value && !isFormAttribute(vnode, key2)) && typeof value !== "object" || typeof value === "undefined" || isLifecycleMethod(key2)) return + var nsLastIndex = key2.indexOf(":") + if (nsLastIndex > -1 && key2.substr(0, nsLastIndex) === "xlink") { + element.setAttributeNS("http://www.w3.org/1999/xlink", key2.slice(nsLastIndex + 1), value) + } + else if (key2[0] === "o" && key2[1] === "n" && typeof value === "function") updateEvent(vnode, key2, value) + else if (key2 === "style") updateStyle(element, old, value) + else if (key2 in element && !isAttribute(key2) && ns === undefined && !isCustomElement(vnode)) { + //setting input[value] to same value by typing on focused element moves cursor to end in Chrome + if (vnode.tag === "input" && key2 === "value" && vnode.dom.value === value && vnode.dom === $doc.activeElement) return + //setting select[value] to same value while having select open blinks select dropdown in Chrome + if (vnode.tag === "select" && key2 === "value" && vnode.dom.value === value && vnode.dom === $doc.activeElement) return + //setting option[value] to same value while having select open blinks select dropdown in Chrome + if (vnode.tag === "option" && key2 === "value" && vnode.dom.value === value) return + element[key2] = value + } + else { + if (typeof value === "boolean") { + if (value) element.setAttribute(key2, "") + else element.removeAttribute(key2) + } + else element.setAttribute(key2 === "className" ? "class" : key2, value) + } + } + function setLateAttrs(vnode) { + var attrs2 = vnode.attrs + if (vnode.tag === "select" && attrs2 != null) { + if ("value" in attrs2) setAttr(vnode, "value", null, attrs2.value, undefined) + if ("selectedIndex" in attrs2) setAttr(vnode, "selectedIndex", null, attrs2.selectedIndex, undefined) + } + } + function updateAttrs(vnode, old, attrs2, ns) { + if (attrs2 != null) { + for (var key2 in attrs2) { + setAttr(vnode, key2, old && old[key2], attrs2[key2], ns) + } + } + if (old != null) { + for (var key2 in old) { + if (attrs2 == null || !(key2 in attrs2)) { + if (key2 === "className") key2 = "class" + if (key2[0] === "o" && key2[1] === "n" && !isLifecycleMethod(key2)) updateEvent(vnode, key2, undefined) + else if (key2 !== "key") vnode.dom.removeAttribute(key2) + } + } + } + } + function isFormAttribute(vnode, attr) { + return attr === "value" || attr === "checked" || attr === "selectedIndex" || attr === "selected" && vnode.dom === $doc.activeElement + } + function isLifecycleMethod(attr) { + return attr === "oninit" || attr === "oncreate" || attr === "onupdate" || attr === "onremove" || attr === "onbeforeremove" || attr === "onbeforeupdate" + } + function isAttribute(attr) { + return attr === "href" || attr === "list" || attr === "form" || attr === "width" || attr === "height"// || attr === "type" + } + function isCustomElement(vnode){ + return vnode.attrs.is || vnode.tag.indexOf("-") > -1 + } + function hasIntegrationMethods(source) { + return source != null && (source.oncreate || source.onupdate || source.onbeforeremove || source.onremove) + } + //style + function updateStyle(element, old, style) { + if (old === style) element.style.cssText = "", old = null + if (style == null) element.style.cssText = "" + else if (typeof style === "string") element.style.cssText = style + else { + if (typeof old === "string") element.style.cssText = "" + for (var key2 in style) { + element.style[key2] = style[key2] + } + if (old != null && typeof old !== "string") { + for (var key2 in old) { + if (!(key2 in style)) element.style[key2] = "" + } + } + } + } + //event + function updateEvent(vnode, key2, value) { + var element = vnode.dom + var callback = typeof onevent !== "function" ? value : function(e) { + var result = value.call(element, e) + onevent.call(element, e) + return result + } + if (key2 in element) element[key2] = typeof value === "function" ? callback : null + else { + var eventName = key2.slice(2) + if (vnode.events === undefined) vnode.events = {} + if (vnode.events[key2] === callback) return + if (vnode.events[key2] != null) element.removeEventListener(eventName, vnode.events[key2], false) + if (typeof value === "function") { + vnode.events[key2] = callback + element.addEventListener(eventName, vnode.events[key2], false) + } + } + } + //lifecycle + function initLifecycle(source, vnode, hooks) { + if (typeof source.oninit === "function") source.oninit.call(vnode.state, vnode) + if (typeof source.oncreate === "function") hooks.push(source.oncreate.bind(vnode.state, vnode)) + } + function updateLifecycle(source, vnode, hooks, recycling) { + if (recycling) initLifecycle(source, vnode, hooks) + else if (typeof source.onupdate === "function") hooks.push(source.onupdate.bind(vnode.state, vnode)) + } + function shouldUpdate(vnode, old) { + var forceVnodeUpdate, forceComponentUpdate + if (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === "function") forceVnodeUpdate = vnode.attrs.onbeforeupdate.call(vnode.state, vnode, old) + if (typeof vnode.tag !== "string" && typeof vnode.tag.onbeforeupdate === "function") forceComponentUpdate = vnode.tag.onbeforeupdate.call(vnode.state, vnode, old) + if (!(forceVnodeUpdate === undefined && forceComponentUpdate === undefined) && !forceVnodeUpdate && !forceComponentUpdate) { + vnode.dom = old.dom + vnode.domSize = old.domSize + vnode.instance = old.instance + return true + } + return false + } + function render(dom, vnodes) { + if (!dom) throw new Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.") + var hooks = [] + var active = $doc.activeElement + // First time0 rendering into a node clears it out + if (dom.vnodes == null) dom.textContent = "" + if (!Array.isArray(vnodes)) vnodes = [vnodes] + updateNodes(dom, dom.vnodes, Vnode.normalizeChildren(vnodes), hooks, null, undefined) + dom.vnodes = vnodes + for (var i = 0; i < hooks.length; i++) hooks[i]() + if ($doc.activeElement !== active) active.focus() + } + return {render: render, setEventCallback: setEventCallback} +} +function throttle(callback) { + //60fps translates to 16.6ms, round it down since setTimeout requires int + var time = 16 + var last = 0, pending = null + var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout + return function() { + var now = Date.now() + if (last === 0 || now - last >= time) { + last = now + callback() + } + else if (pending === null) { + pending = timeout(function() { + pending = null + callback() + last = Date.now() + }, time - (now - last)) + } + } +} +var _11 = function($window) { + var renderService = coreRenderer($window) + renderService.setEventCallback(function(e) { + if (e.redraw !== false) redraw() + }) + + var callbacks = [] + function subscribe(key1, callback) { + unsubscribe(key1) + callbacks.push(key1, throttle(callback)) + } + function unsubscribe(key1) { + var index = callbacks.indexOf(key1) + if (index > -1) callbacks.splice(index, 2) + } + function redraw() { + for (var i = 1; i < callbacks.length; i += 2) { + callbacks[i]() + } + } + return {subscribe: subscribe, unsubscribe: unsubscribe, redraw: redraw, render: renderService.render} +} +var redrawService = _11(window) +requestService.setCompletionCallback(redrawService.redraw) +var _16 = function(redrawService0) { + return function(root, component) { + if (component === null) { + redrawService0.render(root, []) + redrawService0.unsubscribe(root) + return + } + + if (component.view == null) throw new Error("m.mount(element, component) expects a component, not a vnode") + + var run0 = function() { + redrawService0.render(root, Vnode(component)) + } + redrawService0.subscribe(root, run0) + redrawService0.redraw() + } +} +m.mount = _16(redrawService) +var Promise = PromisePolyfill +var parseQueryString = function(string) { + if (string === "" || string == null) return {} + if (string.charAt(0) === "?") string = string.slice(1) + var entries = string.split("&"), data0 = {}, counters = {} + for (var i = 0; i < entries.length; i++) { + var entry = entries[i].split("=") + var key5 = decodeURIComponent(entry[0]) + var value = entry.length === 2 ? decodeURIComponent(entry[1]) : "" + if (value === "true") value = true + else if (value === "false") value = false + var levels = key5.split(/\]\[?|\[/) + var cursor = data0 + if (key5.indexOf("[") > -1) levels.pop() + for (var j = 0; j < levels.length; j++) { + var level = levels[j], nextLevel = levels[j + 1] + var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10)) + var isValue = j === levels.length - 1 + if (level === "") { + var key5 = levels.slice(0, j).join() + if (counters[key5] == null) counters[key5] = 0 + level = counters[key5]++ + } + if (cursor[level] == null) { + cursor[level] = isValue ? value : isNumber ? [] : {} + } + cursor = cursor[level] + } + } + return data0 +} +var coreRouter = function($window) { + var supportsPushState = typeof $window.history.pushState === "function" + var callAsync0 = typeof setImmediate === "function" ? setImmediate : setTimeout + function normalize1(fragment0) { + var data = $window.location[fragment0].replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponent) + if (fragment0 === "pathname" && data[0] !== "/") data = "/" + data + return data + } + var asyncId + function debounceAsync(callback0) { + return function() { + if (asyncId != null) return + asyncId = callAsync0(function() { + asyncId = null + callback0() + }) + } + } + function parsePath(path, queryData, hashData) { + var queryIndex = path.indexOf("?") + var hashIndex = path.indexOf("#") + var pathEnd = queryIndex > -1 ? queryIndex : hashIndex > -1 ? hashIndex : path.length + if (queryIndex > -1) { + var queryEnd = hashIndex > -1 ? hashIndex : path.length + var queryParams = parseQueryString(path.slice(queryIndex + 1, queryEnd)) + for (var key4 in queryParams) queryData[key4] = queryParams[key4] + } + if (hashIndex > -1) { + var hashParams = parseQueryString(path.slice(hashIndex + 1)) + for (var key4 in hashParams) hashData[key4] = hashParams[key4] + } + return path.slice(0, pathEnd) + } + var router = {prefix: "#!"} + router.getPath = function() { + var type2 = router.prefix.charAt(0) + switch (type2) { + case "#": return normalize1("hash").slice(router.prefix.length) + case "?": return normalize1("search").slice(router.prefix.length) + normalize1("hash") + default: return normalize1("pathname").slice(router.prefix.length) + normalize1("search") + normalize1("hash") + } + } + router.setPath = function(path, data, options) { + var queryData = {}, hashData = {} + path = parsePath(path, queryData, hashData) + if (data != null) { + for (var key4 in data) queryData[key4] = data[key4] + path = path.replace(/:([^\/]+)/g, function(match2, token) { + delete queryData[token] + return data[token] + }) + } + var query = buildQueryString(queryData) + if (query) path += "?" + query + var hash = buildQueryString(hashData) + if (hash) path += "#" + hash + if (supportsPushState) { + var state = options ? options.state : null + var title = options ? options.title : null + $window.onpopstate() + if (options && options.replace) $window.history.replaceState(state, title, router.prefix + path) + else $window.history.pushState(state, title, router.prefix + path) + } + else $window.location.href = router.prefix + path + } + router.defineRoutes = function(routes, resolve, reject) { + function resolveRoute() { + var path = router.getPath() + var params = {} + var pathname = parsePath(path, params, params) + + var state = $window.history.state + if (state != null) { + for (var k in state) params[k] = state[k] + } + for (var route0 in routes) { + var matcher = new RegExp("^" + route0.replace(/:[^\/]+?\.{3}/g, "(.*?)").replace(/:[^\/]+/g, "([^\\/]+)") + "\/?$") + if (matcher.test(pathname)) { + pathname.replace(matcher, function() { + var keys = route0.match(/:[^\/]+/g) || [] + var values = [].slice.call(arguments, 1, -2) + for (var i = 0; i < keys.length; i++) { + params[keys[i].replace(/:|\./g, "")] = decodeURIComponent(values[i]) + } + resolve(routes[route0], params, path, route0) + }) + return + } + } + reject(path, params) + } + + if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute) + else if (router.prefix.charAt(0) === "#") $window.onhashchange = resolveRoute + resolveRoute() + } + + return router +} +var _20 = function($window, redrawService0) { + var routeService = coreRouter($window) + var identity = function(v) {return v} + var render1, component, attrs3, currentPath, lastUpdate + var route = function(root, defaultRoute, routes) { + if (root == null) throw new Error("Ensure the DOM element that was passed to `m.route` is not undefined") + var run1 = function() { + if (render1 != null) redrawService0.render(root, render1(Vnode(component, attrs3.key, attrs3))) + } + var bail = function() { + routeService.setPath(defaultRoute, null, {replace: true}) + } + routeService.defineRoutes(routes, function(payload, params, path) { + var update = lastUpdate = function(routeResolver, comp) { + if (update !== lastUpdate) return + component = comp != null && typeof comp.view === "function" ? comp : "div", attrs3 = params, currentPath = path, lastUpdate = null + render1 = (routeResolver.render || identity).bind(routeResolver) + run1() + } + if (payload.view) update({}, payload) + else { + if (payload.onmatch) { + Promise.resolve(payload.onmatch(params, path)).then(function(resolved) { + update(payload, resolved) + }, bail) + } + else update(payload, "div") + } + }, bail) + redrawService0.subscribe(root, run1) + } + route.set = function(path, data, options) { + if (lastUpdate != null) options = {replace: true} + lastUpdate = null + routeService.setPath(path, data, options) + } + route.get = function() {return currentPath} + route.prefix = function(prefix0) {routeService.prefix = prefix0} + route.link = function(vnode1) { + vnode1.dom.setAttribute("href", routeService.prefix + vnode1.attrs.href) + vnode1.dom.onclick = function(e) { + if (e.ctrlKey || e.metaKey || e.shiftKey || e.which === 2) return + e.preventDefault() + e.redraw = false + var href = this.getAttribute("href") + if (href.indexOf(routeService.prefix) === 0) href = href.slice(routeService.prefix.length) + route.set(href, undefined, undefined) + } + } + route.param = function(key3) { + if(typeof attrs3 !== "undefined" && typeof key3 !== "undefined") return attrs3[key3] + return attrs3 + } + return route +} +m.route = _20(window, redrawService) +m.withAttr = function(attrName, callback1, context) { + return function(e) { + callback1.call(context || this, attrName in e.currentTarget ? e.currentTarget[attrName] : e.currentTarget.getAttribute(attrName)) + } +} +var _28 = coreRenderer(window) +m.render = _28.render +m.redraw = redrawService.redraw +m.request = requestService.request +m.jsonp = requestService.jsonp +m.parseQueryString = parseQueryString +m.buildQueryString = buildQueryString +m.version = "1.0.0" +m.vnode = Vnode +if (typeof module !== "undefined") module["exports"] = m +else window.m = m +} +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate) +},{"timers":2}],4:[function(require,module,exports){ +'use strict'; + +var _mithril = _interopRequireDefault(require("mithril")); + +var _view = _interopRequireDefault(require("./view")); + +var _de = _interopRequireDefault(require("./texte/de")); + +var _en = _interopRequireDefault(require("./texte/en")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function launch() { + //m.mount(window.document.getElementById('canvas'), view) + if (window.language === 'en') { + window.texte = _en["default"]; + } else { + window.texte = _de["default"]; + } + + _mithril["default"].mount(window.document.getElementById('gradido-mithril-passphrase'), _view["default"]); +} // cross browser dom is ready module from: +// https://www.competa.com/blog/cross-browser-document-ready-with-vanilla-javascript/ + + +var domIsReady = function (domIsReady) { + var isBrowserIeOrNot = function isBrowserIeOrNot() { + return !document.attachEvent || typeof document.attachEvent === "undefined" ? 'not-ie' : 'ie'; + }; + + domIsReady = function domIsReady(callback) { + if (callback && typeof callback === 'function') { + if (isBrowserIeOrNot() !== 'ie') { + document.addEventListener("DOMContentLoaded", function () { + return callback(); + }); + } else { + document.attachEvent("onreadystatechange", function () { + if (document.readyState === "complete") { + return callback(); + } + }); + } + } else { + console.error('The callback is not a function!'); + } + }; + + return domIsReady; +}(domIsReady || {}); // DOM ready without jquery, loaded from basic.js +// cross browser dom is ready + + +(function (document, window, domIsReady, undefined) { + domIsReady(function () { + launch(); + }); +})(document, window, domIsReady); + +},{"./texte/de":7,"./texte/en":8,"./view":10,"mithril":3}],5:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _mithril = _interopRequireDefault(require("mithril")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function oninit(vnode) {} + +function view(vnode) { + return (0, _mithril["default"])('div.modal.visible-modal', { + tabindex: '-1', + role: 'dialog' + }, (0, _mithril["default"])('div.modal-dialog', { + role: 'document' + }, (0, _mithril["default"])('div.modal-content', [(0, _mithril["default"])('p.grid-header', vnode.attrs.title), (0, _mithril["default"])('div.modal-body', vnode.attrs.body), (0, _mithril["default"])('div.modal-footer', [(0, _mithril["default"])('button.btn.btn-primary', { + type: 'button', + 'data-dismiss': 'modal', + onclick: vnode.attrs.dismiss + }, 'Ok')])]))); +} + +var _default = { + view: view, + oninit: oninit +}; +exports["default"] = _default; + +},{"mithril":3}],6:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +function getEntities() { + return [['auml', 'ä'], ['ouml', 'ö'], ['uuml', 'ü'], ['Auml', 'Ä'], ['Ouml', 'Ö'], ['Uuml', 'Ü'], ['szlig', 'ß']]; +} + +function decodeHTMLEntities(text) { + var entities = getEntities(); + + for (var i = 0, max = entities.length; i < max; ++i) { + text = text.replace(new RegExp('&' + entities[i][0] + ';', 'g'), entities[i][1]); + } + + return text; +} + +function encodeHTMLEntities(text) { + var entities = getEntities(); + + for (var i = 0, max = entities.length; i < max; ++i) { + //text = text.replace(new RegExp('&'+entities[i][0]+';', 'g'), entities[i][1]); + text = text.replace(new RegExp(entities[i][1], 'g'), '&' + entities[i][0] + ';'); + } + + return text; +} + +var _default = { + decodeHTMLEntities: decodeHTMLEntities, + encodeHTMLEntities: encodeHTMLEntities +}; +exports["default"] = _default; + +},{}],7:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +var _default = { + INVALID_PASSPHRASE: 'Das ist nicht deine Passphrase, Möchtest du nochmal schauen wie sie hieß?', + SHOW_PASSPHRASE: 'Passphrase nochmal anzeigen', + DIALOG_SHOW_PASSPHRASE_TITLE: 'Passphrase', + YES: 'Ja', + NEXT: 'Weiter' +}; +exports["default"] = _default; + +},{}],8:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +var _default = { + INVALID_PASSPHRASE: 'This is not the correct passphrase. This is not your passphrase, would you like to see what its name was again?', + SHOW_PASSPHRASE: 'Show Passphrase again', + DIALOG_SHOW_PASSPHRASE_TITLE: 'Passphrase', + YES: 'Yes', + NEXT: 'Next' +}; +exports["default"] = _default; + +},{}],9:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _mithril = _interopRequireDefault(require("mithril")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +function oninit(vnode) {//vnode.state.disabled = false +} + +function clickHandler(vnode) { + vnode.attrs.addWordCallback(vnode.attrs.word); //vnode.state.disabled = true +} + +function view(vnode) { + var classes = '.btn.btn-sm'; + + if (vnode.attrs.disabled) { + classes += '.disabled'; + return (0, _mithril["default"])('span'); + } else { + if (vnode.attrs.btnColor !== undefined) { + classes += '.' + vnode.attrs.btnColor; + } + } + + return (0, _mithril["default"])('button' + classes, { + type: 'button', + disabled: vnode.attrs.disabled, + onclick: function onclick(e) { + clickHandler(vnode); + } + }, vnode.attrs.word); +} + +var _default = { + view: view, + oninit: oninit +}; +exports["default"] = _default; + +},{"mithril":3}],10:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _mithril = _interopRequireDefault(require("mithril")); + +var _button = _interopRequireDefault(require("./button")); + +var _dialog = _interopRequireDefault(require("../lib/dialog")); + +var _htmlEntities = _interopRequireDefault(require("../lib/htmlEntities")); + +var _passphrase = _interopRequireDefault(require("./passphrase")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function oninit(vnode) { + vnode.state.passphraseIndices = []; + vnode.state.passphraseIndicesSorted = []; + vnode.state.textboxContent = ''; + vnode.state.btnDisableArray = []; + vnode.state.countValidWords = 0; + var passphraseArray = passphrase.split(' '); + + for (var i in passphraseArray) { + var word = passphraseArray[i]; + var index = mnemonicWords.indexOf(word); + + if (-1 === index) { + if (65533 !== word.charCodeAt(0)) { + console.error("invalid index: %o for word: %o", index, word); + } + } else { + vnode.state.passphraseIndices[i] = index; + } + } + + passphraseArray.sort(); + + for (var _i in passphraseArray) { + var _word = passphraseArray[_i]; + + var _index = mnemonicWords.indexOf(_word); + + if (-1 === _index) { + if (65533 !== _word.charCodeAt(0)) { + console.error("invalid index: %o for word: %o", _index, _word); + } + } else { + vnode.state.passphraseIndicesSorted[_i] = _index; + vnode.state.btnDisableArray[_i] = false; + } + } //console.log("Passphrase: %s", passphrase) + //console.log("Passphrase indices: %o", vnode.state.passphraseIndices) + //console.log("Passphrase sorted indices: %o", vnode.state.passphraseIndicesSorted) + + + vnode.state.valid = true; + vnode.state.complete = false; + vnode.state.showPassphrase = false; +} +/* + *
    + + + + + + +
    +
    +
    + +
    +
    + + Weiter + */ + + +function addWordToTextbox(vnode, word) { + if (vnode.state.textboxContent.length > 1 && vnode.state.textboxContent.slice(-1) != ' ') { + vnode.state.textboxContent += ' '; + } + + vnode.state.textboxContent += word; + checkValidationTextbox(vnode); +} + +function onUpdateText(vnode, newContent) { + //console.log("e: %o", newContent.target.value) + vnode.state.textboxContent = newContent.replace(/[^\S ]+/g, ''); + + if (newContent === '') { + vnode.state.valid = true; + } else { + //if(newContent.slice(-1) === ' ') { + //const words = newContent.split(' ') + checkValidationTextbox(vnode); + } //} + +} + +function checkValidationTextbox(vnode) { + //console.log('checkValidationTextbox') + var words = vnode.state.textboxContent.split(' '); + var countValidWords = 0; + vnode.state.valid = true; //console.log("words: %o", words) + + for (var i in vnode.state.btnDisableArray) { + vnode.state.btnDisableArray[i] = false; + } + + for (var _i2 in words) { + var word = _htmlEntities["default"].encodeHTMLEntities(words[_i2]); + + if (word === "") continue; + var index = mnemonicWords.indexOf(word); //console.log("index of word: %o = %o", word, index) + + if (index !== -1) { + if (vnode.state.passphraseIndices[countValidWords] !== index) { + vnode.state.valid = false; + break; + } else { + countValidWords++; + } + + var sortedIndex = vnode.state.passphraseIndicesSorted.indexOf(index); //console.log("sortedIndex: %o", sortedIndex) + + if (-1 !== sortedIndex) { + vnode.state.btnDisableArray[sortedIndex] = true; + } + } + } + + if (countValidWords === vnode.state.passphraseIndices.length) { + vnode.state.complete = true; + } else { + vnode.state.complete = false; + } + + vnode.state.countValidWords = countValidWords; //console.log("count valid words: %o / %o", countValidWords, vnode.state.passphraseIndices.length) +} + +function view(vnode) { + var classes = '.form-control'; + + if (vnode.state.valid === false) { + classes += '.is-invalid'; + } else if (vnode.state.complete) { + classes += '.is-valid'; + } + + var choosenWords = []; + + for (var i = 0; i < vnode.state.countValidWords; i++) { + choosenWords.push(vnode.state.passphraseIndices[i]); + } + + return (0, _mithril["default"])('div', [(0, _mithril["default"])('div.col-md-12.showcase_content_area.mb-0', [vnode.state.passphraseIndicesSorted.map(function (val, i) { + return (0, _mithril["default"])(_button["default"], { + btnColor: 'btn-outline-warning', + word: _htmlEntities["default"].decodeHTMLEntities(mnemonicWords[val]), + addWordCallback: function addWordCallback(word) { + addWordToTextbox(vnode, word); + }, + disabled: vnode.state.btnDisableArray[i] + }); + }), choosenWords.map(function (val) { + return (0, _mithril["default"])('button.btn.btn-sm.btn-outline-success.disabled', { + disabled: true + }, _htmlEntities["default"].decodeHTMLEntities(mnemonicWords[val])); + })]), (0, _mithril["default"])('div.form-group.row-showcase_row_area', (0, _mithril["default"])('div.col-lg-8.col-md-9.mx-auto', [(0, _mithril["default"])('textarea' + classes + '#inputPassphrase', { + name: 'inputPassphrase', + cols: 10, + rows: 5, + value: vnode.state.textboxContent, + onchange: function onchange(e) { + onUpdateText(vnode, e.target.value); + }, + onkeyup: function onkeyup(e) { + onUpdateText(vnode, e.target.value); + }, + onpaste: function onpaste(e) { + onUpdateText(vnode, e.target.value); + } + }), vnode.state.valid === false ? (0, _mithril["default"])('.invalid-feedback', [window.texte.INVALID_PASSPHRASE, (0, _mithril["default"])('button.btn.btn-primary', { + onclick: function onclick() { + vnode.state.showPassphrase = true; + return false; + } + }, [(0, _mithril["default"])('i.mdi.mdi-eye'), (0, _mithril["default"])('span', _mithril["default"].trust(' ')), (0, _mithril["default"])('span', window.texte.SHOW_PASSPHRASE)])]) : null])), //Weiter + //<%= gettext("Ja") %> + vnode.state.complete ? (0, _mithril["default"])('input.btn.btn-sm.btn-success.pull-right', { + name: 'btnChecked', + type: 'submit', + value: window.texte.NEXT + }) : null], vnode.state.showPassphrase === true ? (0, _mithril["default"])(_dialog["default"], { + title: window.texte.DIALOG_SHOW_PASSPHRASE_TITLE, + body: (0, _mithril["default"])(_passphrase["default"]), + dismiss: function dismiss() { + vnode.state.showPassphrase = false; + } + }) : null); +} + +var _default = { + view: view, + oninit: oninit +}; +exports["default"] = _default; + +},{"../lib/dialog":5,"../lib/htmlEntities":6,"./button":9,"./passphrase":11,"mithril":3}],11:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; + +var _mithril = _interopRequireDefault(require("mithril")); + +var _htmlEntities = _interopRequireDefault(require("../lib/htmlEntities")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + *
    +
    Passphrase
    +

    Hallo Miau Das sind Wörter einer Passphrase Miau Hilfe Ich mag dich nicht Abenteuer Haus Zoo Garten Ziegel Tisch Auto Husten Hüpfburg Teezeit

    +
    + * + */ +function oninit(vnode) {//vnode.state.disabled = false +} + +function view(vnode) { + var passphraseString = passphrase; + + if (passphrase.slice(-1).charCodeAt(0) === 65533) { + passphraseString = passphrase.substring(0, passphrase.length - 1); + } + + return (0, _mithril["default"])('.col-lg-8.col-md-10.mx-auto.alert.alert-primary', { + style: { + 'text-align': 'center' + } + }, _htmlEntities["default"].decodeHTMLEntities(passphraseString)); +} + +var _default = { + view: view, + oninit: oninit +}; +exports["default"] = _default; + +},{"../lib/htmlEntities":6,"mithril":3}]},{},[4]); diff --git a/community_server/webroot/js/ensurePassphrase.min.js b/community_server/webroot/js/ensurePassphrase.min.js new file mode 100644 index 000000000..37ae8461f --- /dev/null +++ b/community_server/webroot/js/ensurePassphrase.min.js @@ -0,0 +1 @@ +!function i(a,l,u){function s(t,e){if(!l[t]){if(!a[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var o=l[t]={exports:{}};a[t][0].call(o.exports,function(e){return s(a[t][1][e]||e)},o,o.exports,i,a,l,u)}return l[t].exports}for(var c="function"==typeof require&&require,e=0;e(g.devicePixelRatio||1)?"translate("+e+"px, "+u+"px)":"translate3d("+e+"px, "+u+"px, 0)",l)):Object.assign({},r,((t={})[h]=a?u+"px":"",t[m]=d?e+"px":"",t.transform="",t))}function E(e){return e.replace(/left|right|bottom|top/g,(function(e){return _[e]}))}function D(e){return e.replace(/start|end/g,(function(e){return U[e]}))}function P(e,t){var n=!(!t.getRootNode||!t.getRootNode().host);if(e.contains(t))return!0;if(n)do{if(t&&e.isSameNode(t))return!0;t=t.parentNode||t.host}while(t);return!1}function L(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function k(e,o){if("viewport"===o){var a=n(e);e=a.visualViewport,o=a.innerWidth,a=a.innerHeight,e&&/iPhone|iPod|iPad/.test(navigator.platform)&&(o=e.width,a=e.height),e=L({width:o,height:a,x:0,y:0})}else i(o)?e=t(o):(e=n(a=s(e)),o=r(a),(a=u(s(a),e)).height=Math.max(a.height,e.innerHeight),a.width=Math.max(a.width,e.innerWidth),a.x=-o.scrollLeft,a.y=-o.scrollTop,e=L(a));return e}function B(e,t,r){return t="clippingParents"===t?function(e){var t=m(e),n=0<=["absolute","fixed"].indexOf(p(e).position)&&i(e)?v(e):e;return o(n)?t.filter((function(e){return o(e)&&P(e,n)})):[]}(e):[].concat(t),(r=(r=[].concat(t,[r])).reduce((function(t,r){var o=k(e,r),c=n(r=i(r)?r:s(e)),u=i(r)?p(r):{};parseFloat(u.borderTopWidth);var d=parseFloat(u.borderRightWidth)||0,l=parseFloat(u.borderBottomWidth)||0,m=parseFloat(u.borderLeftWidth)||0;u="html"===a(r);var h=f(r),v=r.clientWidth+d,g=r.clientHeight+l;return u&&50m?d:u?c.innerWidth-v-h:r.offsetWidth-v,c=u?c.innerHeight-g:r.offsetHeight-g,r=u?h:r.clientLeft,t.top=Math.max(o.top+l,t.top),t.right=Math.min(o.right-d,t.right),t.bottom=Math.min(o.bottom-c,t.bottom),t.left=Math.max(o.left+r,t.left),t}),k(e,r[0]))).width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}function W(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},{},e)}function A(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function H(e,n){void 0===n&&(n={});var r=n;n=void 0===(n=r.placement)?e.placement:n;var i=r.boundary,a=void 0===i?"clippingParents":i,f=void 0===(i=r.rootBoundary)?"viewport":i;i=void 0===(i=r.elementContext)?"popper":i;var p=r.altBoundary,c=void 0!==p&&p;r=W("number"!=typeof(r=void 0===(r=r.padding)?0:r)?r:A(r,q));var u=e.elements.reference;p=e.rects.popper,a=B(o(c=e.elements[c?"popper"===i?"reference":"popper":i])?c:c.contextElement||s(e.elements.popper),a,f),c=M({reference:f=t(u),element:p,strategy:"absolute",placement:n}),p=L(Object.assign({},p,{},c)),f="popper"===i?p:f;var d={top:a.top-f.top+r.top,bottom:f.bottom-a.bottom+r.bottom,left:a.left-f.left+r.left,right:f.right-a.right+r.right};if(e=e.modifiersData.offset,"popper"===i&&e){var l=e[n];Object.keys(d).forEach((function(e){var t=0<=["right","bottom"].indexOf(e)?1:-1,n=0<=["top","bottom"].indexOf(e)?"y":"x";d[e]+=l[n]*t}))}return d}function T(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function R(e){return["top","right","bottom","left"].some((function(t){return 0<=e[t]}))}var q=["top","bottom","right","left"],S=q.reduce((function(e,t){return e.concat([t+"-start",t+"-end"])}),[]),C=[].concat(q,["auto"]).reduce((function(e,t){return e.concat([t,t+"-start",t+"-end"])}),[]),F="beforeRead read afterRead beforeMain main afterMain beforeWrite write afterWrite".split(" "),N={placement:"bottom",modifiers:[],strategy:"absolute"},V={passive:!0},I={top:"auto",right:"auto",bottom:"auto",left:"auto"},_={left:"right",right:"left",bottom:"top",top:"bottom"},U={start:"end",end:"start"},z=[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,r=e.instance,o=(e=e.options).scroll,i=void 0===o||o,a=void 0===(e=e.resize)||e,s=n(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&f.forEach((function(e){e.addEventListener("scroll",r.update,V)})),a&&s.addEventListener("resize",r.update,V),function(){i&&f.forEach((function(e){e.removeEventListener("scroll",r.update,V)})),a&&s.removeEventListener("resize",r.update,V)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state;t.modifiersData[e.name]=M({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options;e=void 0===(e=n.gpuAcceleration)||e,n=void 0===(n=n.adaptive)||n,e={placement:y(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:e},null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,{},j(Object.assign({},e,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:n})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,{},j(Object.assign({},e,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];i(o)&&a(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{};e=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{}),i(r)&&a(r)&&(Object.assign(r.style,e),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},{name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.name,r=void 0===(e=e.options.offset)?[0,0]:e,o=(e=C.reduce((function(e,n){var o=t.rects,i=y(n),a=0<=["left","top"].indexOf(i)?-1:1,s="function"==typeof r?r(Object.assign({},o,{placement:n})):r;return o=(o=s[0])||0,s=((s=s[1])||0)*a,i=0<=["left","right"].indexOf(i)?{x:s,y:o}:{x:o,y:s},e[n]=i,e}),{}))[t.placement],i=o.x;o=o.y,null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=o),t.modifiersData[n]=e}},{name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;if(e=e.name,!t.modifiersData[e]._skip){var r=n.mainAxis;r=void 0===r||r;var o=n.altAxis;o=void 0===o||o;var i=n.fallbackPlacements,a=n.padding,s=n.boundary,f=n.rootBoundary,p=n.altBoundary,c=n.flipVariations,u=void 0===c||c,d=n.allowedAutoPlacements;c=y(n=t.options.placement),i=i||(c!==n&&u?function(e){if("auto"===y(e))return[];var t=E(e);return[D(e),t,D(t)]}(n):[E(n)]);var l=[n].concat(i).reduce((function(e,n){return e.concat("auto"===y(n)?function(e,t){void 0===t&&(t={});var n=t.boundary,r=t.rootBoundary,o=t.padding,i=t.flipVariations,a=t.allowedAutoPlacements,s=void 0===a?C:a,f=t.placement.split("-")[1],p=(f?i?S:S.filter((function(e){return e.split("-")[1]===f})):q).filter((function(e){return 0<=s.indexOf(e)})).reduce((function(t,i){return t[i]=H(e,{placement:i,boundary:n,rootBoundary:r,padding:o})[y(i)],t}),{});return Object.keys(p).sort((function(e,t){return p[e]-p[t]}))}(t,{placement:n,boundary:s,rootBoundary:f,padding:a,flipVariations:u,allowedAutoPlacements:d}):n)}),[]);n=t.rects.reference,i=t.rects.popper;var m=new Map;c=!0;for(var h=l[0],v=0;vi[O]&&(x=E(x)),O=E(x),w=[],r&&w.push(0>=M[b]),o&&w.push(0>=M[x],0>=M[O]),w.every((function(e){return e}))){h=g,c=!1;break}m.set(g,w)}if(c)for(r=function(e){var t=l.find((function(t){if(t=m.get(t))return t.slice(0,e).every((function(e){return e}))}));if(t)return h=t,"break"},o=u?3:1;0-1}function s(t,e){return"function"==typeof t?t.apply(void 0,e):t}function p(t,e){return 0===e?t:function(i){clearTimeout(n),n=setTimeout((function(){t(i)}),e)};var n}function u(t,e){var n=Object.assign({},t);return e.forEach((function(t){delete n[t]})),n}function c(t){return[].concat(t)}function f(t,e){-1===t.indexOf(e)&&t.push(e)}function l(t){return t.split("-")[0]}function d(t){return[].slice.call(t)}function v(){return document.createElement("div")}function m(t){return["Element","Fragment"].some((function(e){return a(t,e)}))}function g(t){return a(t,"MouseEvent")}function h(t){return!(!t||!t._tippy||t._tippy.reference!==t)}function b(t){return m(t)?[t]:function(t){return a(t,"NodeList")}(t)?d(t):Array.isArray(t)?t:d(document.querySelectorAll(t))}function y(t,e){t.forEach((function(t){t&&(t.style.transitionDuration=e+"ms")}))}function x(t,e){t.forEach((function(t){t&&t.setAttribute("data-state",e)}))}function w(t){var e=c(t)[0];return e&&e.ownerDocument||document}function E(t,e,n){var i=e+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(e){t[i](e,n)}))}var T={isTouch:!1},A=0;function C(){T.isTouch||(T.isTouch=!0,window.performance&&document.addEventListener("mousemove",O))}function O(){var t=performance.now();t-A<20&&(T.isTouch=!1,document.removeEventListener("mousemove",O)),A=t}function L(){var t=document.activeElement;if(h(t)){var e=t._tippy;t.blur&&!e.state.isVisible&&t.blur()}}var D=Object.assign({appendTo:function(){return document.body},aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(D);function M(t){var e=(t.plugins||[]).reduce((function(e,n){var i=n.name,r=n.defaultValue;return i&&(e[i]=void 0!==t[i]?t[i]:r),e}),{});return Object.assign({},t,{},e)}function V(t,e){var n=Object.assign({},e,{content:s(e.content,[t])},e.ignoreAttributes?{}:function(t,e){return(e?Object.keys(M(Object.assign({},D,{plugins:e}))):k).reduce((function(e,n){var i=(t.getAttribute("data-tippy-"+n)||"").trim();if(!i)return e;if("content"===n)e[n]=i;else try{e[n]=JSON.parse(i)}catch(t){e[n]=i}return e}),{})}(t,e.plugins));return n.aria=Object.assign({},D.aria,{},n.aria),n.aria={expanded:"auto"===n.aria.expanded?e.interactive:n.aria.expanded,content:"auto"===n.aria.content?e.interactive?null:"describedby":n.aria.content},n}function R(t,e){t.innerHTML=e}function j(t){var e=v();return!0===t?e.className="tippy-arrow":(e.className="tippy-svg-arrow",m(t)?e.appendChild(t):R(e,t)),e}function P(t,e){m(e.content)?(R(t,""),t.appendChild(e.content)):"function"!=typeof e.content&&(e.allowHTML?R(t,e.content):t.textContent=e.content)}function I(t){var e=t.firstElementChild,n=d(e.children);return{box:e,content:n.find((function(t){return t.classList.contains("tippy-content")})),arrow:n.find((function(t){return t.classList.contains("tippy-arrow")||t.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(t){return t.classList.contains("tippy-backdrop")}))}}function S(t){var e=v(),n=v();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var i=v();function r(n,i){var r=I(e),o=r.box,a=r.content,s=r.arrow;i.theme?o.setAttribute("data-theme",i.theme):o.removeAttribute("data-theme"),"string"==typeof i.animation?o.setAttribute("data-animation",i.animation):o.removeAttribute("data-animation"),i.inertia?o.setAttribute("data-inertia",""):o.removeAttribute("data-inertia"),o.style.maxWidth="number"==typeof i.maxWidth?i.maxWidth+"px":i.maxWidth,i.role?o.setAttribute("role",i.role):o.removeAttribute("role"),n.content===i.content&&n.allowHTML===i.allowHTML||P(a,t.props),i.arrow?s?n.arrow!==i.arrow&&(o.removeChild(s),o.appendChild(j(i.arrow))):o.appendChild(j(i.arrow)):s&&o.removeChild(s)}return i.className="tippy-content",i.setAttribute("data-state","hidden"),P(i,t.props),e.appendChild(n),n.appendChild(i),r(t.props,t.props),{popper:e,onUpdate:r}}S.$$tippy=!0;var B=1,H=[],U=[];function N(e,n){var a,u,m,h,b,A,C,O,L=V(e,Object.assign({},D,{},M(n))),k=!1,R=!1,j=!1,P=!1,S=[],N=p(ht,L.interactiveDebounce),X=w(L.triggerTarget||e),Y=B++,_=(O=L.plugins).filter((function(t,e){return O.indexOf(t)===e})),z={id:Y,reference:e,popper:v(),popperInstance:null,props:L,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:_,clearDelayTimeouts:function(){clearTimeout(a),clearTimeout(u),cancelAnimationFrame(m)},setProps:function(t){if(z.state.isDestroyed)return;it("onBeforeUpdate",[z,t]),mt();var n=z.props,i=V(e,Object.assign({},z.props,{},t,{ignoreAttributes:!0}));z.props=i,vt(),n.interactiveDebounce!==i.interactiveDebounce&&(at(),N=p(ht,i.interactiveDebounce));n.triggerTarget&&!i.triggerTarget?c(n.triggerTarget).forEach((function(t){t.removeAttribute("aria-expanded")})):i.triggerTarget&&e.removeAttribute("aria-expanded");ot(),nt(),q&&q(n,i);z.popperInstance&&(wt(),Tt().forEach((function(t){requestAnimationFrame(t._tippy.popperInstance.forceUpdate)})));it("onAfterUpdate",[z,t])},setContent:function(t){z.setProps({content:t})},show:function(){var t=z.state.isVisible,e=z.state.isDestroyed,n=!z.state.isEnabled,i=T.isTouch&&!z.props.touch,r=o(z.props.duration,0,D.duration);if(t||e||n||i)return;if(Z().hasAttribute("disabled"))return;if(it("onShow",[z],!1),!1===z.props.onShow(z))return;z.state.isVisible=!0,Q()&&(W.style.visibility="visible");nt(),ct(),z.state.isMounted||(W.style.transition="none");if(Q()){var a=tt(),p=a.box,u=a.content;y([p,u],0)}A=function(){if(z.state.isVisible&&!P){if(P=!0,W.offsetHeight,W.style.transition=z.props.moveTransition,Q()&&z.props.animation){var t=tt(),e=t.box,n=t.content;y([e,n],r),x([e,n],"visible")}rt(),ot(),f(U,z),z.state.isMounted=!0,it("onMount",[z]),z.props.animation&&Q()&&function(t,e){lt(t,e)}(r,(function(){z.state.isShown=!0,it("onShown",[z])}))}},function(){var t,e=z.props.appendTo,n=Z();t=z.props.interactive&&e===D.appendTo||"parent"===e?n.parentNode:s(e,[n]);t.contains(W)||t.appendChild(W);wt()}()},hide:function(){var t=!z.state.isVisible,e=z.state.isDestroyed,n=!z.state.isEnabled,i=o(z.props.duration,1,D.duration);if(t||e||n)return;if(it("onHide",[z],!1),!1===z.props.onHide(z))return;z.state.isVisible=!1,z.state.isShown=!1,P=!1,Q()&&(W.style.visibility="hidden");if(at(),ft(),nt(),Q()){var r=tt(),a=r.box,s=r.content;z.props.animation&&(y([a,s],i),x([a,s],"hidden"))}rt(),ot(),z.props.animation?Q()&&function(t,e){lt(t,(function(){!z.state.isVisible&&W.parentNode&&W.parentNode.contains(W)&&e()}))}(i,z.unmount):z.unmount()},hideWithInteractivity:function(t){X.body.addEventListener("mouseleave",Ct),X.addEventListener("mousemove",N),f(H,N),N(t)},enable:function(){z.state.isEnabled=!0},disable:function(){z.hide(),z.state.isEnabled=!1},unmount:function(){z.state.isVisible&&z.hide();if(!z.state.isMounted)return;Et(),Tt().forEach((function(t){t._tippy.unmount()})),W.parentNode&&W.parentNode.removeChild(W);U=U.filter((function(t){return t!==z})),z.state.isMounted=!1,it("onHidden",[z])},destroy:function(){if(z.state.isDestroyed)return;z.clearDelayTimeouts(),z.unmount(),mt(),delete e._tippy,z.state.isDestroyed=!0,it("onDestroy",[z])}};if(!L.render)return z;var F=L.render(z),W=F.popper,q=F.onUpdate;W.setAttribute("data-tippy-root",""),W.id="tippy-"+z.id,z.popper=W,e._tippy=z,W._tippy=z;var $=_.map((function(t){return t.fn(z)})),J=e.hasAttribute("aria-expanded");return vt(),ot(),nt(),it("onCreate",[z]),L.showOnCreate&&At(),W.addEventListener("mouseenter",(function(){z.props.interactive&&z.state.isVisible&&z.clearDelayTimeouts()})),W.addEventListener("mouseleave",(function(t){z.props.interactive&&z.props.trigger.indexOf("mouseenter")>=0&&(X.addEventListener("mousemove",N),N(t))})),z;function G(){var t=z.props.touch;return Array.isArray(t)?t:[t,0]}function K(){return"hold"===G()[0]}function Q(){var t;return!!(null==(t=z.props.render)?void 0:t.$$tippy)}function Z(){return C||e}function tt(){return I(W)}function et(t){return z.state.isMounted&&!z.state.isVisible||T.isTouch||h&&"focus"===h.type?0:o(z.props.delay,t?0:1,D.delay)}function nt(){W.style.pointerEvents=z.props.interactive&&z.state.isVisible?"":"none",W.style.zIndex=""+z.props.zIndex}function it(t,e,n){var i;(void 0===n&&(n=!0),$.forEach((function(n){n[t]&&n[t].apply(void 0,e)})),n)&&(i=z.props)[t].apply(i,e)}function rt(){var t=z.props.aria;if(t.content){var n="aria-"+t.content,i=W.id;c(z.props.triggerTarget||e).forEach((function(t){var e=t.getAttribute(n);if(z.state.isVisible)t.setAttribute(n,e?e+" "+i:i);else{var r=e&&e.replace(i,"").trim();r?t.setAttribute(n,r):t.removeAttribute(n)}}))}}function ot(){!J&&z.props.aria.expanded&&c(z.props.triggerTarget||e).forEach((function(t){z.props.interactive?t.setAttribute("aria-expanded",z.state.isVisible&&t===Z()?"true":"false"):t.removeAttribute("aria-expanded")}))}function at(){X.body.removeEventListener("mouseleave",Ct),X.removeEventListener("mousemove",N),H=H.filter((function(t){return t!==N}))}function st(t){if(!(T.isTouch&&(j||"mousedown"===t.type)||z.props.interactive&&W.contains(t.target))){if(Z().contains(t.target)){if(T.isTouch)return;if(z.state.isVisible&&z.props.trigger.indexOf("click")>=0)return}else it("onClickOutside",[z,t]);!0===z.props.hideOnClick&&(k=!1,z.clearDelayTimeouts(),z.hide(),R=!0,setTimeout((function(){R=!1})),z.state.isMounted||ft())}}function pt(){j=!0}function ut(){j=!1}function ct(){X.addEventListener("mousedown",st,!0),X.addEventListener("touchend",st,r),X.addEventListener("touchstart",ut,r),X.addEventListener("touchmove",pt,r)}function ft(){X.removeEventListener("mousedown",st,!0),X.removeEventListener("touchend",st,r),X.removeEventListener("touchstart",ut,r),X.removeEventListener("touchmove",pt,r)}function lt(t,e){var n=tt().box;function i(t){t.target===n&&(E(n,"remove",i),e())}if(0===t)return e();E(n,"remove",b),E(n,"add",i),b=i}function dt(t,n,i){void 0===i&&(i=!1),c(z.props.triggerTarget||e).forEach((function(e){e.addEventListener(t,n,i),S.push({node:e,eventType:t,handler:n,options:i})}))}function vt(){var t;K()&&(dt("touchstart",gt,{passive:!0}),dt("touchend",bt,{passive:!0})),(t=z.props.trigger,t.split(/\s+/).filter(Boolean)).forEach((function(t){if("manual"!==t)switch(dt(t,gt),t){case"mouseenter":dt("mouseleave",bt);break;case"focus":dt(i?"focusout":"blur",yt);break;case"focusin":dt("focusout",yt)}}))}function mt(){S.forEach((function(t){var e=t.node,n=t.eventType,i=t.handler,r=t.options;e.removeEventListener(n,i,r)})),S=[]}function gt(t){var e,n=!1;if(z.state.isEnabled&&!xt(t)&&!R){var i="focus"===(null==(e=h)?void 0:e.type);h=t,C=t.currentTarget,ot(),!z.state.isVisible&&g(t)&&H.forEach((function(e){return e(t)})),"click"===t.type&&(z.props.trigger.indexOf("mouseenter")<0||k)&&!1!==z.props.hideOnClick&&z.state.isVisible?n=!0:At(t),"click"===t.type&&(k=!n),n&&!i&&Ct(t)}}function ht(t){var n=t.target,i=e.contains(n)||W.contains(n);"mousemove"===t.type&&i||function(t,e){var n=e.clientX,i=e.clientY;return t.every((function(t){var e=t.popperRect,r=t.popperState,o=t.props.interactiveBorder,a=l(r.placement),s=r.modifiersData.offset;if(!s)return!0;var p="bottom"===a?s.top.y:0,u="top"===a?s.bottom.y:0,c="right"===a?s.left.x:0,f="left"===a?s.right.x:0,d=e.top-i+p>o,v=i-e.bottom-u>o,m=e.left-n+c>o,g=n-e.right-f>o;return d||v||m||g}))}(Tt().concat(W).map((function(t){var e,n=null==(e=t._tippy.popperInstance)?void 0:e.state;return n?{popperRect:t.getBoundingClientRect(),popperState:n,props:L}:null})).filter(Boolean),t)&&(at(),Ct(t))}function bt(t){xt(t)||z.props.trigger.indexOf("click")>=0&&k||(z.props.interactive?z.hideWithInteractivity(t):Ct(t))}function yt(t){z.props.trigger.indexOf("focusin")<0&&t.target!==Z()||z.props.interactive&&t.relatedTarget&&W.contains(t.relatedTarget)||Ct(t)}function xt(t){return!!T.isTouch&&K()!==t.type.indexOf("touch")>=0}function wt(){Et();var n=z.props,i=n.popperOptions,r=n.placement,o=n.offset,a=n.getReferenceClientRect,s=n.moveTransition,p=Q()?I(W).arrow:null,u=a?{getBoundingClientRect:a,contextElement:a.contextElement||Z()}:e,c=[{name:"offset",options:{offset:o}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(t){var e=t.state;if(Q()){var n=tt().box;["placement","reference-hidden","escaped"].forEach((function(t){"placement"===t?n.setAttribute("data-placement",e.placement):e.attributes.popper["data-popper-"+t]?n.setAttribute("data-"+t,""):n.removeAttribute("data-"+t)})),e.attributes.popper={}}}}];Q()&&p&&c.push({name:"arrow",options:{element:p,padding:3}}),c.push.apply(c,(null==i?void 0:i.modifiers)||[]),z.popperInstance=t.createPopper(u,W,Object.assign({},i,{placement:r,onFirstUpdate:A,modifiers:c}))}function Et(){z.popperInstance&&(z.popperInstance.destroy(),z.popperInstance=null)}function Tt(){return d(W.querySelectorAll("[data-tippy-root]"))}function At(t){z.clearDelayTimeouts(),t&&it("onTrigger",[z,t]),ct();var e=et(!0),n=G(),i=n[0],r=n[1];T.isTouch&&"hold"===i&&r&&(e=r),e?a=setTimeout((function(){z.show()}),e):z.show()}function Ct(t){if(z.clearDelayTimeouts(),it("onUntrigger",[z,t]),z.state.isVisible){if(!(z.props.trigger.indexOf("mouseenter")>=0&&z.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(t.type)>=0&&k)){var e=et(!1);e?u=setTimeout((function(){z.state.isVisible&&z.hide()}),e):m=requestAnimationFrame((function(){z.hide()}))}}else ft()}}function X(t,e){void 0===e&&(e={});var n=D.plugins.concat(e.plugins||[]);document.addEventListener("touchstart",C,r),window.addEventListener("blur",L);var i=Object.assign({},e,{plugins:n}),o=b(t).reduce((function(t,e){var n=e&&N(e,i);return n&&t.push(n),t}),[]);return m(t)?o[0]:o}X.defaultProps=D,X.setDefaultProps=function(t){Object.keys(t).forEach((function(e){D[e]=t[e]}))},X.currentInput=T;var Y={mouseover:"mouseenter",focusin:"focus",click:"click"};var _={name:"animateFill",defaultValue:!1,fn:function(t){var e;if(!(null==(e=t.props.render)?void 0:e.$$tippy))return{};var n=I(t.popper),i=n.box,r=n.content,o=t.props.animateFill?function(){var t=v();return t.className="tippy-backdrop",x([t],"hidden"),t}():null;return{onCreate:function(){o&&(i.insertBefore(o,i.firstElementChild),i.setAttribute("data-animatefill",""),i.style.overflow="hidden",t.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(o){var t=i.style.transitionDuration,e=Number(t.replace("ms",""));r.style.transitionDelay=Math.round(e/10)+"ms",o.style.transitionDuration=t,x([o],"visible")}},onShow:function(){o&&(o.style.transitionDuration="0ms")},onHide:function(){o&&x([o],"hidden")}}}};var z={name:"followCursor",defaultValue:!1,fn:function(t){var e=t.reference,n=w(t.props.triggerTarget||e),i=null;function r(){return"manual"===t.props.trigger.trim()}function o(){var e=!!r()||null!==i&&!(0===i.clientX&&0===i.clientY);return t.props.followCursor&&e}function a(e){e&&t.setProps({getReferenceClientRect:null})}function s(){o()?n.addEventListener("mousemove",u):a(t.props.followCursor)}function p(){n.removeEventListener("mousemove",u)}function u(n){i={clientX:n.clientX,clientY:n.clientY};var r=!n.target||e.contains(n.target),o=t.props.followCursor,a=n.clientX,s=n.clientY,u=e.getBoundingClientRect(),c=a-u.left,f=s-u.top;!r&&t.props.interactive||t.setProps({getReferenceClientRect:function(){var t=e.getBoundingClientRect(),n=a,i=s;"initial"===o&&(n=t.left+c,i=t.top+f);var r="horizontal"===o?t.top:i,p="vertical"===o?t.right:n,u="horizontal"===o?t.bottom:i,l="vertical"===o?t.left:n;return{width:p-l,height:u-r,top:r,right:p,bottom:u,left:l}}}),(T.isTouch||"initial"===t.props.followCursor&&t.state.isVisible)&&p()}return{onAfterUpdate:function(t,e){var n=e.followCursor;void 0===n||n||a(!0)},onMount:function(){o()&&u(i)},onShow:function(){r()&&(i={clientX:0,clientY:0},s())},onTrigger:function(t,e){i||(g(e)&&(i={clientX:e.clientX,clientY:e.clientY}),s())},onUntrigger:function(){t.state.isVisible||(p(),i=null)},onHidden:function(){p(),i=null}}}};var F={name:"inlinePositioning",defaultValue:!1,fn:function(t){var e,n=t.reference;var i=-1,r=!1,o={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(r){var o=r.state;t.props.inlinePositioning&&(e!==o.placement&&t.setProps({getReferenceClientRect:function(){return function(t){return function(t,e,n,i){if(n.length<2||null===t)return e;if(2===n.length&&i>=0&&n[0].left>n[1].right)return n[i]||e;switch(t){case"top":case"bottom":var r=n[0],o=n[n.length-1],a="top"===t,s=r.top,p=o.bottom,u=a?r.left:o.left,c=a?r.right:o.right;return{top:s,bottom:p,left:u,right:c,width:c-u,height:p-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(t){return t.left}))),l=Math.max.apply(Math,n.map((function(t){return t.right}))),d=n.filter((function(e){return"left"===t?e.left===f:e.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return e}}(l(t),n.getBoundingClientRect(),d(n.getClientRects()),i)}(o.placement)}}),e=o.placement)}};function a(){var e;r||(e=function(t,e){var n;return{popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat(((null==(n=t.popperOptions)?void 0:n.modifiers)||[]).filter((function(t){return t.name!==e.name})),[e])})}}(t.props,o),r=!0,t.setProps(e),r=!1)}return{onCreate:a,onAfterUpdate:a,onTrigger:function(e,n){if(g(n)){var r=d(t.reference.getClientRects()),o=r.find((function(t){return t.left-2<=n.clientX&&t.right+2>=n.clientX&&t.top-2<=n.clientY&&t.bottom+2>=n.clientY}));i=r.indexOf(o)}},onUntrigger:function(){i=-1}}}};var W={name:"sticky",defaultValue:!1,fn:function(t){var e=t.reference,n=t.popper;function i(e){return!0===t.props.sticky||t.props.sticky===e}var r=null,o=null;function a(){var s=i("reference")?(t.popperInstance?t.popperInstance.state.elements.reference:e).getBoundingClientRect():null,p=i("popper")?n.getBoundingClientRect():null;(s&&q(r,s)||p&&q(o,p))&&t.popperInstance&&t.popperInstance.update(),r=s,o=p,t.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){t.props.sticky&&a()}}}};function q(t,e){return!t||!e||(t.top!==e.top||t.right!==e.right||t.bottom!==e.bottom||t.left!==e.left)}return e&&function(t){var e=document.createElement("style");e.textContent=t,e.setAttribute("data-tippy-stylesheet","");var n=document.head,i=document.querySelector("head>style,head>link");i?n.insertBefore(e,i):n.appendChild(e)}('.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}'),X.setDefaultProps({plugins:[_,z,F,W],render:S}),X.createSingleton=function(t,e){void 0===e&&(e={});var n,i=t,r=[],o=e.overrides;function a(){r=i.map((function(t){return t.reference}))}function s(t){i.forEach((function(e){t?e.enable():e.disable()}))}s(!1),a();var p={fn:function(){return{onDestroy:function(){s(!0)},onTrigger:function(t,e){var a=e.currentTarget,s=r.indexOf(a);if(a!==n){n=a;var p=(o||[]).concat("content").reduce((function(t,e){return t[e]=i[s].props[e],t}),{});t.setProps(Object.assign({},p,{getReferenceClientRect:function(){return a.getBoundingClientRect()}}))}}}}},c=X(v(),Object.assign({},u(e,["overrides"]),{plugins:[p].concat(e.plugins||[]),triggerTarget:r})),f=c.setProps;return c.setProps=function(t){o=t.overrides||o,f(t)},c.setInstances=function(t){s(!0),i=t,s(!1),a(),c.setProps({triggerTarget:r})},c},X.delegate=function(t,e){var n=[],i=[],r=e.target,o=u(e,["target"]),a=Object.assign({},o,{trigger:"manual",touch:!1}),s=Object.assign({},o,{showOnCreate:!0}),p=X(t,a);function f(t){if(t.target){var n=t.target.closest(r);if(n){var o=n.getAttribute("data-tippy-trigger")||e.trigger||D.trigger;if(!n._tippy&&!("touchstart"===t.type&&"boolean"==typeof s.touch||"touchstart"!==t.type&&o.indexOf(Y[t.type]))){var a=X(n,s);a&&(i=i.concat(a))}}}}function l(t,e,i,r){void 0===r&&(r=!1),t.addEventListener(e,i,r),n.push({node:t,eventType:e,handler:i,options:r})}return c(p).forEach((function(t){var e=t.destroy;t.destroy=function(t){void 0===t&&(t=!0),t&&i.forEach((function(t){t.destroy()})),i=[],n.forEach((function(t){var e=t.node,n=t.eventType,i=t.handler,r=t.options;e.removeEventListener(n,i,r)})),n=[],e()},function(t){var e=t.reference;l(e,"touchstart",f),l(e,"mouseover",f),l(e,"focusin",f),l(e,"click",f)}(t)})),p},X.hideAll=function(t){var e=void 0===t?{}:t,n=e.exclude,i=e.duration;U.forEach((function(t){var e=!1;if(n&&(e=h(n)?t.reference===n:t.popper===n.popper),!e){var r=t.props.duration;t.setProps({duration:i}),t.hide(),t.state.isDestroyed||t.setProps({duration:r})}}))},X.roundArrow='',X})); +//# sourceMappingURL=tippy-bundle.umd.min.js.map diff --git a/community_server/webroot/js/userSearch.js b/community_server/webroot/js/userSearch.js new file mode 100644 index 000000000..4ad04ec57 --- /dev/null +++ b/community_server/webroot/js/userSearch.js @@ -0,0 +1,9151 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],2:[function(require,module,exports){ +(function (setImmediate,clearImmediate){ +var nextTick = require('process/browser.js').nextTick; +var apply = Function.prototype.apply; +var slice = Array.prototype.slice; +var immediateIds = {}; +var nextImmediateId = 0; + +// DOM APIs, for completeness + +exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); +}; +exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); +}; +exports.clearTimeout = +exports.clearInterval = function(timeout) { timeout.close(); }; + +function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; +} +Timeout.prototype.unref = Timeout.prototype.ref = function() {}; +Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); +}; + +// Does not start the time, just sets up the members needed. +exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; +}; + +exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; +}; + +exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } +}; + +// That's not how node.js implements it but the exposed api is the same. +exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; +}; + +exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; +}; +}).call(this,require("timers").setImmediate,require("timers").clearImmediate) +},{"process/browser.js":1,"timers":2}],3:[function(require,module,exports){ +(function (global,setImmediate){ +new function() { + +function Vnode(tag, key, attrs0, children, text, dom) { + return {tag: tag, key: key, attrs: attrs0, children: children, text: text, dom: dom, domSize: undefined, state: {}, events: undefined, instance: undefined, skip: false} +} +Vnode.normalize = function(node) { + if (Array.isArray(node)) return Vnode("[", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined) + if (node != null && typeof node !== "object") return Vnode("#", undefined, undefined, node === false ? "" : node, undefined, undefined) + return node +} +Vnode.normalizeChildren = function normalizeChildren(children) { + for (var i = 0; i < children.length; i++) { + children[i] = Vnode.normalize(children[i]) + } + return children +} +var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g +var selectorCache = {} +function hyperscript(selector) { + if (selector == null || typeof selector !== "string" && typeof selector.view !== "function") { + throw Error("The selector must be either a string or a component."); + } + if (typeof selector === "string" && selectorCache[selector] === undefined) { + var match, tag, classes = [], attributes = {} + while (match = selectorParser.exec(selector)) { + var type = match[1], value = match[2] + if (type === "" && value !== "") tag = value + else if (type === "#") attributes.id = value + else if (type === ".") classes.push(value) + else if (match[3][0] === "[") { + var attrValue = match[6] + if (attrValue) attrValue = attrValue.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\") + if (match[4] === "class") classes.push(attrValue) + else attributes[match[4]] = attrValue || true + } + } + if (classes.length > 0) attributes.className = classes.join(" ") + selectorCache[selector] = function(attrs, children) { + var hasAttrs = false, childList, text + var className = attrs.className || attrs.class + for (var key in attributes) attrs[key] = attributes[key] + if (className !== undefined) { + if (attrs.class !== undefined) { + attrs.class = undefined + attrs.className = className + } + if (attributes.className !== undefined) attrs.className = attributes.className + " " + className + } + for (var key in attrs) { + if (key !== "key") { + hasAttrs = true + break + } + } + if (Array.isArray(children) && children.length == 1 && children[0] != null && children[0].tag === "#") text = children[0].children + else childList = children + return Vnode(tag || "div", attrs.key, hasAttrs ? attrs : undefined, childList, text, undefined) + } + } + var attrs, children, childrenIndex + if (arguments[1] == null || typeof arguments[1] === "object" && arguments[1].tag === undefined && !Array.isArray(arguments[1])) { + attrs = arguments[1] + childrenIndex = 2 + } + else childrenIndex = 1 + if (arguments.length === childrenIndex + 1) { + children = Array.isArray(arguments[childrenIndex]) ? arguments[childrenIndex] : [arguments[childrenIndex]] + } + else { + children = [] + for (var i = childrenIndex; i < arguments.length; i++) children.push(arguments[i]) + } + if (typeof selector === "string") return selectorCache[selector](attrs || {}, Vnode.normalizeChildren(children)) + return Vnode(selector, attrs && attrs.key, attrs || {}, Vnode.normalizeChildren(children), undefined, undefined) +} +hyperscript.trust = function(html) { + if (html == null) html = "" + return Vnode("<", undefined, undefined, html, undefined, undefined) +} +hyperscript.fragment = function(attrs1, children) { + return Vnode("[", attrs1.key, attrs1, Vnode.normalizeChildren(children), undefined, undefined) +} +var m = hyperscript +/** @constructor */ +var PromisePolyfill = function(executor) { + if (!(this instanceof PromisePolyfill)) throw new Error("Promise must be called with `new`") + if (typeof executor !== "function") throw new TypeError("executor must be a function") + var self = this, resolvers = [], rejectors = [], resolveCurrent = handler(resolvers, true), rejectCurrent = handler(rejectors, false) + var instance = self._instance = {resolvers: resolvers, rejectors: rejectors} + var callAsync = typeof setImmediate === "function" ? setImmediate : setTimeout + function handler(list, shouldAbsorb) { + return function execute(value) { + var then + try { + if (shouldAbsorb && value != null && (typeof value === "object" || typeof value === "function") && typeof (then = value.then) === "function") { + if (value === self) throw new TypeError("Promise can't be resolved w/ itself") + executeOnce(then.bind(value)) + } + else { + callAsync(function() { + if (!shouldAbsorb && list.length === 0) console.error("Possible unhandled promise rejection:", value) + for (var i = 0; i < list.length; i++) list[i](value) + resolvers.length = 0, rejectors.length = 0 + instance.state = shouldAbsorb + instance.retry = function() {execute(value)} + }) + } + } + catch (e) { + rejectCurrent(e) + } + } + } + function executeOnce(then) { + var runs = 0 + function run(fn) { + return function(value) { + if (runs++ > 0) return + fn(value) + } + } + var onerror = run(rejectCurrent) + try {then(run(resolveCurrent), onerror)} catch (e) {onerror(e)} + } + executeOnce(executor) +} +PromisePolyfill.prototype.then = function(onFulfilled, onRejection) { + var self = this, instance = self._instance + function handle(callback, list, next, state) { + list.push(function(value) { + if (typeof callback !== "function") next(value) + else try {resolveNext(callback(value))} catch (e) {if (rejectNext) rejectNext(e)} + }) + if (typeof instance.retry === "function" && state === instance.state) instance.retry() + } + var resolveNext, rejectNext + var promise = new PromisePolyfill(function(resolve, reject) {resolveNext = resolve, rejectNext = reject}) + handle(onFulfilled, instance.resolvers, resolveNext, true), handle(onRejection, instance.rejectors, rejectNext, false) + return promise +} +PromisePolyfill.prototype.catch = function(onRejection) { + return this.then(null, onRejection) +} +PromisePolyfill.resolve = function(value) { + if (value instanceof PromisePolyfill) return value + return new PromisePolyfill(function(resolve) {resolve(value)}) +} +PromisePolyfill.reject = function(value) { + return new PromisePolyfill(function(resolve, reject) {reject(value)}) +} +PromisePolyfill.all = function(list) { + return new PromisePolyfill(function(resolve, reject) { + var total = list.length, count = 0, values = [] + if (list.length === 0) resolve([]) + else for (var i = 0; i < list.length; i++) { + (function(i) { + function consume(value) { + count++ + values[i] = value + if (count === total) resolve(values) + } + if (list[i] != null && (typeof list[i] === "object" || typeof list[i] === "function") && typeof list[i].then === "function") { + list[i].then(consume, reject) + } + else consume(list[i]) + })(i) + } + }) +} +PromisePolyfill.race = function(list) { + return new PromisePolyfill(function(resolve, reject) { + for (var i = 0; i < list.length; i++) { + list[i].then(resolve, reject) + } + }) +} +if (typeof window !== "undefined") { + if (typeof window.Promise === "undefined") window.Promise = PromisePolyfill + var PromisePolyfill = window.Promise +} else if (typeof global !== "undefined") { + if (typeof global.Promise === "undefined") global.Promise = PromisePolyfill + var PromisePolyfill = global.Promise +} else { +} +var buildQueryString = function(object) { + if (Object.prototype.toString.call(object) !== "[object Object]") return "" + var args = [] + for (var key0 in object) { + destructure(key0, object[key0]) + } + return args.join("&") + function destructure(key0, value) { + if (Array.isArray(value)) { + for (var i = 0; i < value.length; i++) { + destructure(key0 + "[" + i + "]", value[i]) + } + } + else if (Object.prototype.toString.call(value) === "[object Object]") { + for (var i in value) { + destructure(key0 + "[" + i + "]", value[i]) + } + } + else args.push(encodeURIComponent(key0) + (value != null && value !== "" ? "=" + encodeURIComponent(value) : "")) + } +} +var _8 = function($window, Promise) { + var callbackCount = 0 + var oncompletion + function setCompletionCallback(callback) {oncompletion = callback} + function finalizer() { + var count = 0 + function complete() {if (--count === 0 && typeof oncompletion === "function") oncompletion()} + return function finalize(promise0) { + var then0 = promise0.then + promise0.then = function() { + count++ + var next = then0.apply(promise0, arguments) + next.then(complete, function(e) { + complete() + if (count === 0) throw e + }) + return finalize(next) + } + return promise0 + } + } + function normalize(args, extra) { + if (typeof args === "string") { + var url = args + args = extra || {} + if (args.url == null) args.url = url + } + return args + } + function request(args, extra) { + var finalize = finalizer() + args = normalize(args, extra) + var promise0 = new Promise(function(resolve, reject) { + if (args.method == null) args.method = "GET" + args.method = args.method.toUpperCase() + var useBody = typeof args.useBody === "boolean" ? args.useBody : args.method !== "GET" && args.method !== "TRACE" + if (typeof args.serialize !== "function") args.serialize = typeof FormData !== "undefined" && args.data instanceof FormData ? function(value) {return value} : JSON.stringify + if (typeof args.deserialize !== "function") args.deserialize = deserialize + if (typeof args.extract !== "function") args.extract = extract + args.url = interpolate(args.url, args.data) + if (useBody) args.data = args.serialize(args.data) + else args.url = assemble(args.url, args.data) + var xhr = new $window.XMLHttpRequest() + xhr.open(args.method, args.url, typeof args.async === "boolean" ? args.async : true, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined) + if (args.serialize === JSON.stringify && useBody) { + xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8") + } + if (args.deserialize === deserialize) { + xhr.setRequestHeader("Accept", "application/json, text/*") + } + if (args.withCredentials) xhr.withCredentials = args.withCredentials + for (var key in args.headers) if ({}.hasOwnProperty.call(args.headers, key)) { + xhr.setRequestHeader(key, args.headers[key]) + } + if (typeof args.config === "function") xhr = args.config(xhr, args) || xhr + xhr.onreadystatechange = function() { + // Don't throw errors on xhr.abort(). XMLHttpRequests ends up in a state of + // xhr.status == 0 and xhr.readyState == 4 if aborted after open, but before completion. + if (xhr.status && xhr.readyState === 4) { + try { + var response = (args.extract !== extract) ? args.extract(xhr, args) : args.deserialize(args.extract(xhr, args)) + if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) { + resolve(cast(args.type, response)) + } + else { + var error = new Error(xhr.responseText) + for (var key in response) error[key] = response[key] + reject(error) + } + } + catch (e) { + reject(e) + } + } + } + if (useBody && (args.data != null)) xhr.send(args.data) + else xhr.send() + }) + return args.background === true ? promise0 : finalize(promise0) + } + function jsonp(args, extra) { + var finalize = finalizer() + args = normalize(args, extra) + var promise0 = new Promise(function(resolve, reject) { + var callbackName = args.callbackName || "_mithril_" + Math.round(Math.random() * 1e16) + "_" + callbackCount++ + var script = $window.document.createElement("script") + $window[callbackName] = function(data) { + script.parentNode.removeChild(script) + resolve(cast(args.type, data)) + delete $window[callbackName] + } + script.onerror = function() { + script.parentNode.removeChild(script) + reject(new Error("JSONP request failed")) + delete $window[callbackName] + } + if (args.data == null) args.data = {} + args.url = interpolate(args.url, args.data) + args.data[args.callbackKey || "callback"] = callbackName + script.src = assemble(args.url, args.data) + $window.document.documentElement.appendChild(script) + }) + return args.background === true? promise0 : finalize(promise0) + } + function interpolate(url, data) { + if (data == null) return url + var tokens = url.match(/:[^\/]+/gi) || [] + for (var i = 0; i < tokens.length; i++) { + var key = tokens[i].slice(1) + if (data[key] != null) { + url = url.replace(tokens[i], data[key]) + } + } + return url + } + function assemble(url, data) { + var querystring = buildQueryString(data) + if (querystring !== "") { + var prefix = url.indexOf("?") < 0 ? "?" : "&" + url += prefix + querystring + } + return url + } + function deserialize(data) { + try {return data !== "" ? JSON.parse(data) : null} + catch (e) {throw new Error(data)} + } + function extract(xhr) {return xhr.responseText} + function cast(type0, data) { + if (typeof type0 === "function") { + if (Array.isArray(data)) { + for (var i = 0; i < data.length; i++) { + data[i] = new type0(data[i]) + } + } + else return new type0(data) + } + return data + } + return {request: request, jsonp: jsonp, setCompletionCallback: setCompletionCallback} +} +var requestService = _8(window, PromisePolyfill) +var coreRenderer = function($window) { + var $doc = $window.document + var $emptyFragment = $doc.createDocumentFragment() + var onevent + function setEventCallback(callback) {return onevent = callback} + //create + function createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) { + for (var i = start; i < end; i++) { + var vnode = vnodes[i] + if (vnode != null) { + insertNode(parent, createNode(vnode, hooks, ns), nextSibling) + } + } + } + function createNode(vnode, hooks, ns) { + var tag = vnode.tag + if (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks) + if (typeof tag === "string") { + switch (tag) { + case "#": return createText(vnode) + case "<": return createHTML(vnode) + case "[": return createFragment(vnode, hooks, ns) + default: return createElement(vnode, hooks, ns) + } + } + else return createComponent(vnode, hooks, ns) + } + function createText(vnode) { + return vnode.dom = $doc.createTextNode(vnode.children) + } + function createHTML(vnode) { + var match1 = vnode.children.match(/^\s*?<(\w+)/im) || [] + var parent = {caption: "table", thead: "table", tbody: "table", tfoot: "table", tr: "tbody", th: "tr", td: "tr", colgroup: "table", col: "colgroup"}[match1[1]] || "div" + var temp = $doc.createElement(parent) + temp.innerHTML = vnode.children + vnode.dom = temp.firstChild + vnode.domSize = temp.childNodes.length + var fragment = $doc.createDocumentFragment() + var child + while (child = temp.firstChild) { + fragment.appendChild(child) + } + return fragment + } + function createFragment(vnode, hooks, ns) { + var fragment = $doc.createDocumentFragment() + if (vnode.children != null) { + var children = vnode.children + createNodes(fragment, children, 0, children.length, hooks, null, ns) + } + vnode.dom = fragment.firstChild + vnode.domSize = fragment.childNodes.length + return fragment + } + function createElement(vnode, hooks, ns) { + var tag = vnode.tag + switch (vnode.tag) { + case "svg": ns = "http://www.w3.org/2000/svg"; break + case "math": ns = "http://www.w3.org/1998/Math/MathML"; break + } + var attrs2 = vnode.attrs + var is = attrs2 && attrs2.is + var element = ns ? + is ? $doc.createElementNS(ns, tag, {is: is}) : $doc.createElementNS(ns, tag) : + is ? $doc.createElement(tag, {is: is}) : $doc.createElement(tag) + vnode.dom = element + if (attrs2 != null) { + setAttrs(vnode, attrs2, ns) + } + if (vnode.attrs != null && vnode.attrs.contenteditable != null) { + setContentEditable(vnode) + } + else { + if (vnode.text != null) { + if (vnode.text !== "") element.textContent = vnode.text + else vnode.children = [Vnode("#", undefined, undefined, vnode.text, undefined, undefined)] + } + if (vnode.children != null) { + var children = vnode.children + createNodes(element, children, 0, children.length, hooks, null, ns) + setLateAttrs(vnode) + } + } + return element + } + function createComponent(vnode, hooks, ns) { + vnode.state = Object.create(vnode.tag) + var view = vnode.tag.view + if (view.reentrantLock != null) return $emptyFragment + view.reentrantLock = true + initLifecycle(vnode.tag, vnode, hooks) + vnode.instance = Vnode.normalize(view.call(vnode.state, vnode)) + view.reentrantLock = null + if (vnode.instance != null) { + if (vnode.instance === vnode) throw Error("A view cannot return the vnode it received as arguments") + var element = createNode(vnode.instance, hooks, ns) + vnode.dom = vnode.instance.dom + vnode.domSize = vnode.dom != null ? vnode.instance.domSize : 0 + return element + } + else { + vnode.domSize = 0 + return $emptyFragment + } + } + //update + function updateNodes(parent, old, vnodes, hooks, nextSibling, ns) { + if (old === vnodes || old == null && vnodes == null) return + else if (old == null) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, undefined) + else if (vnodes == null) removeNodes(old, 0, old.length, vnodes) + else { + if (old.length === vnodes.length) { + var isUnkeyed = false + for (var i = 0; i < vnodes.length; i++) { + if (vnodes[i] != null && old[i] != null) { + isUnkeyed = vnodes[i].key == null && old[i].key == null + break + } + } + if (isUnkeyed) { + for (var i = 0; i < old.length; i++) { + if (old[i] === vnodes[i]) continue + else if (old[i] == null && vnodes[i] != null) insertNode(parent, createNode(vnodes[i], hooks, ns), getNextSibling(old, i + 1, nextSibling)) + else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes) + else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), false, ns) + } + return + } + } + var recycling = isRecyclable(old, vnodes) + if (recycling) old = old.concat(old.pool) + var oldStart = 0, start = 0, oldEnd = old.length - 1, end = vnodes.length - 1, map + while (oldEnd >= oldStart && end >= start) { + var o = old[oldStart], v = vnodes[start] + if (o === v && !recycling) oldStart++, start++ + else if (o == null) oldStart++ + else if (v == null) start++ + else if (o.key === v.key) { + oldStart++, start++ + updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), recycling, ns) + if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling) + } + else { + var o = old[oldEnd] + if (o === v && !recycling) oldEnd--, start++ + else if (o == null) oldEnd-- + else if (v == null) start++ + else if (o.key === v.key) { + updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) + if (recycling || start < end) insertNode(parent, toFragment(o), getNextSibling(old, oldStart, nextSibling)) + oldEnd--, start++ + } + else break + } + } + while (oldEnd >= oldStart && end >= start) { + var o = old[oldEnd], v = vnodes[end] + if (o === v && !recycling) oldEnd--, end-- + else if (o == null) oldEnd-- + else if (v == null) end-- + else if (o.key === v.key) { + updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) + if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling) + if (o.dom != null) nextSibling = o.dom + oldEnd--, end-- + } + else { + if (!map) map = getKeyMap(old, oldEnd) + if (v != null) { + var oldIndex = map[v.key] + if (oldIndex != null) { + var movable = old[oldIndex] + updateNode(parent, movable, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) + insertNode(parent, toFragment(movable), nextSibling) + old[oldIndex].skip = true + if (movable.dom != null) nextSibling = movable.dom + } + else { + var dom = createNode(v, hooks, undefined) + insertNode(parent, dom, nextSibling) + nextSibling = dom + } + } + end-- + } + if (end < start) break + } + createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns) + removeNodes(old, oldStart, oldEnd + 1, vnodes) + } + } + function updateNode(parent, old, vnode, hooks, nextSibling, recycling, ns) { + var oldTag = old.tag, tag = vnode.tag + if (oldTag === tag) { + vnode.state = old.state + vnode.events = old.events + if (shouldUpdate(vnode, old)) return + if (vnode.attrs != null) { + updateLifecycle(vnode.attrs, vnode, hooks, recycling) + } + if (typeof oldTag === "string") { + switch (oldTag) { + case "#": updateText(old, vnode); break + case "<": updateHTML(parent, old, vnode, nextSibling); break + case "[": updateFragment(parent, old, vnode, hooks, nextSibling, ns); break + default: updateElement(old, vnode, hooks, ns) + } + } + else updateComponent(parent, old, vnode, hooks, nextSibling, recycling, ns) + } + else { + removeNode(old, null) + insertNode(parent, createNode(vnode, hooks, ns), nextSibling) + } + } + function updateText(old, vnode) { + if (old.children.toString() !== vnode.children.toString()) { + old.dom.nodeValue = vnode.children + } + vnode.dom = old.dom + } + function updateHTML(parent, old, vnode, nextSibling) { + if (old.children !== vnode.children) { + toFragment(old) + insertNode(parent, createHTML(vnode), nextSibling) + } + else vnode.dom = old.dom, vnode.domSize = old.domSize + } + function updateFragment(parent, old, vnode, hooks, nextSibling, ns) { + updateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns) + var domSize = 0, children = vnode.children + vnode.dom = null + if (children != null) { + for (var i = 0; i < children.length; i++) { + var child = children[i] + if (child != null && child.dom != null) { + if (vnode.dom == null) vnode.dom = child.dom + domSize += child.domSize || 1 + } + } + if (domSize !== 1) vnode.domSize = domSize + } + } + function updateElement(old, vnode, hooks, ns) { + var element = vnode.dom = old.dom + switch (vnode.tag) { + case "svg": ns = "http://www.w3.org/2000/svg"; break + case "math": ns = "http://www.w3.org/1998/Math/MathML"; break + } + if (vnode.tag === "textarea") { + if (vnode.attrs == null) vnode.attrs = {} + if (vnode.text != null) { + vnode.attrs.value = vnode.text //FIXME handle0 multiple children + vnode.text = undefined + } + } + updateAttrs(vnode, old.attrs, vnode.attrs, ns) + if (vnode.attrs != null && vnode.attrs.contenteditable != null) { + setContentEditable(vnode) + } + else if (old.text != null && vnode.text != null && vnode.text !== "") { + if (old.text.toString() !== vnode.text.toString()) old.dom.firstChild.nodeValue = vnode.text + } + else { + if (old.text != null) old.children = [Vnode("#", undefined, undefined, old.text, undefined, old.dom.firstChild)] + if (vnode.text != null) vnode.children = [Vnode("#", undefined, undefined, vnode.text, undefined, undefined)] + updateNodes(element, old.children, vnode.children, hooks, null, ns) + } + } + function updateComponent(parent, old, vnode, hooks, nextSibling, recycling, ns) { + vnode.instance = Vnode.normalize(vnode.tag.view.call(vnode.state, vnode)) + updateLifecycle(vnode.tag, vnode, hooks, recycling) + if (vnode.instance != null) { + if (old.instance == null) insertNode(parent, createNode(vnode.instance, hooks, ns), nextSibling) + else updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, recycling, ns) + vnode.dom = vnode.instance.dom + vnode.domSize = vnode.instance.domSize + } + else if (old.instance != null) { + removeNode(old.instance, null) + vnode.dom = undefined + vnode.domSize = 0 + } + else { + vnode.dom = old.dom + vnode.domSize = old.domSize + } + } + function isRecyclable(old, vnodes) { + if (old.pool != null && Math.abs(old.pool.length - vnodes.length) <= Math.abs(old.length - vnodes.length)) { + var oldChildrenLength = old[0] && old[0].children && old[0].children.length || 0 + var poolChildrenLength = old.pool[0] && old.pool[0].children && old.pool[0].children.length || 0 + var vnodesChildrenLength = vnodes[0] && vnodes[0].children && vnodes[0].children.length || 0 + if (Math.abs(poolChildrenLength - vnodesChildrenLength) <= Math.abs(oldChildrenLength - vnodesChildrenLength)) { + return true + } + } + return false + } + function getKeyMap(vnodes, end) { + var map = {}, i = 0 + for (var i = 0; i < end; i++) { + var vnode = vnodes[i] + if (vnode != null) { + var key2 = vnode.key + if (key2 != null) map[key2] = i + } + } + return map + } + function toFragment(vnode) { + var count0 = vnode.domSize + if (count0 != null || vnode.dom == null) { + var fragment = $doc.createDocumentFragment() + if (count0 > 0) { + var dom = vnode.dom + while (--count0) fragment.appendChild(dom.nextSibling) + fragment.insertBefore(dom, fragment.firstChild) + } + return fragment + } + else return vnode.dom + } + function getNextSibling(vnodes, i, nextSibling) { + for (; i < vnodes.length; i++) { + if (vnodes[i] != null && vnodes[i].dom != null) return vnodes[i].dom + } + return nextSibling + } + function insertNode(parent, dom, nextSibling) { + if (nextSibling && nextSibling.parentNode) parent.insertBefore(dom, nextSibling) + else parent.appendChild(dom) + } + function setContentEditable(vnode) { + var children = vnode.children + if (children != null && children.length === 1 && children[0].tag === "<") { + var content = children[0].children + if (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content + } + else if (vnode.text != null || children != null && children.length !== 0) throw new Error("Child node of a contenteditable must be trusted") + } + //remove + function removeNodes(vnodes, start, end, context) { + for (var i = start; i < end; i++) { + var vnode = vnodes[i] + if (vnode != null) { + if (vnode.skip) vnode.skip = false + else removeNode(vnode, context) + } + } + } + function removeNode(vnode, context) { + var expected = 1, called = 0 + if (vnode.attrs && vnode.attrs.onbeforeremove) { + var result = vnode.attrs.onbeforeremove.call(vnode.state, vnode) + if (result != null && typeof result.then === "function") { + expected++ + result.then(continuation, continuation) + } + } + if (typeof vnode.tag !== "string" && vnode.tag.onbeforeremove) { + var result = vnode.tag.onbeforeremove.call(vnode.state, vnode) + if (result != null && typeof result.then === "function") { + expected++ + result.then(continuation, continuation) + } + } + continuation() + function continuation() { + if (++called === expected) { + onremove(vnode) + if (vnode.dom) { + var count0 = vnode.domSize || 1 + if (count0 > 1) { + var dom = vnode.dom + while (--count0) { + removeNodeFromDOM(dom.nextSibling) + } + } + removeNodeFromDOM(vnode.dom) + if (context != null && vnode.domSize == null && !hasIntegrationMethods(vnode.attrs) && typeof vnode.tag === "string") { //TODO test custom elements + if (!context.pool) context.pool = [vnode] + else context.pool.push(vnode) + } + } + } + } + } + function removeNodeFromDOM(node) { + var parent = node.parentNode + if (parent != null) parent.removeChild(node) + } + function onremove(vnode) { + if (vnode.attrs && vnode.attrs.onremove) vnode.attrs.onremove.call(vnode.state, vnode) + if (typeof vnode.tag !== "string" && vnode.tag.onremove) vnode.tag.onremove.call(vnode.state, vnode) + if (vnode.instance != null) onremove(vnode.instance) + else { + var children = vnode.children + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + var child = children[i] + if (child != null) onremove(child) + } + } + } + } + //attrs2 + function setAttrs(vnode, attrs2, ns) { + for (var key2 in attrs2) { + setAttr(vnode, key2, null, attrs2[key2], ns) + } + } + function setAttr(vnode, key2, old, value, ns) { + var element = vnode.dom + if (key2 === "key" || key2 === "is" || (old === value && !isFormAttribute(vnode, key2)) && typeof value !== "object" || typeof value === "undefined" || isLifecycleMethod(key2)) return + var nsLastIndex = key2.indexOf(":") + if (nsLastIndex > -1 && key2.substr(0, nsLastIndex) === "xlink") { + element.setAttributeNS("http://www.w3.org/1999/xlink", key2.slice(nsLastIndex + 1), value) + } + else if (key2[0] === "o" && key2[1] === "n" && typeof value === "function") updateEvent(vnode, key2, value) + else if (key2 === "style") updateStyle(element, old, value) + else if (key2 in element && !isAttribute(key2) && ns === undefined && !isCustomElement(vnode)) { + //setting input[value] to same value by typing on focused element moves cursor to end in Chrome + if (vnode.tag === "input" && key2 === "value" && vnode.dom.value === value && vnode.dom === $doc.activeElement) return + //setting select[value] to same value while having select open blinks select dropdown in Chrome + if (vnode.tag === "select" && key2 === "value" && vnode.dom.value === value && vnode.dom === $doc.activeElement) return + //setting option[value] to same value while having select open blinks select dropdown in Chrome + if (vnode.tag === "option" && key2 === "value" && vnode.dom.value === value) return + element[key2] = value + } + else { + if (typeof value === "boolean") { + if (value) element.setAttribute(key2, "") + else element.removeAttribute(key2) + } + else element.setAttribute(key2 === "className" ? "class" : key2, value) + } + } + function setLateAttrs(vnode) { + var attrs2 = vnode.attrs + if (vnode.tag === "select" && attrs2 != null) { + if ("value" in attrs2) setAttr(vnode, "value", null, attrs2.value, undefined) + if ("selectedIndex" in attrs2) setAttr(vnode, "selectedIndex", null, attrs2.selectedIndex, undefined) + } + } + function updateAttrs(vnode, old, attrs2, ns) { + if (attrs2 != null) { + for (var key2 in attrs2) { + setAttr(vnode, key2, old && old[key2], attrs2[key2], ns) + } + } + if (old != null) { + for (var key2 in old) { + if (attrs2 == null || !(key2 in attrs2)) { + if (key2 === "className") key2 = "class" + if (key2[0] === "o" && key2[1] === "n" && !isLifecycleMethod(key2)) updateEvent(vnode, key2, undefined) + else if (key2 !== "key") vnode.dom.removeAttribute(key2) + } + } + } + } + function isFormAttribute(vnode, attr) { + return attr === "value" || attr === "checked" || attr === "selectedIndex" || attr === "selected" && vnode.dom === $doc.activeElement + } + function isLifecycleMethod(attr) { + return attr === "oninit" || attr === "oncreate" || attr === "onupdate" || attr === "onremove" || attr === "onbeforeremove" || attr === "onbeforeupdate" + } + function isAttribute(attr) { + return attr === "href" || attr === "list" || attr === "form" || attr === "width" || attr === "height"// || attr === "type" + } + function isCustomElement(vnode){ + return vnode.attrs.is || vnode.tag.indexOf("-") > -1 + } + function hasIntegrationMethods(source) { + return source != null && (source.oncreate || source.onupdate || source.onbeforeremove || source.onremove) + } + //style + function updateStyle(element, old, style) { + if (old === style) element.style.cssText = "", old = null + if (style == null) element.style.cssText = "" + else if (typeof style === "string") element.style.cssText = style + else { + if (typeof old === "string") element.style.cssText = "" + for (var key2 in style) { + element.style[key2] = style[key2] + } + if (old != null && typeof old !== "string") { + for (var key2 in old) { + if (!(key2 in style)) element.style[key2] = "" + } + } + } + } + //event + function updateEvent(vnode, key2, value) { + var element = vnode.dom + var callback = typeof onevent !== "function" ? value : function(e) { + var result = value.call(element, e) + onevent.call(element, e) + return result + } + if (key2 in element) element[key2] = typeof value === "function" ? callback : null + else { + var eventName = key2.slice(2) + if (vnode.events === undefined) vnode.events = {} + if (vnode.events[key2] === callback) return + if (vnode.events[key2] != null) element.removeEventListener(eventName, vnode.events[key2], false) + if (typeof value === "function") { + vnode.events[key2] = callback + element.addEventListener(eventName, vnode.events[key2], false) + } + } + } + //lifecycle + function initLifecycle(source, vnode, hooks) { + if (typeof source.oninit === "function") source.oninit.call(vnode.state, vnode) + if (typeof source.oncreate === "function") hooks.push(source.oncreate.bind(vnode.state, vnode)) + } + function updateLifecycle(source, vnode, hooks, recycling) { + if (recycling) initLifecycle(source, vnode, hooks) + else if (typeof source.onupdate === "function") hooks.push(source.onupdate.bind(vnode.state, vnode)) + } + function shouldUpdate(vnode, old) { + var forceVnodeUpdate, forceComponentUpdate + if (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === "function") forceVnodeUpdate = vnode.attrs.onbeforeupdate.call(vnode.state, vnode, old) + if (typeof vnode.tag !== "string" && typeof vnode.tag.onbeforeupdate === "function") forceComponentUpdate = vnode.tag.onbeforeupdate.call(vnode.state, vnode, old) + if (!(forceVnodeUpdate === undefined && forceComponentUpdate === undefined) && !forceVnodeUpdate && !forceComponentUpdate) { + vnode.dom = old.dom + vnode.domSize = old.domSize + vnode.instance = old.instance + return true + } + return false + } + function render(dom, vnodes) { + if (!dom) throw new Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.") + var hooks = [] + var active = $doc.activeElement + // First time0 rendering into a node clears it out + if (dom.vnodes == null) dom.textContent = "" + if (!Array.isArray(vnodes)) vnodes = [vnodes] + updateNodes(dom, dom.vnodes, Vnode.normalizeChildren(vnodes), hooks, null, undefined) + dom.vnodes = vnodes + for (var i = 0; i < hooks.length; i++) hooks[i]() + if ($doc.activeElement !== active) active.focus() + } + return {render: render, setEventCallback: setEventCallback} +} +function throttle(callback) { + //60fps translates to 16.6ms, round it down since setTimeout requires int + var time = 16 + var last = 0, pending = null + var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout + return function() { + var now = Date.now() + if (last === 0 || now - last >= time) { + last = now + callback() + } + else if (pending === null) { + pending = timeout(function() { + pending = null + callback() + last = Date.now() + }, time - (now - last)) + } + } +} +var _11 = function($window) { + var renderService = coreRenderer($window) + renderService.setEventCallback(function(e) { + if (e.redraw !== false) redraw() + }) + + var callbacks = [] + function subscribe(key1, callback) { + unsubscribe(key1) + callbacks.push(key1, throttle(callback)) + } + function unsubscribe(key1) { + var index = callbacks.indexOf(key1) + if (index > -1) callbacks.splice(index, 2) + } + function redraw() { + for (var i = 1; i < callbacks.length; i += 2) { + callbacks[i]() + } + } + return {subscribe: subscribe, unsubscribe: unsubscribe, redraw: redraw, render: renderService.render} +} +var redrawService = _11(window) +requestService.setCompletionCallback(redrawService.redraw) +var _16 = function(redrawService0) { + return function(root, component) { + if (component === null) { + redrawService0.render(root, []) + redrawService0.unsubscribe(root) + return + } + + if (component.view == null) throw new Error("m.mount(element, component) expects a component, not a vnode") + + var run0 = function() { + redrawService0.render(root, Vnode(component)) + } + redrawService0.subscribe(root, run0) + redrawService0.redraw() + } +} +m.mount = _16(redrawService) +var Promise = PromisePolyfill +var parseQueryString = function(string) { + if (string === "" || string == null) return {} + if (string.charAt(0) === "?") string = string.slice(1) + var entries = string.split("&"), data0 = {}, counters = {} + for (var i = 0; i < entries.length; i++) { + var entry = entries[i].split("=") + var key5 = decodeURIComponent(entry[0]) + var value = entry.length === 2 ? decodeURIComponent(entry[1]) : "" + if (value === "true") value = true + else if (value === "false") value = false + var levels = key5.split(/\]\[?|\[/) + var cursor = data0 + if (key5.indexOf("[") > -1) levels.pop() + for (var j = 0; j < levels.length; j++) { + var level = levels[j], nextLevel = levels[j + 1] + var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10)) + var isValue = j === levels.length - 1 + if (level === "") { + var key5 = levels.slice(0, j).join() + if (counters[key5] == null) counters[key5] = 0 + level = counters[key5]++ + } + if (cursor[level] == null) { + cursor[level] = isValue ? value : isNumber ? [] : {} + } + cursor = cursor[level] + } + } + return data0 +} +var coreRouter = function($window) { + var supportsPushState = typeof $window.history.pushState === "function" + var callAsync0 = typeof setImmediate === "function" ? setImmediate : setTimeout + function normalize1(fragment0) { + var data = $window.location[fragment0].replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponent) + if (fragment0 === "pathname" && data[0] !== "/") data = "/" + data + return data + } + var asyncId + function debounceAsync(callback0) { + return function() { + if (asyncId != null) return + asyncId = callAsync0(function() { + asyncId = null + callback0() + }) + } + } + function parsePath(path, queryData, hashData) { + var queryIndex = path.indexOf("?") + var hashIndex = path.indexOf("#") + var pathEnd = queryIndex > -1 ? queryIndex : hashIndex > -1 ? hashIndex : path.length + if (queryIndex > -1) { + var queryEnd = hashIndex > -1 ? hashIndex : path.length + var queryParams = parseQueryString(path.slice(queryIndex + 1, queryEnd)) + for (var key4 in queryParams) queryData[key4] = queryParams[key4] + } + if (hashIndex > -1) { + var hashParams = parseQueryString(path.slice(hashIndex + 1)) + for (var key4 in hashParams) hashData[key4] = hashParams[key4] + } + return path.slice(0, pathEnd) + } + var router = {prefix: "#!"} + router.getPath = function() { + var type2 = router.prefix.charAt(0) + switch (type2) { + case "#": return normalize1("hash").slice(router.prefix.length) + case "?": return normalize1("search").slice(router.prefix.length) + normalize1("hash") + default: return normalize1("pathname").slice(router.prefix.length) + normalize1("search") + normalize1("hash") + } + } + router.setPath = function(path, data, options) { + var queryData = {}, hashData = {} + path = parsePath(path, queryData, hashData) + if (data != null) { + for (var key4 in data) queryData[key4] = data[key4] + path = path.replace(/:([^\/]+)/g, function(match2, token) { + delete queryData[token] + return data[token] + }) + } + var query = buildQueryString(queryData) + if (query) path += "?" + query + var hash = buildQueryString(hashData) + if (hash) path += "#" + hash + if (supportsPushState) { + var state = options ? options.state : null + var title = options ? options.title : null + $window.onpopstate() + if (options && options.replace) $window.history.replaceState(state, title, router.prefix + path) + else $window.history.pushState(state, title, router.prefix + path) + } + else $window.location.href = router.prefix + path + } + router.defineRoutes = function(routes, resolve, reject) { + function resolveRoute() { + var path = router.getPath() + var params = {} + var pathname = parsePath(path, params, params) + + var state = $window.history.state + if (state != null) { + for (var k in state) params[k] = state[k] + } + for (var route0 in routes) { + var matcher = new RegExp("^" + route0.replace(/:[^\/]+?\.{3}/g, "(.*?)").replace(/:[^\/]+/g, "([^\\/]+)") + "\/?$") + if (matcher.test(pathname)) { + pathname.replace(matcher, function() { + var keys = route0.match(/:[^\/]+/g) || [] + var values = [].slice.call(arguments, 1, -2) + for (var i = 0; i < keys.length; i++) { + params[keys[i].replace(/:|\./g, "")] = decodeURIComponent(values[i]) + } + resolve(routes[route0], params, path, route0) + }) + return + } + } + reject(path, params) + } + + if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute) + else if (router.prefix.charAt(0) === "#") $window.onhashchange = resolveRoute + resolveRoute() + } + + return router +} +var _20 = function($window, redrawService0) { + var routeService = coreRouter($window) + var identity = function(v) {return v} + var render1, component, attrs3, currentPath, lastUpdate + var route = function(root, defaultRoute, routes) { + if (root == null) throw new Error("Ensure the DOM element that was passed to `m.route` is not undefined") + var run1 = function() { + if (render1 != null) redrawService0.render(root, render1(Vnode(component, attrs3.key, attrs3))) + } + var bail = function() { + routeService.setPath(defaultRoute, null, {replace: true}) + } + routeService.defineRoutes(routes, function(payload, params, path) { + var update = lastUpdate = function(routeResolver, comp) { + if (update !== lastUpdate) return + component = comp != null && typeof comp.view === "function" ? comp : "div", attrs3 = params, currentPath = path, lastUpdate = null + render1 = (routeResolver.render || identity).bind(routeResolver) + run1() + } + if (payload.view) update({}, payload) + else { + if (payload.onmatch) { + Promise.resolve(payload.onmatch(params, path)).then(function(resolved) { + update(payload, resolved) + }, bail) + } + else update(payload, "div") + } + }, bail) + redrawService0.subscribe(root, run1) + } + route.set = function(path, data, options) { + if (lastUpdate != null) options = {replace: true} + lastUpdate = null + routeService.setPath(path, data, options) + } + route.get = function() {return currentPath} + route.prefix = function(prefix0) {routeService.prefix = prefix0} + route.link = function(vnode1) { + vnode1.dom.setAttribute("href", routeService.prefix + vnode1.attrs.href) + vnode1.dom.onclick = function(e) { + if (e.ctrlKey || e.metaKey || e.shiftKey || e.which === 2) return + e.preventDefault() + e.redraw = false + var href = this.getAttribute("href") + if (href.indexOf(routeService.prefix) === 0) href = href.slice(routeService.prefix.length) + route.set(href, undefined, undefined) + } + } + route.param = function(key3) { + if(typeof attrs3 !== "undefined" && typeof key3 !== "undefined") return attrs3[key3] + return attrs3 + } + return route +} +m.route = _20(window, redrawService) +m.withAttr = function(attrName, callback1, context) { + return function(e) { + callback1.call(context || this, attrName in e.currentTarget ? e.currentTarget[attrName] : e.currentTarget.getAttribute(attrName)) + } +} +var _28 = coreRenderer(window) +m.render = _28.render +m.redraw = redrawService.redraw +m.request = requestService.request +m.jsonp = requestService.jsonp +m.parseQueryString = parseQueryString +m.buildQueryString = buildQueryString +m.version = "1.0.0" +m.vnode = Vnode +if (typeof module !== "undefined") module["exports"] = m +else window.m = m +} +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate) +},{"timers":2}],4:[function(require,module,exports){ +/*! @preserve + * numeral.js + * version : 2.0.6 + * author : Adam Draper + * license : MIT + * http://adamwdraper.github.com/Numeral-js/ + */ + +(function (global, factory) { + if (typeof define === 'function' && define.amd) { + define(factory); + } else if (typeof module === 'object' && module.exports) { + module.exports = factory(); + } else { + global.numeral = factory(); + } +}(this, function () { + /************************************ + Variables + ************************************/ + + var numeral, + _, + VERSION = '2.0.6', + formats = {}, + locales = {}, + defaults = { + currentLocale: 'en', + zeroFormat: null, + nullFormat: null, + defaultFormat: '0,0', + scalePercentBy100: true + }, + options = { + currentLocale: defaults.currentLocale, + zeroFormat: defaults.zeroFormat, + nullFormat: defaults.nullFormat, + defaultFormat: defaults.defaultFormat, + scalePercentBy100: defaults.scalePercentBy100 + }; + + + /************************************ + Constructors + ************************************/ + + // Numeral prototype object + function Numeral(input, number) { + this._input = input; + + this._value = number; + } + + numeral = function(input) { + var value, + kind, + unformatFunction, + regexp; + + if (numeral.isNumeral(input)) { + value = input.value(); + } else if (input === 0 || typeof input === 'undefined') { + value = 0; + } else if (input === null || _.isNaN(input)) { + value = null; + } else if (typeof input === 'string') { + if (options.zeroFormat && input === options.zeroFormat) { + value = 0; + } else if (options.nullFormat && input === options.nullFormat || !input.replace(/[^0-9]+/g, '').length) { + value = null; + } else { + for (kind in formats) { + regexp = typeof formats[kind].regexps.unformat === 'function' ? formats[kind].regexps.unformat() : formats[kind].regexps.unformat; + + if (regexp && input.match(regexp)) { + unformatFunction = formats[kind].unformat; + + break; + } + } + + unformatFunction = unformatFunction || numeral._.stringToNumber; + + value = unformatFunction(input); + } + } else { + value = Number(input)|| null; + } + + return new Numeral(input, value); + }; + + // version number + numeral.version = VERSION; + + // compare numeral object + numeral.isNumeral = function(obj) { + return obj instanceof Numeral; + }; + + // helper functions + numeral._ = _ = { + // formats numbers separators, decimals places, signs, abbreviations + numberToFormat: function(value, format, roundingFunction) { + var locale = locales[numeral.options.currentLocale], + negP = false, + optDec = false, + leadingCount = 0, + abbr = '', + trillion = 1000000000000, + billion = 1000000000, + million = 1000000, + thousand = 1000, + decimal = '', + neg = false, + abbrForce, // force abbreviation + abs, + min, + max, + power, + int, + precision, + signed, + thousands, + output; + + // make sure we never format a null value + value = value || 0; + + abs = Math.abs(value); + + // see if we should use parentheses for negative number or if we should prefix with a sign + // if both are present we default to parentheses + if (numeral._.includes(format, '(')) { + negP = true; + format = format.replace(/[\(|\)]/g, ''); + } else if (numeral._.includes(format, '+') || numeral._.includes(format, '-')) { + signed = numeral._.includes(format, '+') ? format.indexOf('+') : value < 0 ? format.indexOf('-') : -1; + format = format.replace(/[\+|\-]/g, ''); + } + + // see if abbreviation is wanted + if (numeral._.includes(format, 'a')) { + abbrForce = format.match(/a(k|m|b|t)?/); + + abbrForce = abbrForce ? abbrForce[1] : false; + + // check for space before abbreviation + if (numeral._.includes(format, ' a')) { + abbr = ' '; + } + + format = format.replace(new RegExp(abbr + 'a[kmbt]?'), ''); + + if (abs >= trillion && !abbrForce || abbrForce === 't') { + // trillion + abbr += locale.abbreviations.trillion; + value = value / trillion; + } else if (abs < trillion && abs >= billion && !abbrForce || abbrForce === 'b') { + // billion + abbr += locale.abbreviations.billion; + value = value / billion; + } else if (abs < billion && abs >= million && !abbrForce || abbrForce === 'm') { + // million + abbr += locale.abbreviations.million; + value = value / million; + } else if (abs < million && abs >= thousand && !abbrForce || abbrForce === 'k') { + // thousand + abbr += locale.abbreviations.thousand; + value = value / thousand; + } + } + + // check for optional decimals + if (numeral._.includes(format, '[.]')) { + optDec = true; + format = format.replace('[.]', '.'); + } + + // break number and format + int = value.toString().split('.')[0]; + precision = format.split('.')[1]; + thousands = format.indexOf(','); + leadingCount = (format.split('.')[0].split(',')[0].match(/0/g) || []).length; + + if (precision) { + if (numeral._.includes(precision, '[')) { + precision = precision.replace(']', ''); + precision = precision.split('['); + decimal = numeral._.toFixed(value, (precision[0].length + precision[1].length), roundingFunction, precision[1].length); + } else { + decimal = numeral._.toFixed(value, precision.length, roundingFunction); + } + + int = decimal.split('.')[0]; + + if (numeral._.includes(decimal, '.')) { + decimal = locale.delimiters.decimal + decimal.split('.')[1]; + } else { + decimal = ''; + } + + if (optDec && Number(decimal.slice(1)) === 0) { + decimal = ''; + } + } else { + int = numeral._.toFixed(value, 0, roundingFunction); + } + + // check abbreviation again after rounding + if (abbr && !abbrForce && Number(int) >= 1000 && abbr !== locale.abbreviations.trillion) { + int = String(Number(int) / 1000); + + switch (abbr) { + case locale.abbreviations.thousand: + abbr = locale.abbreviations.million; + break; + case locale.abbreviations.million: + abbr = locale.abbreviations.billion; + break; + case locale.abbreviations.billion: + abbr = locale.abbreviations.trillion; + break; + } + } + + + // format number + if (numeral._.includes(int, '-')) { + int = int.slice(1); + neg = true; + } + + if (int.length < leadingCount) { + for (var i = leadingCount - int.length; i > 0; i--) { + int = '0' + int; + } + } + + if (thousands > -1) { + int = int.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + locale.delimiters.thousands); + } + + if (format.indexOf('.') === 0) { + int = ''; + } + + output = int + decimal + (abbr ? abbr : ''); + + if (negP) { + output = (negP && neg ? '(' : '') + output + (negP && neg ? ')' : ''); + } else { + if (signed >= 0) { + output = signed === 0 ? (neg ? '-' : '+') + output : output + (neg ? '-' : '+'); + } else if (neg) { + output = '-' + output; + } + } + + return output; + }, + // unformats numbers separators, decimals places, signs, abbreviations + stringToNumber: function(string) { + var locale = locales[options.currentLocale], + stringOriginal = string, + abbreviations = { + thousand: 3, + million: 6, + billion: 9, + trillion: 12 + }, + abbreviation, + value, + i, + regexp; + + if (options.zeroFormat && string === options.zeroFormat) { + value = 0; + } else if (options.nullFormat && string === options.nullFormat || !string.replace(/[^0-9]+/g, '').length) { + value = null; + } else { + value = 1; + + if (locale.delimiters.decimal !== '.') { + string = string.replace(/\./g, '').replace(locale.delimiters.decimal, '.'); + } + + for (abbreviation in abbreviations) { + regexp = new RegExp('[^a-zA-Z]' + locale.abbreviations[abbreviation] + '(?:\\)|(\\' + locale.currency.symbol + ')?(?:\\))?)?$'); + + if (stringOriginal.match(regexp)) { + value *= Math.pow(10, abbreviations[abbreviation]); + break; + } + } + + // check for negative number + value *= (string.split('-').length + Math.min(string.split('(').length - 1, string.split(')').length - 1)) % 2 ? 1 : -1; + + // remove non numbers + string = string.replace(/[^0-9\.]+/g, ''); + + value *= Number(string); + } + + return value; + }, + isNaN: function(value) { + return typeof value === 'number' && isNaN(value); + }, + includes: function(string, search) { + return string.indexOf(search) !== -1; + }, + insert: function(string, subString, start) { + return string.slice(0, start) + subString + string.slice(start); + }, + reduce: function(array, callback /*, initialValue*/) { + if (this === null) { + throw new TypeError('Array.prototype.reduce called on null or undefined'); + } + + if (typeof callback !== 'function') { + throw new TypeError(callback + ' is not a function'); + } + + var t = Object(array), + len = t.length >>> 0, + k = 0, + value; + + if (arguments.length === 3) { + value = arguments[2]; + } else { + while (k < len && !(k in t)) { + k++; + } + + if (k >= len) { + throw new TypeError('Reduce of empty array with no initial value'); + } + + value = t[k++]; + } + for (; k < len; k++) { + if (k in t) { + value = callback(value, t[k], k, t); + } + } + return value; + }, + /** + * Computes the multiplier necessary to make x >= 1, + * effectively eliminating miscalculations caused by + * finite precision. + */ + multiplier: function (x) { + var parts = x.toString().split('.'); + + return parts.length < 2 ? 1 : Math.pow(10, parts[1].length); + }, + /** + * Given a variable number of arguments, returns the maximum + * multiplier that must be used to normalize an operation involving + * all of them. + */ + correctionFactor: function () { + var args = Array.prototype.slice.call(arguments); + + return args.reduce(function(accum, next) { + var mn = _.multiplier(next); + return accum > mn ? accum : mn; + }, 1); + }, + /** + * Implementation of toFixed() that treats floats more like decimals + * + * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present + * problems for accounting- and finance-related software. + */ + toFixed: function(value, maxDecimals, roundingFunction, optionals) { + var splitValue = value.toString().split('.'), + minDecimals = maxDecimals - (optionals || 0), + boundedPrecision, + optionalsRegExp, + power, + output; + + // Use the smallest precision value possible to avoid errors from floating point representation + if (splitValue.length === 2) { + boundedPrecision = Math.min(Math.max(splitValue[1].length, minDecimals), maxDecimals); + } else { + boundedPrecision = minDecimals; + } + + power = Math.pow(10, boundedPrecision); + + // Multiply up by precision, round accurately, then divide and use native toFixed(): + output = (roundingFunction(value + 'e+' + boundedPrecision) / power).toFixed(boundedPrecision); + + if (optionals > maxDecimals - boundedPrecision) { + optionalsRegExp = new RegExp('\\.?0{1,' + (optionals - (maxDecimals - boundedPrecision)) + '}$'); + output = output.replace(optionalsRegExp, ''); + } + + return output; + } + }; + + // avaliable options + numeral.options = options; + + // avaliable formats + numeral.formats = formats; + + // avaliable formats + numeral.locales = locales; + + // This function sets the current locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + numeral.locale = function(key) { + if (key) { + options.currentLocale = key.toLowerCase(); + } + + return options.currentLocale; + }; + + // This function provides access to the loaded locale data. If + // no arguments are passed in, it will simply return the current + // global locale object. + numeral.localeData = function(key) { + if (!key) { + return locales[options.currentLocale]; + } + + key = key.toLowerCase(); + + if (!locales[key]) { + throw new Error('Unknown locale : ' + key); + } + + return locales[key]; + }; + + numeral.reset = function() { + for (var property in defaults) { + options[property] = defaults[property]; + } + }; + + numeral.zeroFormat = function(format) { + options.zeroFormat = typeof(format) === 'string' ? format : null; + }; + + numeral.nullFormat = function (format) { + options.nullFormat = typeof(format) === 'string' ? format : null; + }; + + numeral.defaultFormat = function(format) { + options.defaultFormat = typeof(format) === 'string' ? format : '0.0'; + }; + + numeral.register = function(type, name, format) { + name = name.toLowerCase(); + + if (this[type + 's'][name]) { + throw new TypeError(name + ' ' + type + ' already registered.'); + } + + this[type + 's'][name] = format; + + return format; + }; + + + numeral.validate = function(val, culture) { + var _decimalSep, + _thousandSep, + _currSymbol, + _valArray, + _abbrObj, + _thousandRegEx, + localeData, + temp; + + //coerce val to string + if (typeof val !== 'string') { + val += ''; + + if (console.warn) { + console.warn('Numeral.js: Value is not string. It has been co-erced to: ', val); + } + } + + //trim whitespaces from either sides + val = val.trim(); + + //if val is just digits return true + if (!!val.match(/^\d+$/)) { + return true; + } + + //if val is empty return false + if (val === '') { + return false; + } + + //get the decimal and thousands separator from numeral.localeData + try { + //check if the culture is understood by numeral. if not, default it to current locale + localeData = numeral.localeData(culture); + } catch (e) { + localeData = numeral.localeData(numeral.locale()); + } + + //setup the delimiters and currency symbol based on culture/locale + _currSymbol = localeData.currency.symbol; + _abbrObj = localeData.abbreviations; + _decimalSep = localeData.delimiters.decimal; + if (localeData.delimiters.thousands === '.') { + _thousandSep = '\\.'; + } else { + _thousandSep = localeData.delimiters.thousands; + } + + // validating currency symbol + temp = val.match(/^[^\d]+/); + if (temp !== null) { + val = val.substr(1); + if (temp[0] !== _currSymbol) { + return false; + } + } + + //validating abbreviation symbol + temp = val.match(/[^\d]+$/); + if (temp !== null) { + val = val.slice(0, -1); + if (temp[0] !== _abbrObj.thousand && temp[0] !== _abbrObj.million && temp[0] !== _abbrObj.billion && temp[0] !== _abbrObj.trillion) { + return false; + } + } + + _thousandRegEx = new RegExp(_thousandSep + '{2}'); + + if (!val.match(/[^\d.,]/g)) { + _valArray = val.split(_decimalSep); + if (_valArray.length > 2) { + return false; + } else { + if (_valArray.length < 2) { + return ( !! _valArray[0].match(/^\d+.*\d$/) && !_valArray[0].match(_thousandRegEx)); + } else { + if (_valArray[0].length === 1) { + return ( !! _valArray[0].match(/^\d+$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\d+$/)); + } else { + return ( !! _valArray[0].match(/^\d+.*\d$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\d+$/)); + } + } + } + } + + return false; + }; + + + /************************************ + Numeral Prototype + ************************************/ + + numeral.fn = Numeral.prototype = { + clone: function() { + return numeral(this); + }, + format: function(inputString, roundingFunction) { + var value = this._value, + format = inputString || options.defaultFormat, + kind, + output, + formatFunction; + + // make sure we have a roundingFunction + roundingFunction = roundingFunction || Math.round; + + // format based on value + if (value === 0 && options.zeroFormat !== null) { + output = options.zeroFormat; + } else if (value === null && options.nullFormat !== null) { + output = options.nullFormat; + } else { + for (kind in formats) { + if (format.match(formats[kind].regexps.format)) { + formatFunction = formats[kind].format; + + break; + } + } + + formatFunction = formatFunction || numeral._.numberToFormat; + + output = formatFunction(value, format, roundingFunction); + } + + return output; + }, + value: function() { + return this._value; + }, + input: function() { + return this._input; + }, + set: function(value) { + this._value = Number(value); + + return this; + }, + add: function(value) { + var corrFactor = _.correctionFactor.call(null, this._value, value); + + function cback(accum, curr, currI, O) { + return accum + Math.round(corrFactor * curr); + } + + this._value = _.reduce([this._value, value], cback, 0) / corrFactor; + + return this; + }, + subtract: function(value) { + var corrFactor = _.correctionFactor.call(null, this._value, value); + + function cback(accum, curr, currI, O) { + return accum - Math.round(corrFactor * curr); + } + + this._value = _.reduce([value], cback, Math.round(this._value * corrFactor)) / corrFactor; + + return this; + }, + multiply: function(value) { + function cback(accum, curr, currI, O) { + var corrFactor = _.correctionFactor(accum, curr); + return Math.round(accum * corrFactor) * Math.round(curr * corrFactor) / Math.round(corrFactor * corrFactor); + } + + this._value = _.reduce([this._value, value], cback, 1); + + return this; + }, + divide: function(value) { + function cback(accum, curr, currI, O) { + var corrFactor = _.correctionFactor(accum, curr); + return Math.round(accum * corrFactor) / Math.round(curr * corrFactor); + } + + this._value = _.reduce([this._value, value], cback); + + return this; + }, + difference: function(value) { + return Math.abs(numeral(this._value).subtract(value).value()); + } + }; + + /************************************ + Default Locale && Format + ************************************/ + + numeral.register('locale', 'en', { + delimiters: { + thousands: ',', + decimal: '.' + }, + abbreviations: { + thousand: 'k', + million: 'm', + billion: 'b', + trillion: 't' + }, + ordinal: function(number) { + var b = number % 10; + return (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + }, + currency: { + symbol: '$' + } + }); + + + +(function() { + numeral.register('format', 'bps', { + regexps: { + format: /(BPS)/, + unformat: /(BPS)/ + }, + format: function(value, format, roundingFunction) { + var space = numeral._.includes(format, ' BPS') ? ' ' : '', + output; + + value = value * 10000; + + // check for space before BPS + format = format.replace(/\s?BPS/, ''); + + output = numeral._.numberToFormat(value, format, roundingFunction); + + if (numeral._.includes(output, ')')) { + output = output.split(''); + + output.splice(-1, 0, space + 'BPS'); + + output = output.join(''); + } else { + output = output + space + 'BPS'; + } + + return output; + }, + unformat: function(string) { + return +(numeral._.stringToNumber(string) * 0.0001).toFixed(15); + } + }); +})(); + + +(function() { + var decimal = { + base: 1000, + suffixes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] + }, + binary = { + base: 1024, + suffixes: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] + }; + + var allSuffixes = decimal.suffixes.concat(binary.suffixes.filter(function (item) { + return decimal.suffixes.indexOf(item) < 0; + })); + var unformatRegex = allSuffixes.join('|'); + // Allow support for BPS (http://www.investopedia.com/terms/b/basispoint.asp) + unformatRegex = '(' + unformatRegex.replace('B', 'B(?!PS)') + ')'; + + numeral.register('format', 'bytes', { + regexps: { + format: /([0\s]i?b)/, + unformat: new RegExp(unformatRegex) + }, + format: function(value, format, roundingFunction) { + var output, + bytes = numeral._.includes(format, 'ib') ? binary : decimal, + suffix = numeral._.includes(format, ' b') || numeral._.includes(format, ' ib') ? ' ' : '', + power, + min, + max; + + // check for space before + format = format.replace(/\s?i?b/, ''); + + for (power = 0; power <= bytes.suffixes.length; power++) { + min = Math.pow(bytes.base, power); + max = Math.pow(bytes.base, power + 1); + + if (value === null || value === 0 || value >= min && value < max) { + suffix += bytes.suffixes[power]; + + if (min > 0) { + value = value / min; + } + + break; + } + } + + output = numeral._.numberToFormat(value, format, roundingFunction); + + return output + suffix; + }, + unformat: function(string) { + var value = numeral._.stringToNumber(string), + power, + bytesMultiplier; + + if (value) { + for (power = decimal.suffixes.length - 1; power >= 0; power--) { + if (numeral._.includes(string, decimal.suffixes[power])) { + bytesMultiplier = Math.pow(decimal.base, power); + + break; + } + + if (numeral._.includes(string, binary.suffixes[power])) { + bytesMultiplier = Math.pow(binary.base, power); + + break; + } + } + + value *= (bytesMultiplier || 1); + } + + return value; + } + }); +})(); + + +(function() { + numeral.register('format', 'currency', { + regexps: { + format: /(\$)/ + }, + format: function(value, format, roundingFunction) { + var locale = numeral.locales[numeral.options.currentLocale], + symbols = { + before: format.match(/^([\+|\-|\(|\s|\$]*)/)[0], + after: format.match(/([\+|\-|\)|\s|\$]*)$/)[0] + }, + output, + symbol, + i; + + // strip format of spaces and $ + format = format.replace(/\s?\$\s?/, ''); + + // format the number + output = numeral._.numberToFormat(value, format, roundingFunction); + + // update the before and after based on value + if (value >= 0) { + symbols.before = symbols.before.replace(/[\-\(]/, ''); + symbols.after = symbols.after.replace(/[\-\)]/, ''); + } else if (value < 0 && (!numeral._.includes(symbols.before, '-') && !numeral._.includes(symbols.before, '('))) { + symbols.before = '-' + symbols.before; + } + + // loop through each before symbol + for (i = 0; i < symbols.before.length; i++) { + symbol = symbols.before[i]; + + switch (symbol) { + case '$': + output = numeral._.insert(output, locale.currency.symbol, i); + break; + case ' ': + output = numeral._.insert(output, ' ', i + locale.currency.symbol.length - 1); + break; + } + } + + // loop through each after symbol + for (i = symbols.after.length - 1; i >= 0; i--) { + symbol = symbols.after[i]; + + switch (symbol) { + case '$': + output = i === symbols.after.length - 1 ? output + locale.currency.symbol : numeral._.insert(output, locale.currency.symbol, -(symbols.after.length - (1 + i))); + break; + case ' ': + output = i === symbols.after.length - 1 ? output + ' ' : numeral._.insert(output, ' ', -(symbols.after.length - (1 + i) + locale.currency.symbol.length - 1)); + break; + } + } + + + return output; + } + }); +})(); + + +(function() { + numeral.register('format', 'exponential', { + regexps: { + format: /(e\+|e-)/, + unformat: /(e\+|e-)/ + }, + format: function(value, format, roundingFunction) { + var output, + exponential = typeof value === 'number' && !numeral._.isNaN(value) ? value.toExponential() : '0e+0', + parts = exponential.split('e'); + + format = format.replace(/e[\+|\-]{1}0/, ''); + + output = numeral._.numberToFormat(Number(parts[0]), format, roundingFunction); + + return output + 'e' + parts[1]; + }, + unformat: function(string) { + var parts = numeral._.includes(string, 'e+') ? string.split('e+') : string.split('e-'), + value = Number(parts[0]), + power = Number(parts[1]); + + power = numeral._.includes(string, 'e-') ? power *= -1 : power; + + function cback(accum, curr, currI, O) { + var corrFactor = numeral._.correctionFactor(accum, curr), + num = (accum * corrFactor) * (curr * corrFactor) / (corrFactor * corrFactor); + return num; + } + + return numeral._.reduce([value, Math.pow(10, power)], cback, 1); + } + }); +})(); + + +(function() { + numeral.register('format', 'ordinal', { + regexps: { + format: /(o)/ + }, + format: function(value, format, roundingFunction) { + var locale = numeral.locales[numeral.options.currentLocale], + output, + ordinal = numeral._.includes(format, ' o') ? ' ' : ''; + + // check for space before + format = format.replace(/\s?o/, ''); + + ordinal += locale.ordinal(value); + + output = numeral._.numberToFormat(value, format, roundingFunction); + + return output + ordinal; + } + }); +})(); + + +(function() { + numeral.register('format', 'percentage', { + regexps: { + format: /(%)/, + unformat: /(%)/ + }, + format: function(value, format, roundingFunction) { + var space = numeral._.includes(format, ' %') ? ' ' : '', + output; + + if (numeral.options.scalePercentBy100) { + value = value * 100; + } + + // check for space before % + format = format.replace(/\s?\%/, ''); + + output = numeral._.numberToFormat(value, format, roundingFunction); + + if (numeral._.includes(output, ')')) { + output = output.split(''); + + output.splice(-1, 0, space + '%'); + + output = output.join(''); + } else { + output = output + space + '%'; + } + + return output; + }, + unformat: function(string) { + var number = numeral._.stringToNumber(string); + if (numeral.options.scalePercentBy100) { + return number * 0.01; + } + return number; + } + }); +})(); + + +(function() { + numeral.register('format', 'time', { + regexps: { + format: /(:)/, + unformat: /(:)/ + }, + format: function(value, format, roundingFunction) { + var hours = Math.floor(value / 60 / 60), + minutes = Math.floor((value - (hours * 60 * 60)) / 60), + seconds = Math.round(value - (hours * 60 * 60) - (minutes * 60)); + + return hours + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds); + }, + unformat: function(string) { + var timeArray = string.split(':'), + seconds = 0; + + // turn hours and minutes into seconds and add them all up + if (timeArray.length === 3) { + // hours + seconds = seconds + (Number(timeArray[0]) * 60 * 60); + // minutes + seconds = seconds + (Number(timeArray[1]) * 60); + // seconds + seconds = seconds + Number(timeArray[2]); + } else if (timeArray.length === 2) { + // minutes + seconds = seconds + (Number(timeArray[0]) * 60); + // seconds + seconds = seconds + Number(timeArray[1]); + } + return Number(seconds); + } + }); +})(); + +return numeral; +})); + +},{}],5:[function(require,module,exports){ +(function (global){ +/**! + * @fileOverview Kickass library to create and place poppers near their reference elements. + * @version 1.16.0 + * @license + * Copyright (c) 2016 Federico Zivolo and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.Popper = factory()); +}(this, (function () { 'use strict'; + +var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined'; + +var timeoutDuration = function () { + var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox']; + for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) { + if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) { + return 1; + } + } + return 0; +}(); + +function microtaskDebounce(fn) { + var called = false; + return function () { + if (called) { + return; + } + called = true; + window.Promise.resolve().then(function () { + called = false; + fn(); + }); + }; +} + +function taskDebounce(fn) { + var scheduled = false; + return function () { + if (!scheduled) { + scheduled = true; + setTimeout(function () { + scheduled = false; + fn(); + }, timeoutDuration); + } + }; +} + +var supportsMicroTasks = isBrowser && window.Promise; + +/** +* Create a debounced version of a method, that's asynchronously deferred +* but called in the minimum time possible. +* +* @method +* @memberof Popper.Utils +* @argument {Function} fn +* @returns {Function} +*/ +var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce; + +/** + * Check if the given variable is a function + * @method + * @memberof Popper.Utils + * @argument {Any} functionToCheck - variable to check + * @returns {Boolean} answer to: is a function? + */ +function isFunction(functionToCheck) { + var getType = {}; + return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; +} + +/** + * Get CSS computed property of the given element + * @method + * @memberof Popper.Utils + * @argument {Eement} element + * @argument {String} property + */ +function getStyleComputedProperty(element, property) { + if (element.nodeType !== 1) { + return []; + } + // NOTE: 1 DOM access here + var window = element.ownerDocument.defaultView; + var css = window.getComputedStyle(element, null); + return property ? css[property] : css; +} + +/** + * Returns the parentNode or the host of the element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} parent + */ +function getParentNode(element) { + if (element.nodeName === 'HTML') { + return element; + } + return element.parentNode || element.host; +} + +/** + * Returns the scrolling parent of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} scroll parent + */ +function getScrollParent(element) { + // Return body, `getScroll` will take care to get the correct `scrollTop` from it + if (!element) { + return document.body; + } + + switch (element.nodeName) { + case 'HTML': + case 'BODY': + return element.ownerDocument.body; + case '#document': + return element.body; + } + + // Firefox want us to check `-x` and `-y` variations as well + + var _getStyleComputedProp = getStyleComputedProperty(element), + overflow = _getStyleComputedProp.overflow, + overflowX = _getStyleComputedProp.overflowX, + overflowY = _getStyleComputedProp.overflowY; + + if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) { + return element; + } + + return getScrollParent(getParentNode(element)); +} + +/** + * Returns the reference node of the reference object, or the reference object itself. + * @method + * @memberof Popper.Utils + * @param {Element|Object} reference - the reference element (the popper will be relative to this) + * @returns {Element} parent + */ +function getReferenceNode(reference) { + return reference && reference.referenceNode ? reference.referenceNode : reference; +} + +var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode); +var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent); + +/** + * Determines if the browser is Internet Explorer + * @method + * @memberof Popper.Utils + * @param {Number} version to check + * @returns {Boolean} isIE + */ +function isIE(version) { + if (version === 11) { + return isIE11; + } + if (version === 10) { + return isIE10; + } + return isIE11 || isIE10; +} + +/** + * Returns the offset parent of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} offset parent + */ +function getOffsetParent(element) { + if (!element) { + return document.documentElement; + } + + var noOffsetParent = isIE(10) ? document.body : null; + + // NOTE: 1 DOM access here + var offsetParent = element.offsetParent || null; + // Skip hidden elements which don't have an offsetParent + while (offsetParent === noOffsetParent && element.nextElementSibling) { + offsetParent = (element = element.nextElementSibling).offsetParent; + } + + var nodeName = offsetParent && offsetParent.nodeName; + + if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') { + return element ? element.ownerDocument.documentElement : document.documentElement; + } + + // .offsetParent will return the closest TH, TD or TABLE in case + // no offsetParent is present, I hate this job... + if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') { + return getOffsetParent(offsetParent); + } + + return offsetParent; +} + +function isOffsetContainer(element) { + var nodeName = element.nodeName; + + if (nodeName === 'BODY') { + return false; + } + return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element; +} + +/** + * Finds the root node (document, shadowDOM root) of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} node + * @returns {Element} root node + */ +function getRoot(node) { + if (node.parentNode !== null) { + return getRoot(node.parentNode); + } + + return node; +} + +/** + * Finds the offset parent common to the two provided nodes + * @method + * @memberof Popper.Utils + * @argument {Element} element1 + * @argument {Element} element2 + * @returns {Element} common offset parent + */ +function findCommonOffsetParent(element1, element2) { + // This check is needed to avoid errors in case one of the elements isn't defined for any reason + if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) { + return document.documentElement; + } + + // Here we make sure to give as "start" the element that comes first in the DOM + var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING; + var start = order ? element1 : element2; + var end = order ? element2 : element1; + + // Get common ancestor container + var range = document.createRange(); + range.setStart(start, 0); + range.setEnd(end, 0); + var commonAncestorContainer = range.commonAncestorContainer; + + // Both nodes are inside #document + + if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) { + if (isOffsetContainer(commonAncestorContainer)) { + return commonAncestorContainer; + } + + return getOffsetParent(commonAncestorContainer); + } + + // one of the nodes is inside shadowDOM, find which one + var element1root = getRoot(element1); + if (element1root.host) { + return findCommonOffsetParent(element1root.host, element2); + } else { + return findCommonOffsetParent(element1, getRoot(element2).host); + } +} + +/** + * Gets the scroll value of the given element in the given side (top and left) + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @argument {String} side `top` or `left` + * @returns {number} amount of scrolled pixels + */ +function getScroll(element) { + var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top'; + + var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft'; + var nodeName = element.nodeName; + + if (nodeName === 'BODY' || nodeName === 'HTML') { + var html = element.ownerDocument.documentElement; + var scrollingElement = element.ownerDocument.scrollingElement || html; + return scrollingElement[upperSide]; + } + + return element[upperSide]; +} + +/* + * Sum or subtract the element scroll values (left and top) from a given rect object + * @method + * @memberof Popper.Utils + * @param {Object} rect - Rect object you want to change + * @param {HTMLElement} element - The element from the function reads the scroll values + * @param {Boolean} subtract - set to true if you want to subtract the scroll values + * @return {Object} rect - The modifier rect object + */ +function includeScroll(rect, element) { + var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var scrollTop = getScroll(element, 'top'); + var scrollLeft = getScroll(element, 'left'); + var modifier = subtract ? -1 : 1; + rect.top += scrollTop * modifier; + rect.bottom += scrollTop * modifier; + rect.left += scrollLeft * modifier; + rect.right += scrollLeft * modifier; + return rect; +} + +/* + * Helper to detect borders of a given element + * @method + * @memberof Popper.Utils + * @param {CSSStyleDeclaration} styles + * Result of `getStyleComputedProperty` on the given element + * @param {String} axis - `x` or `y` + * @return {number} borders - The borders size of the given axis + */ + +function getBordersSize(styles, axis) { + var sideA = axis === 'x' ? 'Left' : 'Top'; + var sideB = sideA === 'Left' ? 'Right' : 'Bottom'; + + return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10); +} + +function getSize(axis, body, html, computedStyle) { + return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0); +} + +function getWindowSizes(document) { + var body = document.body; + var html = document.documentElement; + var computedStyle = isIE(10) && getComputedStyle(html); + + return { + height: getSize('Height', body, html, computedStyle), + width: getSize('Width', body, html, computedStyle) + }; +} + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + +var defineProperty = function (obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +}; + +var _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; +}; + +/** + * Given element offsets, generate an output similar to getBoundingClientRect + * @method + * @memberof Popper.Utils + * @argument {Object} offsets + * @returns {Object} ClientRect like output + */ +function getClientRect(offsets) { + return _extends({}, offsets, { + right: offsets.left + offsets.width, + bottom: offsets.top + offsets.height + }); +} + +/** + * Get bounding client rect of given element + * @method + * @memberof Popper.Utils + * @param {HTMLElement} element + * @return {Object} client rect + */ +function getBoundingClientRect(element) { + var rect = {}; + + // IE10 10 FIX: Please, don't ask, the element isn't + // considered in DOM in some circumstances... + // This isn't reproducible in IE10 compatibility mode of IE11 + try { + if (isIE(10)) { + rect = element.getBoundingClientRect(); + var scrollTop = getScroll(element, 'top'); + var scrollLeft = getScroll(element, 'left'); + rect.top += scrollTop; + rect.left += scrollLeft; + rect.bottom += scrollTop; + rect.right += scrollLeft; + } else { + rect = element.getBoundingClientRect(); + } + } catch (e) {} + + var result = { + left: rect.left, + top: rect.top, + width: rect.right - rect.left, + height: rect.bottom - rect.top + }; + + // subtract scrollbar size from sizes + var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {}; + var width = sizes.width || element.clientWidth || result.width; + var height = sizes.height || element.clientHeight || result.height; + + var horizScrollbar = element.offsetWidth - width; + var vertScrollbar = element.offsetHeight - height; + + // if an hypothetical scrollbar is detected, we must be sure it's not a `border` + // we make this check conditional for performance reasons + if (horizScrollbar || vertScrollbar) { + var styles = getStyleComputedProperty(element); + horizScrollbar -= getBordersSize(styles, 'x'); + vertScrollbar -= getBordersSize(styles, 'y'); + + result.width -= horizScrollbar; + result.height -= vertScrollbar; + } + + return getClientRect(result); +} + +function getOffsetRectRelativeToArbitraryNode(children, parent) { + var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var isIE10 = isIE(10); + var isHTML = parent.nodeName === 'HTML'; + var childrenRect = getBoundingClientRect(children); + var parentRect = getBoundingClientRect(parent); + var scrollParent = getScrollParent(children); + + var styles = getStyleComputedProperty(parent); + var borderTopWidth = parseFloat(styles.borderTopWidth, 10); + var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10); + + // In cases where the parent is fixed, we must ignore negative scroll in offset calc + if (fixedPosition && isHTML) { + parentRect.top = Math.max(parentRect.top, 0); + parentRect.left = Math.max(parentRect.left, 0); + } + var offsets = getClientRect({ + top: childrenRect.top - parentRect.top - borderTopWidth, + left: childrenRect.left - parentRect.left - borderLeftWidth, + width: childrenRect.width, + height: childrenRect.height + }); + offsets.marginTop = 0; + offsets.marginLeft = 0; + + // Subtract margins of documentElement in case it's being used as parent + // we do this only on HTML because it's the only element that behaves + // differently when margins are applied to it. The margins are included in + // the box of the documentElement, in the other cases not. + if (!isIE10 && isHTML) { + var marginTop = parseFloat(styles.marginTop, 10); + var marginLeft = parseFloat(styles.marginLeft, 10); + + offsets.top -= borderTopWidth - marginTop; + offsets.bottom -= borderTopWidth - marginTop; + offsets.left -= borderLeftWidth - marginLeft; + offsets.right -= borderLeftWidth - marginLeft; + + // Attach marginTop and marginLeft because in some circumstances we may need them + offsets.marginTop = marginTop; + offsets.marginLeft = marginLeft; + } + + if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') { + offsets = includeScroll(offsets, parent); + } + + return offsets; +} + +function getViewportOffsetRectRelativeToArtbitraryNode(element) { + var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var html = element.ownerDocument.documentElement; + var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html); + var width = Math.max(html.clientWidth, window.innerWidth || 0); + var height = Math.max(html.clientHeight, window.innerHeight || 0); + + var scrollTop = !excludeScroll ? getScroll(html) : 0; + var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0; + + var offset = { + top: scrollTop - relativeOffset.top + relativeOffset.marginTop, + left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft, + width: width, + height: height + }; + + return getClientRect(offset); +} + +/** + * Check if the given element is fixed or is inside a fixed parent + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @argument {Element} customContainer + * @returns {Boolean} answer to "isFixed?" + */ +function isFixed(element) { + var nodeName = element.nodeName; + if (nodeName === 'BODY' || nodeName === 'HTML') { + return false; + } + if (getStyleComputedProperty(element, 'position') === 'fixed') { + return true; + } + var parentNode = getParentNode(element); + if (!parentNode) { + return false; + } + return isFixed(parentNode); +} + +/** + * Finds the first parent of an element that has a transformed property defined + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} first transformed parent or documentElement + */ + +function getFixedPositionOffsetParent(element) { + // This check is needed to avoid errors in case one of the elements isn't defined for any reason + if (!element || !element.parentElement || isIE()) { + return document.documentElement; + } + var el = element.parentElement; + while (el && getStyleComputedProperty(el, 'transform') === 'none') { + el = el.parentElement; + } + return el || document.documentElement; +} + +/** + * Computed the boundaries limits and return them + * @method + * @memberof Popper.Utils + * @param {HTMLElement} popper + * @param {HTMLElement} reference + * @param {number} padding + * @param {HTMLElement} boundariesElement - Element used to define the boundaries + * @param {Boolean} fixedPosition - Is in fixed position mode + * @returns {Object} Coordinates of the boundaries + */ +function getBoundaries(popper, reference, padding, boundariesElement) { + var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + // NOTE: 1 DOM access here + + var boundaries = { top: 0, left: 0 }; + var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference)); + + // Handle viewport case + if (boundariesElement === 'viewport') { + boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition); + } else { + // Handle other cases based on DOM element used as boundaries + var boundariesNode = void 0; + if (boundariesElement === 'scrollParent') { + boundariesNode = getScrollParent(getParentNode(reference)); + if (boundariesNode.nodeName === 'BODY') { + boundariesNode = popper.ownerDocument.documentElement; + } + } else if (boundariesElement === 'window') { + boundariesNode = popper.ownerDocument.documentElement; + } else { + boundariesNode = boundariesElement; + } + + var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition); + + // In case of HTML, we need a different computation + if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) { + var _getWindowSizes = getWindowSizes(popper.ownerDocument), + height = _getWindowSizes.height, + width = _getWindowSizes.width; + + boundaries.top += offsets.top - offsets.marginTop; + boundaries.bottom = height + offsets.top; + boundaries.left += offsets.left - offsets.marginLeft; + boundaries.right = width + offsets.left; + } else { + // for all the other DOM elements, this one is good + boundaries = offsets; + } + } + + // Add paddings + padding = padding || 0; + var isPaddingNumber = typeof padding === 'number'; + boundaries.left += isPaddingNumber ? padding : padding.left || 0; + boundaries.top += isPaddingNumber ? padding : padding.top || 0; + boundaries.right -= isPaddingNumber ? padding : padding.right || 0; + boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; + + return boundaries; +} + +function getArea(_ref) { + var width = _ref.width, + height = _ref.height; + + return width * height; +} + +/** + * Utility used to transform the `auto` placement to the placement with more + * available space. + * @method + * @memberof Popper.Utils + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) { + var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + + if (placement.indexOf('auto') === -1) { + return placement; + } + + var boundaries = getBoundaries(popper, reference, padding, boundariesElement); + + var rects = { + top: { + width: boundaries.width, + height: refRect.top - boundaries.top + }, + right: { + width: boundaries.right - refRect.right, + height: boundaries.height + }, + bottom: { + width: boundaries.width, + height: boundaries.bottom - refRect.bottom + }, + left: { + width: refRect.left - boundaries.left, + height: boundaries.height + } + }; + + var sortedAreas = Object.keys(rects).map(function (key) { + return _extends({ + key: key + }, rects[key], { + area: getArea(rects[key]) + }); + }).sort(function (a, b) { + return b.area - a.area; + }); + + var filteredAreas = sortedAreas.filter(function (_ref2) { + var width = _ref2.width, + height = _ref2.height; + return width >= popper.clientWidth && height >= popper.clientHeight; + }); + + var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key; + + var variation = placement.split('-')[1]; + + return computedPlacement + (variation ? '-' + variation : ''); +} + +/** + * Get offsets to the reference element + * @method + * @memberof Popper.Utils + * @param {Object} state + * @param {Element} popper - the popper element + * @param {Element} reference - the reference element (the popper will be relative to this) + * @param {Element} fixedPosition - is in fixed position mode + * @returns {Object} An object containing the offsets which will be applied to the popper + */ +function getReferenceOffsets(state, popper, reference) { + var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + + var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference)); + return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition); +} + +/** + * Get the outer sizes of the given element (offset size + margins) + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Object} object containing width and height properties + */ +function getOuterSizes(element) { + var window = element.ownerDocument.defaultView; + var styles = window.getComputedStyle(element); + var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0); + var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0); + var result = { + width: element.offsetWidth + y, + height: element.offsetHeight + x + }; + return result; +} + +/** + * Get the opposite placement of the given one + * @method + * @memberof Popper.Utils + * @argument {String} placement + * @returns {String} flipped placement + */ +function getOppositePlacement(placement) { + var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash[matched]; + }); +} + +/** + * Get offsets to the popper + * @method + * @memberof Popper.Utils + * @param {Object} position - CSS position the Popper will get applied + * @param {HTMLElement} popper - the popper element + * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this) + * @param {String} placement - one of the valid placement options + * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper + */ +function getPopperOffsets(popper, referenceOffsets, placement) { + placement = placement.split('-')[0]; + + // Get popper node sizes + var popperRect = getOuterSizes(popper); + + // Add position, width and height to our offsets object + var popperOffsets = { + width: popperRect.width, + height: popperRect.height + }; + + // depending by the popper placement we have to compute its offsets slightly differently + var isHoriz = ['right', 'left'].indexOf(placement) !== -1; + var mainSide = isHoriz ? 'top' : 'left'; + var secondarySide = isHoriz ? 'left' : 'top'; + var measurement = isHoriz ? 'height' : 'width'; + var secondaryMeasurement = !isHoriz ? 'height' : 'width'; + + popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2; + if (placement === secondarySide) { + popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement]; + } else { + popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)]; + } + + return popperOffsets; +} + +/** + * Mimics the `find` method of Array + * @method + * @memberof Popper.Utils + * @argument {Array} arr + * @argument prop + * @argument value + * @returns index or -1 + */ +function find(arr, check) { + // use native find if supported + if (Array.prototype.find) { + return arr.find(check); + } + + // use `filter` to obtain the same behavior of `find` + return arr.filter(check)[0]; +} + +/** + * Return the index of the matching object + * @method + * @memberof Popper.Utils + * @argument {Array} arr + * @argument prop + * @argument value + * @returns index or -1 + */ +function findIndex(arr, prop, value) { + // use native findIndex if supported + if (Array.prototype.findIndex) { + return arr.findIndex(function (cur) { + return cur[prop] === value; + }); + } + + // use `find` + `indexOf` if `findIndex` isn't supported + var match = find(arr, function (obj) { + return obj[prop] === value; + }); + return arr.indexOf(match); +} + +/** + * Loop trough the list of modifiers and run them in order, + * each of them will then edit the data object. + * @method + * @memberof Popper.Utils + * @param {dataObject} data + * @param {Array} modifiers + * @param {String} ends - Optional modifier name used as stopper + * @returns {dataObject} + */ +function runModifiers(modifiers, data, ends) { + var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends)); + + modifiersToRun.forEach(function (modifier) { + if (modifier['function']) { + // eslint-disable-line dot-notation + console.warn('`modifier.function` is deprecated, use `modifier.fn`!'); + } + var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation + if (modifier.enabled && isFunction(fn)) { + // Add properties to offsets to make them a complete clientRect object + // we do this before each modifier to make sure the previous one doesn't + // mess with these values + data.offsets.popper = getClientRect(data.offsets.popper); + data.offsets.reference = getClientRect(data.offsets.reference); + + data = fn(data, modifier); + } + }); + + return data; +} + +/** + * Updates the position of the popper, computing the new offsets and applying + * the new style.
    + * Prefer `scheduleUpdate` over `update` because of performance reasons. + * @method + * @memberof Popper + */ +function update() { + // if popper is destroyed, don't perform any further update + if (this.state.isDestroyed) { + return; + } + + var data = { + instance: this, + styles: {}, + arrowStyles: {}, + attributes: {}, + flipped: false, + offsets: {} + }; + + // compute reference element offsets + data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed); + + // compute auto placement, store placement inside the data object, + // modifiers will be able to edit `placement` if needed + // and refer to originalPlacement to know the original value + data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding); + + // store the computed placement inside `originalPlacement` + data.originalPlacement = data.placement; + + data.positionFixed = this.options.positionFixed; + + // compute the popper offsets + data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement); + + data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute'; + + // run the modifiers + data = runModifiers(this.modifiers, data); + + // the first `update` will call `onCreate` callback + // the other ones will call `onUpdate` callback + if (!this.state.isCreated) { + this.state.isCreated = true; + this.options.onCreate(data); + } else { + this.options.onUpdate(data); + } +} + +/** + * Helper used to know if the given modifier is enabled. + * @method + * @memberof Popper.Utils + * @returns {Boolean} + */ +function isModifierEnabled(modifiers, modifierName) { + return modifiers.some(function (_ref) { + var name = _ref.name, + enabled = _ref.enabled; + return enabled && name === modifierName; + }); +} + +/** + * Get the prefixed supported property name + * @method + * @memberof Popper.Utils + * @argument {String} property (camelCase) + * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix) + */ +function getSupportedPropertyName(property) { + var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O']; + var upperProp = property.charAt(0).toUpperCase() + property.slice(1); + + for (var i = 0; i < prefixes.length; i++) { + var prefix = prefixes[i]; + var toCheck = prefix ? '' + prefix + upperProp : property; + if (typeof document.body.style[toCheck] !== 'undefined') { + return toCheck; + } + } + return null; +} + +/** + * Destroys the popper. + * @method + * @memberof Popper + */ +function destroy() { + this.state.isDestroyed = true; + + // touch DOM only if `applyStyle` modifier is enabled + if (isModifierEnabled(this.modifiers, 'applyStyle')) { + this.popper.removeAttribute('x-placement'); + this.popper.style.position = ''; + this.popper.style.top = ''; + this.popper.style.left = ''; + this.popper.style.right = ''; + this.popper.style.bottom = ''; + this.popper.style.willChange = ''; + this.popper.style[getSupportedPropertyName('transform')] = ''; + } + + this.disableEventListeners(); + + // remove the popper if user explicitly asked for the deletion on destroy + // do not use `remove` because IE11 doesn't support it + if (this.options.removeOnDestroy) { + this.popper.parentNode.removeChild(this.popper); + } + return this; +} + +/** + * Get the window associated with the element + * @argument {Element} element + * @returns {Window} + */ +function getWindow(element) { + var ownerDocument = element.ownerDocument; + return ownerDocument ? ownerDocument.defaultView : window; +} + +function attachToScrollParents(scrollParent, event, callback, scrollParents) { + var isBody = scrollParent.nodeName === 'BODY'; + var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent; + target.addEventListener(event, callback, { passive: true }); + + if (!isBody) { + attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents); + } + scrollParents.push(target); +} + +/** + * Setup needed event listeners used to update the popper position + * @method + * @memberof Popper.Utils + * @private + */ +function setupEventListeners(reference, options, state, updateBound) { + // Resize event listener on window + state.updateBound = updateBound; + getWindow(reference).addEventListener('resize', state.updateBound, { passive: true }); + + // Scroll event listener on scroll parents + var scrollElement = getScrollParent(reference); + attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents); + state.scrollElement = scrollElement; + state.eventsEnabled = true; + + return state; +} + +/** + * It will add resize/scroll events and start recalculating + * position of the popper element when they are triggered. + * @method + * @memberof Popper + */ +function enableEventListeners() { + if (!this.state.eventsEnabled) { + this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate); + } +} + +/** + * Remove event listeners used to update the popper position + * @method + * @memberof Popper.Utils + * @private + */ +function removeEventListeners(reference, state) { + // Remove resize event listener on window + getWindow(reference).removeEventListener('resize', state.updateBound); + + // Remove scroll event listener on scroll parents + state.scrollParents.forEach(function (target) { + target.removeEventListener('scroll', state.updateBound); + }); + + // Reset state + state.updateBound = null; + state.scrollParents = []; + state.scrollElement = null; + state.eventsEnabled = false; + return state; +} + +/** + * It will remove resize/scroll events and won't recalculate popper position + * when they are triggered. It also won't trigger `onUpdate` callback anymore, + * unless you call `update` method manually. + * @method + * @memberof Popper + */ +function disableEventListeners() { + if (this.state.eventsEnabled) { + cancelAnimationFrame(this.scheduleUpdate); + this.state = removeEventListeners(this.reference, this.state); + } +} + +/** + * Tells if a given input is a number + * @method + * @memberof Popper.Utils + * @param {*} input to check + * @return {Boolean} + */ +function isNumeric(n) { + return n !== '' && !isNaN(parseFloat(n)) && isFinite(n); +} + +/** + * Set the style to the given popper + * @method + * @memberof Popper.Utils + * @argument {Element} element - Element to apply the style to + * @argument {Object} styles + * Object with a list of properties and values which will be applied to the element + */ +function setStyles(element, styles) { + Object.keys(styles).forEach(function (prop) { + var unit = ''; + // add unit if the value is numeric and is one of the following + if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) { + unit = 'px'; + } + element.style[prop] = styles[prop] + unit; + }); +} + +/** + * Set the attributes to the given popper + * @method + * @memberof Popper.Utils + * @argument {Element} element - Element to apply the attributes to + * @argument {Object} styles + * Object with a list of properties and values which will be applied to the element + */ +function setAttributes(element, attributes) { + Object.keys(attributes).forEach(function (prop) { + var value = attributes[prop]; + if (value !== false) { + element.setAttribute(prop, attributes[prop]); + } else { + element.removeAttribute(prop); + } + }); +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} data.styles - List of style properties - values to apply to popper element + * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The same data object + */ +function applyStyle(data) { + // any property present in `data.styles` will be applied to the popper, + // in this way we can make the 3rd party modifiers add custom styles to it + // Be aware, modifiers could override the properties defined in the previous + // lines of this modifier! + setStyles(data.instance.popper, data.styles); + + // any property present in `data.attributes` will be applied to the popper, + // they will be set as HTML attributes of the element + setAttributes(data.instance.popper, data.attributes); + + // if arrowElement is defined and arrowStyles has some properties + if (data.arrowElement && Object.keys(data.arrowStyles).length) { + setStyles(data.arrowElement, data.arrowStyles); + } + + return data; +} + +/** + * Set the x-placement attribute before everything else because it could be used + * to add margins to the popper margins needs to be calculated to get the + * correct popper offsets. + * @method + * @memberof Popper.modifiers + * @param {HTMLElement} reference - The reference element used to position the popper + * @param {HTMLElement} popper - The HTML element used as popper + * @param {Object} options - Popper.js options + */ +function applyStyleOnLoad(reference, popper, options, modifierOptions, state) { + // compute reference element offsets + var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed); + + // compute auto placement, store placement inside the data object, + // modifiers will be able to edit `placement` if needed + // and refer to originalPlacement to know the original value + var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding); + + popper.setAttribute('x-placement', placement); + + // Apply `position` to popper before anything else because + // without the position applied we can't guarantee correct computations + setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' }); + + return options; +} + +/** + * @function + * @memberof Popper.Utils + * @argument {Object} data - The data object generated by `update` method + * @argument {Boolean} shouldRound - If the offsets should be rounded at all + * @returns {Object} The popper's position offsets rounded + * + * The tale of pixel-perfect positioning. It's still not 100% perfect, but as + * good as it can be within reason. + * Discussion here: https://github.com/FezVrasta/popper.js/pull/715 + * + * Low DPI screens cause a popper to be blurry if not using full pixels (Safari + * as well on High DPI screens). + * + * Firefox prefers no rounding for positioning and does not have blurriness on + * high DPI screens. + * + * Only horizontal placement and left/right values need to be considered. + */ +function getRoundedOffsets(data, shouldRound) { + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + var round = Math.round, + floor = Math.floor; + + var noRound = function noRound(v) { + return v; + }; + + var referenceWidth = round(reference.width); + var popperWidth = round(popper.width); + + var isVertical = ['left', 'right'].indexOf(data.placement) !== -1; + var isVariation = data.placement.indexOf('-') !== -1; + var sameWidthParity = referenceWidth % 2 === popperWidth % 2; + var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1; + + var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor; + var verticalToInteger = !shouldRound ? noRound : round; + + return { + left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left), + top: verticalToInteger(popper.top), + bottom: verticalToInteger(popper.bottom), + right: horizontalToInteger(popper.right) + }; +} + +var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent); + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function computeStyle(data, options) { + var x = options.x, + y = options.y; + var popper = data.offsets.popper; + + // Remove this legacy support in Popper.js v2 + + var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) { + return modifier.name === 'applyStyle'; + }).gpuAcceleration; + if (legacyGpuAccelerationOption !== undefined) { + console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'); + } + var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration; + + var offsetParent = getOffsetParent(data.instance.popper); + var offsetParentRect = getBoundingClientRect(offsetParent); + + // Styles + var styles = { + position: popper.position + }; + + var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox); + + var sideA = x === 'bottom' ? 'top' : 'bottom'; + var sideB = y === 'right' ? 'left' : 'right'; + + // if gpuAcceleration is set to `true` and transform is supported, + // we use `translate3d` to apply the position to the popper we + // automatically use the supported prefixed version if needed + var prefixedProperty = getSupportedPropertyName('transform'); + + // now, let's make a step back and look at this code closely (wtf?) + // If the content of the popper grows once it's been positioned, it + // may happen that the popper gets misplaced because of the new content + // overflowing its reference element + // To avoid this problem, we provide two options (x and y), which allow + // the consumer to define the offset origin. + // If we position a popper on top of a reference element, we can set + // `x` to `top` to make the popper grow towards its top instead of + // its bottom. + var left = void 0, + top = void 0; + if (sideA === 'bottom') { + // when offsetParent is the positioning is relative to the bottom of the screen (excluding the scrollbar) + // and not the bottom of the html element + if (offsetParent.nodeName === 'HTML') { + top = -offsetParent.clientHeight + offsets.bottom; + } else { + top = -offsetParentRect.height + offsets.bottom; + } + } else { + top = offsets.top; + } + if (sideB === 'right') { + if (offsetParent.nodeName === 'HTML') { + left = -offsetParent.clientWidth + offsets.right; + } else { + left = -offsetParentRect.width + offsets.right; + } + } else { + left = offsets.left; + } + if (gpuAcceleration && prefixedProperty) { + styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)'; + styles[sideA] = 0; + styles[sideB] = 0; + styles.willChange = 'transform'; + } else { + // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties + var invertTop = sideA === 'bottom' ? -1 : 1; + var invertLeft = sideB === 'right' ? -1 : 1; + styles[sideA] = top * invertTop; + styles[sideB] = left * invertLeft; + styles.willChange = sideA + ', ' + sideB; + } + + // Attributes + var attributes = { + 'x-placement': data.placement + }; + + // Update `data` attributes, styles and arrowStyles + data.attributes = _extends({}, attributes, data.attributes); + data.styles = _extends({}, styles, data.styles); + data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles); + + return data; +} + +/** + * Helper used to know if the given modifier depends from another one.
    + * It checks if the needed modifier is listed and enabled. + * @method + * @memberof Popper.Utils + * @param {Array} modifiers - list of modifiers + * @param {String} requestingName - name of requesting modifier + * @param {String} requestedName - name of requested modifier + * @returns {Boolean} + */ +function isModifierRequired(modifiers, requestingName, requestedName) { + var requesting = find(modifiers, function (_ref) { + var name = _ref.name; + return name === requestingName; + }); + + var isRequired = !!requesting && modifiers.some(function (modifier) { + return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order; + }); + + if (!isRequired) { + var _requesting = '`' + requestingName + '`'; + var requested = '`' + requestedName + '`'; + console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!'); + } + return isRequired; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function arrow(data, options) { + var _data$offsets$arrow; + + // arrow depends on keepTogether in order to work + if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) { + return data; + } + + var arrowElement = options.element; + + // if arrowElement is a string, suppose it's a CSS selector + if (typeof arrowElement === 'string') { + arrowElement = data.instance.popper.querySelector(arrowElement); + + // if arrowElement is not found, don't run the modifier + if (!arrowElement) { + return data; + } + } else { + // if the arrowElement isn't a query selector we must check that the + // provided DOM node is child of its popper node + if (!data.instance.popper.contains(arrowElement)) { + console.warn('WARNING: `arrow.element` must be child of its popper element!'); + return data; + } + } + + var placement = data.placement.split('-')[0]; + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var isVertical = ['left', 'right'].indexOf(placement) !== -1; + + var len = isVertical ? 'height' : 'width'; + var sideCapitalized = isVertical ? 'Top' : 'Left'; + var side = sideCapitalized.toLowerCase(); + var altSide = isVertical ? 'left' : 'top'; + var opSide = isVertical ? 'bottom' : 'right'; + var arrowElementSize = getOuterSizes(arrowElement)[len]; + + // + // extends keepTogether behavior making sure the popper and its + // reference have enough pixels in conjunction + // + + // top/left side + if (reference[opSide] - arrowElementSize < popper[side]) { + data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize); + } + // bottom/right side + if (reference[side] + arrowElementSize > popper[opSide]) { + data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide]; + } + data.offsets.popper = getClientRect(data.offsets.popper); + + // compute center of the popper + var center = reference[side] + reference[len] / 2 - arrowElementSize / 2; + + // Compute the sideValue using the updated popper offsets + // take popper margin in account because we don't have this info available + var css = getStyleComputedProperty(data.instance.popper); + var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10); + var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10); + var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide; + + // prevent arrowElement from being placed not contiguously to its popper + sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0); + + data.arrowElement = arrowElement; + data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow); + + return data; +} + +/** + * Get the opposite placement variation of the given one + * @method + * @memberof Popper.Utils + * @argument {String} placement variation + * @returns {String} flipped placement variation + */ +function getOppositeVariation(variation) { + if (variation === 'end') { + return 'start'; + } else if (variation === 'start') { + return 'end'; + } + return variation; +} + +/** + * List of accepted placements to use as values of the `placement` option.
    + * Valid placements are: + * - `auto` + * - `top` + * - `right` + * - `bottom` + * - `left` + * + * Each placement can have a variation from this list: + * - `-start` + * - `-end` + * + * Variations are interpreted easily if you think of them as the left to right + * written languages. Horizontally (`top` and `bottom`), `start` is left and `end` + * is right.
    + * Vertically (`left` and `right`), `start` is top and `end` is bottom. + * + * Some valid examples are: + * - `top-end` (on top of reference, right aligned) + * - `right-start` (on right of reference, top aligned) + * - `bottom` (on bottom, centered) + * - `auto-end` (on the side with more space available, alignment depends by placement) + * + * @static + * @type {Array} + * @enum {String} + * @readonly + * @method placements + * @memberof Popper + */ +var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start']; + +// Get rid of `auto` `auto-start` and `auto-end` +var validPlacements = placements.slice(3); + +/** + * Given an initial placement, returns all the subsequent placements + * clockwise (or counter-clockwise). + * + * @method + * @memberof Popper.Utils + * @argument {String} placement - A valid placement (it accepts variations) + * @argument {Boolean} counter - Set to true to walk the placements counterclockwise + * @returns {Array} placements including their variations + */ +function clockwise(placement) { + var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var index = validPlacements.indexOf(placement); + var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index)); + return counter ? arr.reverse() : arr; +} + +var BEHAVIORS = { + FLIP: 'flip', + CLOCKWISE: 'clockwise', + COUNTERCLOCKWISE: 'counterclockwise' +}; + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function flip(data, options) { + // if `inner` modifier is enabled, we can't use the `flip` modifier + if (isModifierEnabled(data.instance.modifiers, 'inner')) { + return data; + } + + if (data.flipped && data.placement === data.originalPlacement) { + // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides + return data; + } + + var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed); + + var placement = data.placement.split('-')[0]; + var placementOpposite = getOppositePlacement(placement); + var variation = data.placement.split('-')[1] || ''; + + var flipOrder = []; + + switch (options.behavior) { + case BEHAVIORS.FLIP: + flipOrder = [placement, placementOpposite]; + break; + case BEHAVIORS.CLOCKWISE: + flipOrder = clockwise(placement); + break; + case BEHAVIORS.COUNTERCLOCKWISE: + flipOrder = clockwise(placement, true); + break; + default: + flipOrder = options.behavior; + } + + flipOrder.forEach(function (step, index) { + if (placement !== step || flipOrder.length === index + 1) { + return data; + } + + placement = data.placement.split('-')[0]; + placementOpposite = getOppositePlacement(placement); + + var popperOffsets = data.offsets.popper; + var refOffsets = data.offsets.reference; + + // using floor because the reference offsets may contain decimals we are not going to consider here + var floor = Math.floor; + var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom); + + var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left); + var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right); + var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top); + var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom); + + var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom; + + // flip the variation if required + var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; + + // flips variation if reference element overflows boundaries + var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom); + + // flips variation if popper content overflows boundaries + var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop); + + var flippedVariation = flippedVariationByRef || flippedVariationByContent; + + if (overlapsRef || overflowsBoundaries || flippedVariation) { + // this boolean to detect any flip loop + data.flipped = true; + + if (overlapsRef || overflowsBoundaries) { + placement = flipOrder[index + 1]; + } + + if (flippedVariation) { + variation = getOppositeVariation(variation); + } + + data.placement = placement + (variation ? '-' + variation : ''); + + // this object contains `position`, we want to preserve it along with + // any additional property we may add in the future + data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement)); + + data = runModifiers(data.instance.modifiers, data, 'flip'); + } + }); + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function keepTogether(data) { + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var placement = data.placement.split('-')[0]; + var floor = Math.floor; + var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; + var side = isVertical ? 'right' : 'bottom'; + var opSide = isVertical ? 'left' : 'top'; + var measurement = isVertical ? 'width' : 'height'; + + if (popper[side] < floor(reference[opSide])) { + data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement]; + } + if (popper[opSide] > floor(reference[side])) { + data.offsets.popper[opSide] = floor(reference[side]); + } + + return data; +} + +/** + * Converts a string containing value + unit into a px value number + * @function + * @memberof {modifiers~offset} + * @private + * @argument {String} str - Value + unit string + * @argument {String} measurement - `height` or `width` + * @argument {Object} popperOffsets + * @argument {Object} referenceOffsets + * @returns {Number|String} + * Value in pixels, or original string if no values were extracted + */ +function toValue(str, measurement, popperOffsets, referenceOffsets) { + // separate value from unit + var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/); + var value = +split[1]; + var unit = split[2]; + + // If it's not a number it's an operator, I guess + if (!value) { + return str; + } + + if (unit.indexOf('%') === 0) { + var element = void 0; + switch (unit) { + case '%p': + element = popperOffsets; + break; + case '%': + case '%r': + default: + element = referenceOffsets; + } + + var rect = getClientRect(element); + return rect[measurement] / 100 * value; + } else if (unit === 'vh' || unit === 'vw') { + // if is a vh or vw, we calculate the size based on the viewport + var size = void 0; + if (unit === 'vh') { + size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); + } else { + size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); + } + return size / 100 * value; + } else { + // if is an explicit pixel unit, we get rid of the unit and keep the value + // if is an implicit unit, it's px, and we return just the value + return value; + } +} + +/** + * Parse an `offset` string to extrapolate `x` and `y` numeric offsets. + * @function + * @memberof {modifiers~offset} + * @private + * @argument {String} offset + * @argument {Object} popperOffsets + * @argument {Object} referenceOffsets + * @argument {String} basePlacement + * @returns {Array} a two cells array with x and y offsets in numbers + */ +function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) { + var offsets = [0, 0]; + + // Use height if placement is left or right and index is 0 otherwise use width + // in this way the first offset will use an axis and the second one + // will use the other one + var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1; + + // Split the offset string to obtain a list of values and operands + // The regex addresses values with the plus or minus sign in front (+10, -20, etc) + var fragments = offset.split(/(\+|\-)/).map(function (frag) { + return frag.trim(); + }); + + // Detect if the offset string contains a pair of values or a single one + // they could be separated by comma or space + var divider = fragments.indexOf(find(fragments, function (frag) { + return frag.search(/,|\s/) !== -1; + })); + + if (fragments[divider] && fragments[divider].indexOf(',') === -1) { + console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.'); + } + + // If divider is found, we divide the list of values and operands to divide + // them by ofset X and Y. + var splitRegex = /\s*,\s*|\s+/; + var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments]; + + // Convert the values with units to absolute pixels to allow our computations + ops = ops.map(function (op, index) { + // Most of the units rely on the orientation of the popper + var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width'; + var mergeWithPrevious = false; + return op + // This aggregates any `+` or `-` sign that aren't considered operators + // e.g.: 10 + +5 => [10, +, +5] + .reduce(function (a, b) { + if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) { + a[a.length - 1] = b; + mergeWithPrevious = true; + return a; + } else if (mergeWithPrevious) { + a[a.length - 1] += b; + mergeWithPrevious = false; + return a; + } else { + return a.concat(b); + } + }, []) + // Here we convert the string values into number values (in px) + .map(function (str) { + return toValue(str, measurement, popperOffsets, referenceOffsets); + }); + }); + + // Loop trough the offsets arrays and execute the operations + ops.forEach(function (op, index) { + op.forEach(function (frag, index2) { + if (isNumeric(frag)) { + offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1); + } + }); + }); + return offsets; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @argument {Number|String} options.offset=0 + * The offset value as described in the modifier description + * @returns {Object} The data object, properly modified + */ +function offset(data, _ref) { + var offset = _ref.offset; + var placement = data.placement, + _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var basePlacement = placement.split('-')[0]; + + var offsets = void 0; + if (isNumeric(+offset)) { + offsets = [+offset, 0]; + } else { + offsets = parseOffset(offset, popper, reference, basePlacement); + } + + if (basePlacement === 'left') { + popper.top += offsets[0]; + popper.left -= offsets[1]; + } else if (basePlacement === 'right') { + popper.top += offsets[0]; + popper.left += offsets[1]; + } else if (basePlacement === 'top') { + popper.left += offsets[0]; + popper.top -= offsets[1]; + } else if (basePlacement === 'bottom') { + popper.left += offsets[0]; + popper.top += offsets[1]; + } + + data.popper = popper; + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function preventOverflow(data, options) { + var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper); + + // If offsetParent is the reference element, we really want to + // go one step up and use the next offsetParent as reference to + // avoid to make this modifier completely useless and look like broken + if (data.instance.reference === boundariesElement) { + boundariesElement = getOffsetParent(boundariesElement); + } + + // NOTE: DOM access here + // resets the popper's position so that the document size can be calculated excluding + // the size of the popper element itself + var transformProp = getSupportedPropertyName('transform'); + var popperStyles = data.instance.popper.style; // assignment to help minification + var top = popperStyles.top, + left = popperStyles.left, + transform = popperStyles[transformProp]; + + popperStyles.top = ''; + popperStyles.left = ''; + popperStyles[transformProp] = ''; + + var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed); + + // NOTE: DOM access here + // restores the original style properties after the offsets have been computed + popperStyles.top = top; + popperStyles.left = left; + popperStyles[transformProp] = transform; + + options.boundaries = boundaries; + + var order = options.priority; + var popper = data.offsets.popper; + + var check = { + primary: function primary(placement) { + var value = popper[placement]; + if (popper[placement] < boundaries[placement] && !options.escapeWithReference) { + value = Math.max(popper[placement], boundaries[placement]); + } + return defineProperty({}, placement, value); + }, + secondary: function secondary(placement) { + var mainSide = placement === 'right' ? 'left' : 'top'; + var value = popper[mainSide]; + if (popper[placement] > boundaries[placement] && !options.escapeWithReference) { + value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height)); + } + return defineProperty({}, mainSide, value); + } + }; + + order.forEach(function (placement) { + var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary'; + popper = _extends({}, popper, check[side](placement)); + }); + + data.offsets.popper = popper; + + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function shift(data) { + var placement = data.placement; + var basePlacement = placement.split('-')[0]; + var shiftvariation = placement.split('-')[1]; + + // if shift shiftvariation is specified, run the modifier + if (shiftvariation) { + var _data$offsets = data.offsets, + reference = _data$offsets.reference, + popper = _data$offsets.popper; + + var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1; + var side = isVertical ? 'left' : 'top'; + var measurement = isVertical ? 'width' : 'height'; + + var shiftOffsets = { + start: defineProperty({}, side, reference[side]), + end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement]) + }; + + data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]); + } + + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function hide(data) { + if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) { + return data; + } + + var refRect = data.offsets.reference; + var bound = find(data.instance.modifiers, function (modifier) { + return modifier.name === 'preventOverflow'; + }).boundaries; + + if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) { + // Avoid unnecessary DOM access if visibility hasn't changed + if (data.hide === true) { + return data; + } + + data.hide = true; + data.attributes['x-out-of-boundaries'] = ''; + } else { + // Avoid unnecessary DOM access if visibility hasn't changed + if (data.hide === false) { + return data; + } + + data.hide = false; + data.attributes['x-out-of-boundaries'] = false; + } + + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function inner(data) { + var placement = data.placement; + var basePlacement = placement.split('-')[0]; + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1; + + var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1; + + popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0); + + data.placement = getOppositePlacement(placement); + data.offsets.popper = getClientRect(popper); + + return data; +} + +/** + * Modifier function, each modifier can have a function of this type assigned + * to its `fn` property.
    + * These functions will be called on each update, this means that you must + * make sure they are performant enough to avoid performance bottlenecks. + * + * @function ModifierFn + * @argument {dataObject} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {dataObject} The data object, properly modified + */ + +/** + * Modifiers are plugins used to alter the behavior of your poppers.
    + * Popper.js uses a set of 9 modifiers to provide all the basic functionalities + * needed by the library. + * + * Usually you don't want to override the `order`, `fn` and `onLoad` props. + * All the other properties are configurations that could be tweaked. + * @namespace modifiers + */ +var modifiers = { + /** + * Modifier used to shift the popper on the start or end of its reference + * element.
    + * It will read the variation of the `placement` property.
    + * It can be one either `-end` or `-start`. + * @memberof modifiers + * @inner + */ + shift: { + /** @prop {number} order=100 - Index used to define the order of execution */ + order: 100, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: shift + }, + + /** + * The `offset` modifier can shift your popper on both its axis. + * + * It accepts the following units: + * - `px` or unit-less, interpreted as pixels + * - `%` or `%r`, percentage relative to the length of the reference element + * - `%p`, percentage relative to the length of the popper element + * - `vw`, CSS viewport width unit + * - `vh`, CSS viewport height unit + * + * For length is intended the main axis relative to the placement of the popper.
    + * This means that if the placement is `top` or `bottom`, the length will be the + * `width`. In case of `left` or `right`, it will be the `height`. + * + * You can provide a single value (as `Number` or `String`), or a pair of values + * as `String` divided by a comma or one (or more) white spaces.
    + * The latter is a deprecated method because it leads to confusion and will be + * removed in v2.
    + * Additionally, it accepts additions and subtractions between different units. + * Note that multiplications and divisions aren't supported. + * + * Valid examples are: + * ``` + * 10 + * '10%' + * '10, 10' + * '10%, 10' + * '10 + 10%' + * '10 - 5vh + 3%' + * '-10px + 5vh, 5px - 6%' + * ``` + * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap + * > with their reference element, unfortunately, you will have to disable the `flip` modifier. + * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373). + * + * @memberof modifiers + * @inner + */ + offset: { + /** @prop {number} order=200 - Index used to define the order of execution */ + order: 200, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: offset, + /** @prop {Number|String} offset=0 + * The offset value as described in the modifier description + */ + offset: 0 + }, + + /** + * Modifier used to prevent the popper from being positioned outside the boundary. + * + * A scenario exists where the reference itself is not within the boundaries.
    + * We can say it has "escaped the boundaries" — or just "escaped".
    + * In this case we need to decide whether the popper should either: + * + * - detach from the reference and remain "trapped" in the boundaries, or + * - if it should ignore the boundary and "escape with its reference" + * + * When `escapeWithReference` is set to`true` and reference is completely + * outside its boundaries, the popper will overflow (or completely leave) + * the boundaries in order to remain attached to the edge of the reference. + * + * @memberof modifiers + * @inner + */ + preventOverflow: { + /** @prop {number} order=300 - Index used to define the order of execution */ + order: 300, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: preventOverflow, + /** + * @prop {Array} [priority=['left','right','top','bottom']] + * Popper will try to prevent overflow following these priorities by default, + * then, it could overflow on the left and on top of the `boundariesElement` + */ + priority: ['left', 'right', 'top', 'bottom'], + /** + * @prop {number} padding=5 + * Amount of pixel used to define a minimum distance between the boundaries + * and the popper. This makes sure the popper always has a little padding + * between the edges of its container + */ + padding: 5, + /** + * @prop {String|HTMLElement} boundariesElement='scrollParent' + * Boundaries used by the modifier. Can be `scrollParent`, `window`, + * `viewport` or any DOM element. + */ + boundariesElement: 'scrollParent' + }, + + /** + * Modifier used to make sure the reference and its popper stay near each other + * without leaving any gap between the two. Especially useful when the arrow is + * enabled and you want to ensure that it points to its reference element. + * It cares only about the first axis. You can still have poppers with margin + * between the popper and its reference element. + * @memberof modifiers + * @inner + */ + keepTogether: { + /** @prop {number} order=400 - Index used to define the order of execution */ + order: 400, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: keepTogether + }, + + /** + * This modifier is used to move the `arrowElement` of the popper to make + * sure it is positioned between the reference element and its popper element. + * It will read the outer size of the `arrowElement` node to detect how many + * pixels of conjunction are needed. + * + * It has no effect if no `arrowElement` is provided. + * @memberof modifiers + * @inner + */ + arrow: { + /** @prop {number} order=500 - Index used to define the order of execution */ + order: 500, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: arrow, + /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */ + element: '[x-arrow]' + }, + + /** + * Modifier used to flip the popper's placement when it starts to overlap its + * reference element. + * + * Requires the `preventOverflow` modifier before it in order to work. + * + * **NOTE:** this modifier will interrupt the current update cycle and will + * restart it if it detects the need to flip the placement. + * @memberof modifiers + * @inner + */ + flip: { + /** @prop {number} order=600 - Index used to define the order of execution */ + order: 600, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: flip, + /** + * @prop {String|Array} behavior='flip' + * The behavior used to change the popper's placement. It can be one of + * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid + * placements (with optional variations) + */ + behavior: 'flip', + /** + * @prop {number} padding=5 + * The popper will flip if it hits the edges of the `boundariesElement` + */ + padding: 5, + /** + * @prop {String|HTMLElement} boundariesElement='viewport' + * The element which will define the boundaries of the popper position. + * The popper will never be placed outside of the defined boundaries + * (except if `keepTogether` is enabled) + */ + boundariesElement: 'viewport', + /** + * @prop {Boolean} flipVariations=false + * The popper will switch placement variation between `-start` and `-end` when + * the reference element overlaps its boundaries. + * + * The original placement should have a set variation. + */ + flipVariations: false, + /** + * @prop {Boolean} flipVariationsByContent=false + * The popper will switch placement variation between `-start` and `-end` when + * the popper element overlaps its reference boundaries. + * + * The original placement should have a set variation. + */ + flipVariationsByContent: false + }, + + /** + * Modifier used to make the popper flow toward the inner of the reference element. + * By default, when this modifier is disabled, the popper will be placed outside + * the reference element. + * @memberof modifiers + * @inner + */ + inner: { + /** @prop {number} order=700 - Index used to define the order of execution */ + order: 700, + /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */ + enabled: false, + /** @prop {ModifierFn} */ + fn: inner + }, + + /** + * Modifier used to hide the popper when its reference element is outside of the + * popper boundaries. It will set a `x-out-of-boundaries` attribute which can + * be used to hide with a CSS selector the popper when its reference is + * out of boundaries. + * + * Requires the `preventOverflow` modifier before it in order to work. + * @memberof modifiers + * @inner + */ + hide: { + /** @prop {number} order=800 - Index used to define the order of execution */ + order: 800, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: hide + }, + + /** + * Computes the style that will be applied to the popper element to gets + * properly positioned. + * + * Note that this modifier will not touch the DOM, it just prepares the styles + * so that `applyStyle` modifier can apply it. This separation is useful + * in case you need to replace `applyStyle` with a custom implementation. + * + * This modifier has `850` as `order` value to maintain backward compatibility + * with previous versions of Popper.js. Expect the modifiers ordering method + * to change in future major versions of the library. + * + * @memberof modifiers + * @inner + */ + computeStyle: { + /** @prop {number} order=850 - Index used to define the order of execution */ + order: 850, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: computeStyle, + /** + * @prop {Boolean} gpuAcceleration=true + * If true, it uses the CSS 3D transformation to position the popper. + * Otherwise, it will use the `top` and `left` properties + */ + gpuAcceleration: true, + /** + * @prop {string} [x='bottom'] + * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin. + * Change this if your popper should grow in a direction different from `bottom` + */ + x: 'bottom', + /** + * @prop {string} [x='left'] + * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin. + * Change this if your popper should grow in a direction different from `right` + */ + y: 'right' + }, + + /** + * Applies the computed styles to the popper element. + * + * All the DOM manipulations are limited to this modifier. This is useful in case + * you want to integrate Popper.js inside a framework or view library and you + * want to delegate all the DOM manipulations to it. + * + * Note that if you disable this modifier, you must make sure the popper element + * has its position set to `absolute` before Popper.js can do its work! + * + * Just disable this modifier and define your own to achieve the desired effect. + * + * @memberof modifiers + * @inner + */ + applyStyle: { + /** @prop {number} order=900 - Index used to define the order of execution */ + order: 900, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: applyStyle, + /** @prop {Function} */ + onLoad: applyStyleOnLoad, + /** + * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier + * @prop {Boolean} gpuAcceleration=true + * If true, it uses the CSS 3D transformation to position the popper. + * Otherwise, it will use the `top` and `left` properties + */ + gpuAcceleration: undefined + } +}; + +/** + * The `dataObject` is an object containing all the information used by Popper.js. + * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks. + * @name dataObject + * @property {Object} data.instance The Popper.js instance + * @property {String} data.placement Placement applied to popper + * @property {String} data.originalPlacement Placement originally defined on init + * @property {Boolean} data.flipped True if popper has been flipped by flip modifier + * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper + * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier + * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`) + * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`) + * @property {Object} data.boundaries Offsets of the popper boundaries + * @property {Object} data.offsets The measurements of popper, reference and arrow elements + * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values + * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values + * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0 + */ + +/** + * Default options provided to Popper.js constructor.
    + * These can be overridden using the `options` argument of Popper.js.
    + * To override an option, simply pass an object with the same + * structure of the `options` object, as the 3rd argument. For example: + * ``` + * new Popper(ref, pop, { + * modifiers: { + * preventOverflow: { enabled: false } + * } + * }) + * ``` + * @type {Object} + * @static + * @memberof Popper + */ +var Defaults = { + /** + * Popper's placement. + * @prop {Popper.placements} placement='bottom' + */ + placement: 'bottom', + + /** + * Set this to true if you want popper to position it self in 'fixed' mode + * @prop {Boolean} positionFixed=false + */ + positionFixed: false, + + /** + * Whether events (resize, scroll) are initially enabled. + * @prop {Boolean} eventsEnabled=true + */ + eventsEnabled: true, + + /** + * Set to true if you want to automatically remove the popper when + * you call the `destroy` method. + * @prop {Boolean} removeOnDestroy=false + */ + removeOnDestroy: false, + + /** + * Callback called when the popper is created.
    + * By default, it is set to no-op.
    + * Access Popper.js instance with `data.instance`. + * @prop {onCreate} + */ + onCreate: function onCreate() {}, + + /** + * Callback called when the popper is updated. This callback is not called + * on the initialization/creation of the popper, but only on subsequent + * updates.
    + * By default, it is set to no-op.
    + * Access Popper.js instance with `data.instance`. + * @prop {onUpdate} + */ + onUpdate: function onUpdate() {}, + + /** + * List of modifiers used to modify the offsets before they are applied to the popper. + * They provide most of the functionalities of Popper.js. + * @prop {modifiers} + */ + modifiers: modifiers +}; + +/** + * @callback onCreate + * @param {dataObject} data + */ + +/** + * @callback onUpdate + * @param {dataObject} data + */ + +// Utils +// Methods +var Popper = function () { + /** + * Creates a new Popper.js instance. + * @class Popper + * @param {Element|referenceObject} reference - The reference element used to position the popper + * @param {Element} popper - The HTML / XML element used as the popper + * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults) + * @return {Object} instance - The generated Popper.js instance + */ + function Popper(reference, popper) { + var _this = this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + classCallCheck(this, Popper); + + this.scheduleUpdate = function () { + return requestAnimationFrame(_this.update); + }; + + // make update() debounced, so that it only runs at most once-per-tick + this.update = debounce(this.update.bind(this)); + + // with {} we create a new object with the options inside it + this.options = _extends({}, Popper.Defaults, options); + + // init state + this.state = { + isDestroyed: false, + isCreated: false, + scrollParents: [] + }; + + // get reference and popper elements (allow jQuery wrappers) + this.reference = reference && reference.jquery ? reference[0] : reference; + this.popper = popper && popper.jquery ? popper[0] : popper; + + // Deep merge modifiers options + this.options.modifiers = {}; + Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) { + _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {}); + }); + + // Refactoring modifiers' list (Object => Array) + this.modifiers = Object.keys(this.options.modifiers).map(function (name) { + return _extends({ + name: name + }, _this.options.modifiers[name]); + }) + // sort the modifiers by order + .sort(function (a, b) { + return a.order - b.order; + }); + + // modifiers have the ability to execute arbitrary code when Popper.js get inited + // such code is executed in the same order of its modifier + // they could add new properties to their options configuration + // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`! + this.modifiers.forEach(function (modifierOptions) { + if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) { + modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state); + } + }); + + // fire the first update to position the popper in the right place + this.update(); + + var eventsEnabled = this.options.eventsEnabled; + if (eventsEnabled) { + // setup event listeners, they will take care of update the position in specific situations + this.enableEventListeners(); + } + + this.state.eventsEnabled = eventsEnabled; + } + + // We can't use class properties because they don't get listed in the + // class prototype and break stuff like Sinon stubs + + + createClass(Popper, [{ + key: 'update', + value: function update$$1() { + return update.call(this); + } + }, { + key: 'destroy', + value: function destroy$$1() { + return destroy.call(this); + } + }, { + key: 'enableEventListeners', + value: function enableEventListeners$$1() { + return enableEventListeners.call(this); + } + }, { + key: 'disableEventListeners', + value: function disableEventListeners$$1() { + return disableEventListeners.call(this); + } + + /** + * Schedules an update. It will run on the next UI update available. + * @method scheduleUpdate + * @memberof Popper + */ + + + /** + * Collection of utilities useful when writing custom modifiers. + * Starting from version 1.7, this method is available only if you + * include `popper-utils.js` before `popper.js`. + * + * **DEPRECATION**: This way to access PopperUtils is deprecated + * and will be removed in v2! Use the PopperUtils module directly instead. + * Due to the high instability of the methods contained in Utils, we can't + * guarantee them to follow semver. Use them at your own risk! + * @static + * @private + * @type {Object} + * @deprecated since version 1.8 + * @member Utils + * @memberof Popper + */ + + }]); + return Popper; +}(); + +/** + * The `referenceObject` is an object that provides an interface compatible with Popper.js + * and lets you use it as replacement of a real DOM node.
    + * You can use this method to position a popper relatively to a set of coordinates + * in case you don't have a DOM node to use as reference. + * + * ``` + * new Popper(referenceObject, popperNode); + * ``` + * + * NB: This feature isn't supported in Internet Explorer 10. + * @name referenceObject + * @property {Function} data.getBoundingClientRect + * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method. + * @property {number} data.clientWidth + * An ES6 getter that will return the width of the virtual reference element. + * @property {number} data.clientHeight + * An ES6 getter that will return the height of the virtual reference element. + */ + + +Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils; +Popper.placements = placements; +Popper.Defaults = Defaults; + +return Popper; + +}))); + + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],6:[function(require,module,exports){ +(function (process){ +/**! +* tippy.js v5.1.4 +* (c) 2017-2020 atomiks +* MIT License +*/ +'use strict'; + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var Popper = _interopDefault(require('popper.js')); + +function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); +} + +var version = "5.1.4"; + +/** + * Triggers reflow + */ +function reflow(element) { + void element.offsetHeight; +} +/** + * Sets the innerHTML of an element + */ + +function setInnerHTML(element, html) { + element[innerHTML()] = html; +} +/** + * Determines if the value is a reference element + */ + +function isReferenceElement(value) { + return !!(value && value._tippy && value._tippy.reference === value); +} +/** + * Safe .hasOwnProperty check, for prototype-less objects + */ + +function hasOwnProperty(obj, key) { + return {}.hasOwnProperty.call(obj, key); +} +/** + * Returns an array of elements based on the value + */ + +function getArrayOfElements(value) { + if (isElement(value)) { + return [value]; + } + + if (isNodeList(value)) { + return arrayFrom(value); + } + + if (Array.isArray(value)) { + return value; + } + + return arrayFrom(document.querySelectorAll(value)); +} +/** + * Returns a value at a given index depending on if it's an array or number + */ + +function getValueAtIndexOrReturn(value, index, defaultValue) { + if (Array.isArray(value)) { + var v = value[index]; + return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v; + } + + return value; +} +/** + * Prevents errors from being thrown while accessing nested modifier objects + * in `popperOptions` + */ + +function getModifier(obj, key) { + return obj && obj.modifiers && obj.modifiers[key]; +} +/** + * Determines if the value is of type + */ + +function isType(value, type) { + var str = {}.toString.call(value); + return str.indexOf('[object') === 0 && str.indexOf(type + "]") > -1; +} +/** + * Determines if the value is of type Element + */ + +function isElement(value) { + return isType(value, 'Element'); +} +/** + * Determines if the value is of type NodeList + */ + +function isNodeList(value) { + return isType(value, 'NodeList'); +} +/** + * Determines if the value is of type MouseEvent + */ + +function isMouseEvent(value) { + return isType(value, 'MouseEvent'); +} +/** + * Firefox extensions don't allow setting .innerHTML directly, this will trick + * it + */ + +function innerHTML() { + return 'innerHTML'; +} +/** + * Evaluates a function if one, or returns the value + */ + +function invokeWithArgsOrReturn(value, args) { + return typeof value === 'function' ? value.apply(void 0, args) : value; +} +/** + * Sets a popperInstance modifier's property to a value + */ + +function setModifierValue(modifiers, name, property, value) { + modifiers.filter(function (m) { + return m.name === name; + })[0][property] = value; +} +/** + * Returns a new `div` element + */ + +function div() { + return document.createElement('div'); +} +/** + * Applies a transition duration to a list of elements + */ + +function setTransitionDuration(els, value) { + els.forEach(function (el) { + if (el) { + el.style.transitionDuration = value + "ms"; + } + }); +} +/** + * Sets the visibility state to elements so they can begin to transition + */ + +function setVisibilityState(els, state) { + els.forEach(function (el) { + if (el) { + el.setAttribute('data-state', state); + } + }); +} +/** + * Debounce utility. To avoid bloating bundle size, we're only passing 1 + * argument here, a more generic function would pass all arguments. Only + * `onMouseMove` uses this which takes the event object for now. + */ + +function debounce(fn, ms) { + // Avoid wrapping in `setTimeout` if ms is 0 anyway + if (ms === 0) { + return fn; + } + + var timeout; + return function (arg) { + clearTimeout(timeout); + timeout = setTimeout(function () { + fn(arg); + }, ms); + }; +} +/** + * Preserves the original function invocation when another function replaces it + */ + +function preserveInvocation(originalFn, currentFn, args) { + if (originalFn && originalFn !== currentFn) { + originalFn.apply(void 0, args); + } +} +/** + * Deletes properties from an object (pure) + */ + +function removeProperties(obj, keys) { + var clone = _extends({}, obj); + + keys.forEach(function (key) { + delete clone[key]; + }); + return clone; +} +/** + * Ponyfill for Array.from - converts iterable values to an array + */ + +function arrayFrom(value) { + return [].slice.call(value); +} +/** + * Works like Element.prototype.closest, but uses a callback instead + */ + +function closestCallback(element, callback) { + while (element) { + if (callback(element)) { + return element; + } + + element = element.parentElement; + } + + return null; +} +/** + * Determines if an array or string includes a string + */ + +function includes(a, b) { + return a.indexOf(b) > -1; +} +/** + * Creates an array from string of values separated by whitespace + */ + +function splitBySpaces(value) { + return value.split(/\s+/).filter(Boolean); +} +/** + * Returns the `nextValue` if `nextValue` is not `undefined`, otherwise returns + * `currentValue` + */ + +function useIfDefined(nextValue, currentValue) { + return nextValue !== undefined ? nextValue : currentValue; +} +/** + * Converts a value that's an array or single value to an array + */ + +function normalizeToArray(value) { + return [].concat(value); +} +/** + * Returns the ownerDocument of the first available element, otherwise global + * document + */ + +function getOwnerDocument(elementOrElements) { + var _normalizeToArray = normalizeToArray(elementOrElements), + element = _normalizeToArray[0]; + + return element ? element.ownerDocument || document : document; +} +/** + * Adds item to array if array does not contain it + */ + +function pushIfUnique(arr, value) { + if (arr.indexOf(value) === -1) { + arr.push(value); + } +} +/** + * Adds `px` if value is a number, or returns it directly + */ + +function appendPxIfNumber(value) { + return typeof value === 'number' ? value + "px" : value; +} +/** + * Filters out duplicate elements in an array + */ + +function unique(arr) { + return arr.filter(function (item, index) { + return arr.indexOf(item) === index; + }); +} +/** + * Returns number from number or CSS units string + */ + +function getNumber(value) { + return typeof value === 'number' ? value : parseFloat(value); +} +/** + * Gets number or CSS string units in pixels (e.g. `1rem` -> 16) + */ + +function getUnitsInPx(doc, value) { + var isRem = typeof value === 'string' && includes(value, 'rem'); + var html = doc.documentElement; + var rootFontSize = 16; + + if (html && isRem) { + return parseFloat(getComputedStyle(html).fontSize || String(rootFontSize)) * getNumber(value); + } + + return getNumber(value); +} +/** + * Adds the `distancePx` value to the placement of a Popper.Padding object + */ + +function getComputedPadding(basePlacement, padding, distancePx) { + if (padding === void 0) { + padding = 5; + } + + var freshPaddingObject = { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; + var keys = Object.keys(freshPaddingObject); + return keys.reduce(function (obj, key) { + obj[key] = typeof padding === 'number' ? padding : padding[key]; + + if (basePlacement === key) { + obj[key] = typeof padding === 'number' ? padding + distancePx : padding[basePlacement] + distancePx; + } + + return obj; + }, freshPaddingObject); +} + +function createMemoryLeakWarning(method) { + var txt = method === 'destroy' ? 'n already-' : ' '; + return "\n " + method + "() was called on a" + txt + "destroyed instance. This is a no-op but\n indicates a potential memory leak.\n "; +} +function clean(value) { + var spacesAndTabs = /[ \t]{2,}/g; + var lineStartWithSpaces = /^[ \t]*/gm; + return value.replace(spacesAndTabs, ' ').replace(lineStartWithSpaces, '').trim(); +} + +function getDevMessage(message) { + return clean("\n %ctippy.js\n\n %c" + clean(message) + "\n\n %c\uD83D\uDC77\u200D This is a development-only message. It will be removed in production.\n "); +} + +function getFormattedMessage(message) { + return [getDevMessage(message), // title + 'color: #00C584; font-size: 1.3em; font-weight: bold;', // message + 'line-height: 1.5', // footer + 'color: #a6a095;']; +} +/** + * Helpful wrapper around `console.warn()`. + * TODO: Should we use a cache so it only warns a single time and not spam the + * console? (Need to consider hot reloading and invalidation though). Chrome + * already batches warnings as well. + */ + +function warnWhen(condition, message) { + if (condition) { + var _console; + + (_console = console).warn.apply(_console, getFormattedMessage(message)); + } +} +/** + * Helpful wrapper around `console.error()` + */ + +function errorWhen(condition, message) { + if (condition) { + var _console2; + + (_console2 = console).error.apply(_console2, getFormattedMessage(message)); + } +} +/** + * Validates the `targets` value passed to `tippy()` + */ + +function validateTargets(targets) { + var didPassFalsyValue = !targets; + var didPassPlainObject = Object.prototype.toString.call(targets) === '[object Object]' && !targets.addEventListener; + errorWhen(didPassFalsyValue, ['tippy() was passed', '`' + String(targets) + '`', 'as its targets (first) argument. Valid types are: String, Element, Element[],', 'or NodeList.'].join(' ')); + errorWhen(didPassPlainObject, ['tippy() was passed a plain object which is no longer supported as an argument.', 'See: https://atomiks.github.io/tippyjs/misc/#custom-position'].join(' ')); +} + +var pluginProps = { + animateFill: false, + followCursor: false, + inlinePositioning: false, + sticky: false +}; +var defaultProps = _extends({ + allowHTML: true, + animation: 'fade', + appendTo: function appendTo() { + return document.body; + }, + aria: 'describedby', + arrow: true, + boundary: 'scrollParent', + content: '', + delay: 0, + distance: 10, + duration: [300, 250], + flip: true, + flipBehavior: 'flip', + flipOnUpdate: false, + hideOnClick: true, + ignoreAttributes: false, + inertia: false, + interactive: false, + interactiveBorder: 2, + interactiveDebounce: 0, + lazy: true, + maxWidth: 350, + multiple: false, + offset: 0, + onAfterUpdate: function onAfterUpdate() {}, + onBeforeUpdate: function onBeforeUpdate() {}, + onCreate: function onCreate() {}, + onDestroy: function onDestroy() {}, + onHidden: function onHidden() {}, + onHide: function onHide() {}, + onMount: function onMount() {}, + onShow: function onShow() {}, + onShown: function onShown() {}, + onTrigger: function onTrigger() {}, + onUntrigger: function onUntrigger() {}, + placement: 'top', + plugins: [], + popperOptions: {}, + role: 'tooltip', + showOnCreate: false, + theme: '', + touch: true, + trigger: 'mouseenter focus', + triggerTarget: null, + updateDuration: 0, + zIndex: 9999 +}, pluginProps); +var defaultKeys = Object.keys(defaultProps); +/** + * If the setProps() method encounters one of these, the popperInstance must be + * recreated + */ + +var POPPER_INSTANCE_DEPENDENCIES = ['arrow', 'boundary', 'distance', 'flip', 'flipBehavior', 'flipOnUpdate', 'offset', 'placement', 'popperOptions']; +/** + * Mutates the defaultProps object by setting the props specified + */ + +var setDefaultProps = function setDefaultProps(partialProps) { + if (process.env.NODE_ENV !== "production") { + validateProps(partialProps, []); + } + + var keys = Object.keys(partialProps); + keys.forEach(function (key) { + defaultProps[key] = partialProps[key]; + }); +}; +/** + * Returns an extended props object including plugin props + */ + +function getExtendedPassedProps(passedProps) { + var plugins = passedProps.plugins || []; + var pluginProps = plugins.reduce(function (acc, plugin) { + var name = plugin.name, + defaultValue = plugin.defaultValue; + + if (name) { + acc[name] = passedProps[name] !== undefined ? passedProps[name] : defaultValue; + } + + return acc; + }, {}); + return _extends({}, passedProps, {}, pluginProps); +} +/** + * Returns an object of optional props from data-tippy-* attributes + */ + +function getDataAttributeProps(reference, plugins) { + var propKeys = plugins ? Object.keys(getExtendedPassedProps(_extends({}, defaultProps, { + plugins: plugins + }))) : defaultKeys; + var props = propKeys.reduce(function (acc, key) { + var valueAsString = (reference.getAttribute("data-tippy-" + key) || '').trim(); + + if (!valueAsString) { + return acc; + } + + if (key === 'content') { + acc[key] = valueAsString; + } else { + try { + acc[key] = JSON.parse(valueAsString); + } catch (e) { + acc[key] = valueAsString; + } + } + + return acc; + }, {}); + return props; +} +/** + * Evaluates the props object by merging data attributes and disabling + * conflicting props where necessary + */ + +function evaluateProps(reference, props) { + var out = _extends({}, props, { + content: invokeWithArgsOrReturn(props.content, [reference]) + }, props.ignoreAttributes ? {} : getDataAttributeProps(reference, props.plugins)); + + if (out.interactive) { + out.aria = null; + } + + return out; +} +/** + * Validates props with the valid `defaultProps` object + */ + +function validateProps(partialProps, plugins) { + if (partialProps === void 0) { + partialProps = {}; + } + + if (plugins === void 0) { + plugins = []; + } + + var keys = Object.keys(partialProps); + keys.forEach(function (prop) { + var value = partialProps[prop]; + var didSpecifyPlacementInPopperOptions = prop === 'popperOptions' && value !== null && typeof value === 'object' && hasOwnProperty(value, 'placement'); + var nonPluginProps = removeProperties(defaultProps, ['animateFill', 'followCursor', 'inlinePositioning', 'sticky']); // These props have custom warnings + + var customWarningProps = ['a11y', 'arrowType', 'showOnInit', 'size', 'target', 'touchHold']; + var didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop) && !includes(customWarningProps, prop); // Check if the prop exists in `plugins` + + if (didPassUnknownProp) { + didPassUnknownProp = plugins.filter(function (plugin) { + return plugin.name === prop; + }).length === 0; + } + + warnWhen(prop === 'target', ['The `target` prop was removed in v5 and replaced with the delegate() addon', 'in order to conserve bundle size.', 'See: https://atomiks.github.io/tippyjs/addons/#event-delegation'].join(' ')); + warnWhen(prop === 'a11y', ['The `a11y` prop was removed in v5. Make sure the element you are giving a', 'tippy to is natively focusable, such as ").text(this.options.lang.next).addClass("btn btn-secondary sw-btn-next").attr("type","button"):null,n=!1!==this.options.toolbarSettings.showPreviousButton?l("").text(this.options.lang.previous).addClass("btn btn-secondary sw-btn-prev").attr("type","button"):null,r=l("
    ").addClass("btn-group mr-2 sw-btn-group").attr("role","group").append(n,i),s=null;switch(this.options.toolbarSettings.toolbarExtraButtons&&0").addClass("btn-group mr-2 sw-btn-group-extra").attr("role","group"),l.each(this.options.toolbarSettings.toolbarExtraButtons,function(t,e){s.append(e.clone(!0))})),this.options.toolbarSettings.toolbarPosition){case"top":(t=l("
    ").addClass("btn-toolbar sw-toolbar sw-toolbar-top justify-content-"+this.options.toolbarSettings.toolbarButtonPosition)).append(r),"start"===this.options.toolbarSettings.toolbarButtonPosition?t.prepend(s):t.append(s),this.container.before(t);break;case"bottom":(e=l("
    ").addClass("btn-toolbar sw-toolbar sw-toolbar-bottom justify-content-"+this.options.toolbarSettings.toolbarButtonPosition)).append(r),"start"===this.options.toolbarSettings.toolbarButtonPosition?e.prepend(s):e.append(s),this.container.after(e);break;case"both":(t=l("
    ").addClass("btn-toolbar sw-toolbar sw-toolbar-top justify-content-"+this.options.toolbarSettings.toolbarButtonPosition)).append(r),"start"===this.options.toolbarSettings.toolbarButtonPosition?t.prepend(s):t.append(s),this.container.before(t),(e=l("
    ").addClass("btn-toolbar sw-toolbar sw-toolbar-bottom justify-content-"+this.options.toolbarSettings.toolbarButtonPosition)).append(r.clone(!0)),null!==s&&("start"===this.options.toolbarSettings.toolbarButtonPosition?e.prepend(s.clone(!0)):e.append(s.clone(!0))),this.container.after(e);break;default:(e=l("
    ").addClass("btn-toolbar sw-toolbar sw-toolbar-bottom justify-content-"+this.options.toolbarSettings.toolbarButtonPosition)).append(r),this.options.toolbarSettings.toolbarButtonPosition,e.append(s),this.container.after(e)}return!0},_setEvents:function(){var i=this;return l(this.steps).on("click",function(t){if(t.preventDefault(),!1===i.options.anchorSettings.anchorClickable)return!0;var e=i.steps.index(this);if(!1===i.options.anchorSettings.enableAnchorOnDoneStep&&i.steps.eq(e).parent("li").hasClass("done"))return!0;e!==i.current_index&&(!1!==i.options.anchorSettings.enableAllAnchors&&!1!==i.options.anchorSettings.anchorClickable?i._showStep(e):i.steps.eq(e).parent("li").hasClass("done")&&i._showStep(e))}),l(".sw-btn-next",this.main).on("click",function(t){t.preventDefault(),i._showNext()}),l(".sw-btn-prev",this.main).on("click",function(t){t.preventDefault(),i._showPrevious()}),this.options.keyNavigation&&l(t).keyup(function(t){i._keyNav(t)}),this.options.backButtonSupport&&l(r).on("hashchange",function(t){if(!i.options.useURLhash)return!0;if(r.location.hash){var e=l("a[href*='"+r.location.hash+"']",i.nav);e&&0")["prepend"==this.insertMode?"prependTo":"appendTo"](this.el)[0]);var t=this.canvas;if(t.width=this.size,t.height=this.size,this.ctx=t.getContext("2d"),1")[0];t.width=i.size,t.height=i.size,t.getContext("2d").drawImage(e,0,0,s,s),i.arcFill=i.ctx.createPattern(t,"no-repeat"),i.drawFrame(i.lastFrameValue)}var e,i=this,n=this.fill,r=this.ctx,s=this.size;if(!n)throw Error("The fill is not specified!");if("string"==typeof n&&(n={color:n}),n.color&&(this.arcFill=n.color),n.gradient){var a=n.gradient;if(1==a.length)this.arcFill=a[0];else if(1n.oldScroll?n.forward:n.backward;for(var s in this.waypoints[i]){var a=this.waypoints[i][s];if(null!==a.triggerPoint){var o=n.oldScroll=a.triggerPoint;(o&&l||!o&&!l)&&(a.queueTrigger(r),t[a.group.id]=a.group)}}}for(var h in t)t[h].flushTriggers();this.oldScroll={x:e.horizontal.newScroll,y:e.vertical.newScroll}},e.prototype.innerHeight=function(){return this.element==this.element.window?m.viewportHeight():this.adapter.innerHeight()},e.prototype.remove=function(t){delete this.waypoints[t.axis][t.key],this.checkEmpty()},e.prototype.innerWidth=function(){return this.element==this.element.window?m.viewportWidth():this.adapter.innerWidth()},e.prototype.destroy=function(){var t=[];for(var e in this.waypoints)for(var i in this.waypoints[e])t.push(this.waypoints[e][i]);for(var n=0,r=t.length;n=s.oldScroll,u=!l&&!h,!g&&l&&h?(c.queueTrigger(s.backward),n[c.group.id]=c.group):!g&&u?(c.queueTrigger(s.forward),n[c.group.id]=c.group):g&&s.oldScroll>=c.triggerPoint&&(c.queueTrigger(s.forward),n[c.group.id]=c.group)}}return m.requestAnimationFrame(function(){for(var t in n)n[t].flushTriggers()}),this},e.findOrCreateByElement=function(t){return e.findByElement(t)||new e(t)},e.refreshAll=function(){for(var t in n)n[t].refresh()},e.findByElement=function(t){return n[t.waypointContextKey]},window.onload=function(){t&&t(),e.refreshAll()},m.requestAnimationFrame=function(t){(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}).call(window,t)},m.Context=e}(),function(){"use strict";function a(t,e){return t.triggerPoint-e.triggerPoint}function o(t,e){return e.triggerPoint-t.triggerPoint}function e(t){this.name=t.name,this.axis=t.axis,this.id=this.name+"-"+this.axis,this.waypoints=[],this.clearTriggerQueues(),i[this.axis][this.name]=this}var i={vertical:{},horizontal:{}},n=window.Waypoint;e.prototype.add=function(t){this.waypoints.push(t)},e.prototype.clearTriggerQueues=function(){this.triggerQueues={up:[],down:[],left:[],right:[]}},e.prototype.flushTriggers=function(){for(var t in this.triggerQueues){var e=this.triggerQueues[t],i="up"===t||"left"===t;e.sort(i?o:a);for(var n=0,r=e.length;n + + + + + + Gradido Login Server: Überprüfe Transaktion + + + + + + + +
    + + +
    + +
    +
    +

    Transaktion unterzeichnen

    +
    +

    Überweisung

    +
    +
    + Konto + Gradido +
    +
    + Normaler User <info@software-labor.de> + -10 GDD +
    +
    + dario frodo <dariofrodo@gmx.de> + 10 GDD +
    +
    +
    +
    + Aktives Konto +
    +
    + Normaler User <info@software-labor.de> +
    +
    +
    +
    + Verwendungszweck +
    +
    +   +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + +
    + 98.597 ms +
    +
    +

    Community Server in Entwicklung

    +

    Alpha 0.21.KW21.05

    +
    + + + + \ No newline at end of file diff --git a/community_server/websrc/gulpfile.js b/community_server/websrc/gulpfile.js new file mode 100644 index 000000000..a1cd459f7 --- /dev/null +++ b/community_server/websrc/gulpfile.js @@ -0,0 +1,58 @@ +var gulp = require('gulp'); +var less = require('gulp-less'); +var concat = require('gulp-concat'); +var merge = require('merge-stream'); +var watch = require('gulp-watch'); +//var minify = require('gulp-minify'); +var cleanCSS = require('gulp-clean-css'); + +var bundleStyles = function() { + + var lessStream = gulp.src('src/less/*.less') + .pipe(concat('src/less-files.less')) + .pipe(less()) + .pipe(gulp.dest('./')) + ; + + var mergedStream = merge(lessStream) + .pipe(concat('grd_styles.css')) + //.pipe(minify()) + .pipe(gulp.dest('../webroot/css/')); + + return mergedStream; +}; + +var compressStyles = function() { + var lessStream = gulp.src('src/less/*.less') + .pipe(concat('src/less-files.less')) + .pipe(less()) + .pipe(gulp.dest('./')) + ; + + var mergedStream = merge(lessStream) + .pipe(concat('grd_styles.min.css')) + .pipe(cleanCSS({ + compatibility: 'ie8', + level: { + 1: { + all: true + }, + 2: { + all: true + } + } + })) + .pipe(gulp.dest('../webroot/css/')); + + return mergedStream; +}; + +gulp.task("bundleStyles", bundleStyles); +gulp.task("compressStyles", compressStyles); + +gulp.task('watchStyles', function() { + bundleStyles(); + watch("src/less/*.less", function() { + bundleStyles(); + }); +}); \ No newline at end of file diff --git a/community_server/websrc/package.json b/community_server/websrc/package.json new file mode 100644 index 000000000..8d456e83b --- /dev/null +++ b/community_server/websrc/package.json @@ -0,0 +1,36 @@ +{ + "name": "gradido_mithriljs_client", + "version": "0.0.1", + "description": "Webinterface Client for Gradido Websites written with mithrilJS", + "main": "app.js", + "scripts": { + "watch:js": "watchify ./src/js/app.js -t [ babelify --presets [ @babel/preset-env ] ] -o ../webroot/js/app.js -v", + "watch:css": "gulp watchStyles", + "bundle:css": "gulp bundleStyles", + "prebuild": "browserify ./src/js/app.js -t [ babelify --presets [ @babel/preset-env ] ] -o ./public/app.rl.js -v", + "build": "gulp compressStyles && browserify ./public/app.rl.js -g uglifyify -p bundle-collapser/plugin | uglifyjs --compress --mangle toplevel,eval > ../webroot/js/app.min.js" + }, + "author": "Dario Rekowski", + "license": "ISC", + "dependencies": { + "google-protobuf": "^3.10.0-rc.1", + "mithril": "github:StephanHoyer/mithril.js#rewrite" + }, + "devDependencies": { + "@babel/core": "^7.6.0", + "@babel/preset-env": "^7.6.0", + "babelify": "^10.0.0", + "browserify": "^16.5.0", + "bs58check": "^2.1.2", + "bundle-collapser": "^1.3.0", + "gulp": "^4.0.2", + "gulp-clean-css": "^4.3.0", + "gulp-concat": "^2.6.1", + "gulp-less": "^4.0.1", + "gulp-minify": "^3.1.0", + "gulp-watch": "^5.0.1", + "merge-stream": "^2.0.0", + "uglify-js": "^3.6.0", + "uglifyify": "^5.0.2" + } +} diff --git a/community_server/websrc/src/less/01-layout.less b/community_server/websrc/src/less/01-layout.less new file mode 100644 index 000000000..2aed60860 --- /dev/null +++ b/community_server/websrc/src/less/01-layout.less @@ -0,0 +1,113 @@ +/* ============================================================ + + Grid Layout Page + + Datei : layout.less + Datum : 2020-04-30 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ + +/*==================================== += BREAK POINTS = +====================================*/ + +/* https://scotch.io/courses/getting-started-with-less/responsive-and-media-queries */ +@wide-screen-down: ~'(max-width:1199px)'; +@desktop-down: ~'(max-width:991px)'; +@tablet-down: ~'(max-width:767px)'; +@phone-down: ~'(max-width:480px)'; +@small-phone-down: ~'(max-width:320px)'; + +/* GRID */ +.layout { + display: grid; + grid-template-rows: [top] 8vh [line2] 86vh [footer1] 3vh [footer2] 5vh [end]; + grid-template-columns: [left1] auto [left2] 1fr [left3] 12fr [right3] 1fr [right2] auto [right1]; + grid-template-areas: "header header header header header" + "left . center center ." + "footer footer footer footer footer" + "bottom bottom bottom bottom bottom"; + margin: 0; + padding: 0; +} + +@media @wide-screen-down { + .layout { + grid-template-areas: "header header header header header" + "left . center center center" + "footer footer footer footer footer" + "bottom bottom bottom bottom bottom"; + } + +} + +@media @tablet-down { + .layout { + position: relative; + display: grid; + grid-template-rows: [top] 12vh [line2] 80vh [footer1] 3vh [footer2] 8vh [end]; + grid-template-columns: [left1] 100vw [right1]; + grid-template-areas: "header" + "center" + "footer" + "bottom"; + margin: 0; + padding: 0; + } + +} + +.header-notify { + grid-area: header; + grid-column-start: right3; + grid-column-end: right2; +} + +.header-user { + grid-area: header; + grid-column-start: right2; + grid-column-end: right1; +} + +.sidebar1 { + grid-area: left; + grid-row-start: top; + grid-row-end: end; +} + +@media @tablet-down { + .sidebar1 { + position: relative; + grid-area: header; + z-index: 2; + top: -300px; + right: 0px; + } + + .header-user, + .header-notify { + grid-area: header; + } + +} + +.center-form-single, +.content { + grid-area: center; + grid-row-start: line2; + grid-row-end: footer1; +} + +.footer { + grid-area: footer; + grid-row-start: footer1; + grid-row-end: footer2; +} + +.nav-bottom { + grid-area: bottom; + grid-row-start: footer2; + grid-row-end: end; +} diff --git a/community_server/websrc/src/less/02-colors.less b/community_server/websrc/src/less/02-colors.less new file mode 100644 index 000000000..90eff9346 --- /dev/null +++ b/community_server/websrc/src/less/02-colors.less @@ -0,0 +1,160 @@ +/* ============================================================ + + Generic Color Definitions + + Vars and some generic CSS rules. + + Datei : colors.less + Datum : 2020-05-26 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ + +/* MAIN */ +@main-background: #f9fafb; +@main-text: #212529; +@main-link-text: #000; + +/* MENU */ +@menu-background: #fff; +@menu-link-text: #4F4F4F; +@menu-link-selected: #047006; +@menu-border-color: #f2f4f5; + +/* CONTENT */ +@container-background: #fff; +@container-text: #212529; +@container-header: #21252969; +@container-shadow: rgba(183, 192, 206, .2); +@container-border: rgba(238, 238, 238, .75); + +/* CONTENT-NAV */ +@content-nav: #565656; + +/* CONTENT-ITEMS */ +@action-button-text: #fff; +@action-button-border: #047006; +@action-button-background1: #047006; +@action-button-background: #f9fafb; +@info-item-border: grey; +@form-header-border: #047006; +@form-header-background: #f9fafb; + +/* CONTENT-TABLE */ +@content-table-title: #313131; +@content-table-header: #101010; +@content-table-header-bg: #fafafa; +@content-table-header-border: #f2f4f9; +@content-row-bg: #f0f2f5; + +/* FORMS */ +@form-label: #212529; +@badge-color-warning: #fff; +@badge-background-warning: #00e093; +@badge-color-error: #fff; +@badge-background-error: #ff5f66; + +/* VARIOUS INDIVIDUAL */ +@orange: #ffa600; + +/* XXX TODO XXX */ +@dialog-background: #fff; + +/*rgba(0, 0, 0, 0.5) ??? */ +@dialog-text: #000; +@dialog-background-extra: rgba(0, 0, 0, 0.1); +@dialog-border: grey; +@form-text-background: rgba(0, 0, 0, 0.05); +@form-button-border: grey; +@form-button-text: #444; +@button-text: #000; +@button-border-color: #000; +@button-background-active: lightgray; +@print-background: #111; +@print-text: #000; +@print-link-text: #06c; +@gdt-text: #a27824; + +/* NOTIFICATION */ +@info: grey; +@info-border: gray; +@info-background: #80808026; +@info-background-icon: #80808026; +@error: red; +@error-border: rgba(255, 0, 0, 0.5); +@success: #047006; +@success-message: #1A1A1A; +@success-message-background: #06c50a; +@success-border: #04700675; +@success-background-icon: rgba(4, 112, 6, 0.2); +@success-background-hover: lightgreen; +@alert: #ff5f66; +@alert-color: #fff; +@alert-background: #ff5f669e; +@alert-background-icon: #ff5f662e; +@alert-blink: #ff5f669e; +@notify: #525c5d; +@notify-blink: #525c5d82; + +/* https://www.w3schools.com/colors/colors_shades.asp */ +@unobtrusive: grey; +@light: #F5F5F5; +@verylight: #fbfbfb; + +.info-color { + color: @info; +} + +.success-color { + color: @success; +} + +.alert-color { + color: @alert; +} + +.orange-color { + color: @orange +} + +.blue-color { + color: blue +} + +.unobtrusive { + color: @unobtrusive; +} + +.info-icon { + color: @info; + background-color: @info-background-icon; +} + +.success-icon { + color: @success; + background-color: @success-background-icon; +} + +.alert-icon { + color: @alert; + background-color: @alert-background-icon; +} + +/* ======================= + Gradido + =======================*/ + +/* Gradido */ +.grd-negative-currency { + color: red; +} + +/* Gradido Transform */ +.gdt-text-color { + color: @gdt-text; +} + +.grd_clickable { + cursor: pointer; +} diff --git a/community_server/websrc/src/less/03-typography.less b/community_server/websrc/src/less/03-typography.less new file mode 100644 index 000000000..06572c9ff --- /dev/null +++ b/community_server/websrc/src/less/03-typography.less @@ -0,0 +1,32 @@ +/* ============================================================ + + Typography Definitions + + Datei : typography.less + Datum : 2020-05-26 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@body-fs: 100%; +@body-lh: 27px; +@content-lh: 1.75em; +@content-letter-spacing: .03rem; +@nav-fs: .8em; +@nav-bottom-fs: .9em; +@nav-bottom-fs-mobile: .8em; +@nav-btn-large-fs: 35px; +@nav-icon-fs: 1.2em; +@nav-icons-fs: 18px; +@nav-icon-main-fs: 32px; +@footer-fs: 70%; +@sidebar1-header-fs: .75em; +@sidebar1-lh: 2.5em; +@link-title-lh: normal; +@devinfo-fs: smaller; +@devinfo-fs-mobile: .7em; + +.small-font { + font-size: .75em; + font-weight: 300; +} diff --git a/community_server/websrc/src/less/05-screen.less b/community_server/websrc/src/less/05-screen.less new file mode 100644 index 000000000..975d57dc1 --- /dev/null +++ b/community_server/websrc/src/less/05-screen.less @@ -0,0 +1,174 @@ +/* ============================================================ + + Basic screen styles. + + Datei : screen.less + Datum : 2020-04-30 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@font-face { + font-family: 'Material Icons Outlined'; + font-style: normal; + font-weight: 400; + src: url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.eot); /* For IE6-8 */ + src: local('Material Icons Outlined'), local('Material-Icons-Outlined'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2) format('woff2'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.woff) format('woff'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf) format('truetype'); +} + +.material-icons-outlined { + font-family: 'Material Icons Outlined'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + vertical-align: middle; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; +} + +@media screen { + + /* ======================= + Basis + =======================*/ + html, + body { + font-family: 'Roboto', sans-serif; + font-size: @body-fs; + line-height: @body-lh; + color: @main-text; + background-color: @main-background; + margin: 0; + overflow: auto; + } + + div { + border-collapse: collapse; + box-sizing: border-box; + } + + /* ======================= + Kopfbereich + =======================*/ + .header { + display: flex; + justify-content: space-between; + align-items: center; + flex: flex-grow; + width: 100%; + padding: 1em; + background-color: @menu-background; + } + + /* ======================= + Fußbereich + =======================*/ + .footer { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + font-size: @footer-fs; + font-style: italic; + line-height: 0; + } + + .bottomright { + position: fixed; + bottom: 0; + right: 0; + color: @unobtrusive; + font-size: @devinfo-fs; + line-height: .125em; + padding-right: .25em; + text-align: right; + } + + @media @tablet-down { + .bottomright { + font-size: @devinfo-fs-mobile; + font-weight: 300; + line-height: 1em; + width: 100px; + } + + .bottomright p { + margin-block-start: 0; + margin-block-end: 2px; + margin-inline-start: 0; + margin-inline-end: 0; + } + + } + + .bottomleft { + position: fixed; + bottom: 0; + left: 0; + color: @unobtrusive; + font-size: @devinfo-fs; + line-height: 1.125em; + padding-left: 0.25em; + } + + /* ======================= + Sonstige + =======================*/ + + /* Hyperlinks */ + a { + text-decoration: none; + color: inherit; + } + + main a { + text-decoration: underline; + font-style: italic; + } + + a:link, + a:visited { + color: inherit; + } + + a:hover, + a:focus { + text-decoration: underline; + } + + a:active { + background-color: @menu-background; + color: @main-link-text; + } + + a:focus, + a:active { + outline: none; + } + + a.grd_invisible_link { + color: @main-link-text; + text-decoration: none; + } + + a.grd_invisible_link:hover { + color: @unobtrusive; + } + + [type=button]:not(:disabled), + [type=reset]:not(:disabled), + [type=submit]:not(:disabled), + button:not(:disabled) { + cursor: pointer + } + +} + +/* Ende @media screen */ diff --git a/community_server/websrc/src/less/06-messages.less b/community_server/websrc/src/less/06-messages.less new file mode 100644 index 000000000..4c4d0fcb7 --- /dev/null +++ b/community_server/websrc/src/less/06-messages.less @@ -0,0 +1,89 @@ +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ + +/* ============================================================ + + Screen styles for flash messages. + + Datei : messages.css + Datum : 30.10.2019, 16:04:16 + Autor : einhornimmond, Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + .flash-messages { + width: 30%; + position: absolute; + top: 57px; + left: 241px; + text-align: center; + + .alert { + margin: 0; + padding: 1em; + vertical-align: middle; + border-radius: 5px; + } + + .alert-success { + color: @success-message !important; + background-color: @success-message-background; + border: 1px solid @success-border; + } + + .alert-error { + color: @alert-color !important; + background-color: @error; + border: 1px solid @error-border; + } + + .message { + padding: 5px; + } + + .success { + color: @success; + } + + .error { + color: @error; + } + + } + + .flash-messages.hidden { + display: none; + } + + @media @tablet-down { + .flash-messages { + width: 90%; + top: 0; + left: 0; + text-align: center; + } + + } + + /* messages, update flash */ + .grd-error { + color: @error; + border: 1px solid @error-border; + padding: 5px; + } + + .grd-info { + border: 1px dotted @info-border; + padding: 5px; + } + + .grd-success { + padding: 5px; + color: @success; + } + +} diff --git a/community_server/websrc/src/less/07-user.less b/community_server/websrc/src/less/07-user.less new file mode 100644 index 000000000..50270ff49 --- /dev/null +++ b/community_server/websrc/src/less/07-user.less @@ -0,0 +1,134 @@ +/* ============================================================ + + User Menu + + Datei : user.less + Datum : 2020-07-03 + Autor : Christine Slotty + Copyright : Gradido + + ============================================================*/ +@media screen { + .header-user { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-end; + align-content: flex-end; + position: relative; + width: 100%; + min-width: 12em; + height: 40px; + background-color: @container-background; + border: 1px solid @menu-border-color; + border-radius: 0 0 0 18px; + } + + .user-menu-container { + display: flex; + justify-content: flex-end; + align-items: center; + font-size: .8em; + font-weight: 300; + padding: .25em .5em; + z-index: 20; + height: 40px; + } + + .user-name, + .user-icon { + display: inline-block; + vertical-align: middle; + cursor: pointer; + } + + .user-name { + padding-right: .25em; + } + + .nav-vertical.user-menu { + display: none; + background-color: @container-background; + border-left: 1px solid @menu-border-color; + border-bottom: 1px solid @menu-border-color; + border-radius: 0 0 16px 16px; + z-index: 15; + font-size: .9em; + margin-top: 0 !important; + position: fixed; + top: 39px; + right: 0; + } + + .nav-vertical.user-menu.visible { + display: inherit; + } + + .nav-vertical.user-menu > ul { + padding: 2em; + padding-top: .5em; + padding-bottom: 1em; + margin-block-end: 0; + margin-block-start: 0; + } + + .nav-vertical.user-menu li { + padding: .0125em; + } + + .nav-top > ul { + padding: 0; + padding-right: 2em; + } + + .material-icons-outlined.user-info { + color: @unobtrusive; + } + + .material-icons-outlined.user-info.success { + color: @success; + } + + @media @tablet-down { + .header-user { + position: relative; + min-width: 3em; + background-color: transparent; + justify-content: center; + height: 100%; + margin-top: -13px; + margin-left: -16px; + color: @action-button-background1; + } + + .user-menu-container { + margin: 0; + padding: 0; + } + + .user-icon { + + } + .user-name { + display: none; + } + + .nav-vertical { + margin-top: 55px; + } + + .nav-vertical.user-menu { + position: fixed; + top: 1px; + right: 0; + margin-top: 0; + } + + .nav-vertical.user-menu > ul { + padding: 1em 1em; + padding-top: 3em; + } + + } + +} diff --git a/community_server/websrc/src/less/08-navi.less b/community_server/websrc/src/less/08-navi.less new file mode 100644 index 000000000..e71ce93a2 --- /dev/null +++ b/community_server/websrc/src/less/08-navi.less @@ -0,0 +1,451 @@ +/* ============================================================ + + Navigation + + Datei : navi.less + Datum : 2020-04-30 + Autor : einhornimmond / Christine Slotty + Copyright : Gradido + + ============================================================*/ +@media screen { + .logo { + display: none; + vertical-align: middle; + height: 30px; + padding: .5em; + } + + .logo.big.visible, + .logo.small.visible { + display: block !important; + } + + .logo.mobile { + display: none; + } + + .logo.small.visible { + padding-left: 41px; + } + + /* + SIDEBARS + */ + .sidebar1 { + background-color: @menu-background; + font-size: @nav-fs; + font-weight: 500; + line-height: @sidebar1-lh; + padding: 0; + border-right: 1px solid @menu-border-color; + } + + .sidebar2 { + padding: 1em; + background-color: @main-background; + } + + .sidebar1-header { + font-size: @sidebar1-header-fs; + font-style: italic; + color: @unobtrusive; + } + + /* set general icons size here! */ + .nav-icon { + font-size: @nav-icons-fs !important; + color: @menu-link-text; + vertical-align: middle; + padding-right: 1em; + } + + /* important! order matters! we need to overwrite the main button's size here */ + .nav-main-button { + font-size: @nav-icon-main-fs !important; + color: @unobtrusive; + margin: .3em; + } + + /* Hide mobile menu button! */ + .nav-main-button.mobile { + display: none; + } + + .nav-menu.nav-menu-maximized { + width: 280px; + height: 100%; + } + + .nav-menu.nav-menu-minimized { + width: 120px; + height: 100%; + } + + .nav-menu-maximized { + -webkit-animation: slide-out 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; + animation: slide-out 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; + } + + .nav-menu-minimized { + -webkit-animation: slide-in 0.1s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; + animation: slide-in 0.1s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; + } + + .nav-menu-minimized .link-title { + display: none; + } + + .nav-menu-minimized .nav-icon, + .nav-menu-minimized .nav-main-button { + padding-left: 72px; + } + + /** + * ---------------------------------------- + * animations slide-in / slide-out + * ---------------------------------------- + */ + + /* slide-in */ + @-webkit-keyframes slide-in { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 0; + } + + 100% { + -webkit-transform: translateX(-74px); + transform: translateX(-74px); + opacity: 1; + } + + } + + @keyframes slide-in { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 0; + } + + 100% { + -webkit-transform: translateX(-74px); + transform: translateX(-74px); + opacity: 1; + } + + } + + /* slide-out */ + @-webkit-keyframes slide-out { + 0% { + -webkit-transform: translateX(-74px); + transform: translateX(-74px); + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + } + + @keyframes slide-out { + 0% { + -webkit-transform: translateX(-74px); + transform: translateX(-74px); + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + } + + /* + NAVI MOBILE + */ + @media @tablet-down { + .logo.big, + .logo.small { + display: none; + } + + .logo.visible { + padding: 0 !important; + } + + .logo, + .logo.mobile, + .logo.mobile.visible { + display: block; + position: fixed; + top: 12px; + left: 12px; + } + + .logo.big, + .logo.big.visible { + display: none !important; + } + + .nav-main-button { + display: none; + } + + .nav-main-button.mobile { + display: block; + position: fixed; + top: 2px; + right: 46px; + z-index: 3; + } + + .nav-menu.nav-menu-minimized, + .nav-menu.nav-menu-maximized { + width: 280px; + height: 300px; + } + + /* .nav-menu-minimized .link-title { + display: inherit; + } + */ + .nav-menu-minimized .nav-icon, + .nav-menu-minimized .nav-main-button { + padding-left: 0; + } + + /* Here we "revert' maximized / minimized and change the animation */ + .nav-menu-maximized { + -webkit-animation: slide-down 0.1s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; + animation: slide-down 0.1s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; + } + + .nav-menu-minimized { + -webkit-animation: slide-up 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; + animation: slide-up 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; + } + + /** + * ---------------------------------------- + * animations slide-down / slide-up + * ---------------------------------------- + */ + + /* slide-down */ + @-webkit-keyframes slide-down { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 0; + } + + 100% { + -webkit-transform: translateY(300px); + transform: translateX(300px); + opacity: 1; + } + + } + + @keyframes slide-down { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 0; + } + + 100% { + -webkit-transform: translateY(300px); + transform: translateY(300px); + opacity: 1; + } + + } + + /* slide-up */ + @-webkit-keyframes slide-up { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + -webkit-transform: translateY(-300px); + transform: translateY(-300px); + } + + } + + @keyframes slide-up { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + -webkit-transform: translateY(-300px); + transform: translateY(-300px); + } + + } + + } + + /* END navi mobile base */ + .selected { + color: @menu-link-selected; + } + + .link-title { + vertical-align: middle; + line-height: @link-title-lh; + background-color: transparent; + } + + .nav-horizontal { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-items: flex-end; + list-style-type: none; + gap: 5%; + padding: 1em; + } + + .footer .nav-horizontal { + gap: 0; + padding: 0 1em; + padding-inline-start: 0 !important; + } + + .nav-top-smaller { + margin: 0; + padding: 0; + } + + .nav-smaller { + justify-content: left; + align-items: flex-start; + gap: 0; + padding: 0; + } + + .nav-smaller li { + padding: 0 !important; + padding: .2em .5em !important; + border: 1px solid @action-button-border; + margin: .1em .3em; + border-radius: 12px; + } + + .nav-smaller .heading { + font-weight: bold; + } + + .nav-vertical { + margin-top: -2em; + } + + .nav-horizontal li { + padding: .5em; + } + + .nav-vertical > ul { + display: flex; + flex-direction: column; + list-style-type: none; + gap: 5%; + padding: 1em; + } + + .nav-vertical li { + padding: .5em; + } + + .nav-top > ul { + padding: 0; + padding-right: 2em; + } + + @media @tablet-down { + .nav-vertical { + margin-top: 55px; + } + + } + + .nav-bottom { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + list-style-type: none; + margin-bottom: 20px; + } + + .nav-bottom p { + font-size: @nav-bottom-fs; + color: @unobtrusive; + margin: 0; + } + + @media @tablet-down { + .nav-bottom p { + font-size: @nav-bottom-fs-mobile; + margin-top: -10px; + } + + } + + nav { + &.grd-left-bar { + position: fixed; + top: 80.5px; + } + + .grd-nav-bn { + width: 100px; + } + + ul { + margin-top: 0; + padding-left: 0; + } + + } + + /* buttons */ + .grd-nav-bn:hover, + .grd-active { + background-color: @button-background-active; + border-color: @main-link-text; + } + + .grd-nav-bn { + padding: 10px; + border: 1px solid @unobtrusive; + display: table-cell; + text-align: center; + vertical-align: middle; + color: @unobtrusive; + } + + .grd-nav-bn-large { + width: 40vw; + height: 18vh; + font-size: @nav-btn-large-fs; + } + + a.grd-nav-bn, + a.grd-nav-bn:visited { + color: @main-link-text; + text-decoration: none; + } + +} diff --git a/community_server/websrc/src/less/09-notification.less b/community_server/websrc/src/less/09-notification.less new file mode 100644 index 000000000..a9bf74c0a --- /dev/null +++ b/community_server/websrc/src/less/09-notification.less @@ -0,0 +1,160 @@ +/* ============================================================ + + Notification + + Datei : notification.css + Datum : 2020-06-10 + Autor : Christine Slotty + Copyright : Gradido + + ============================================================*/ +@media screen { + .header-notify { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; + z-index: 10; + } + + @media @tablet-down { + .header-notify { + justify-content: flex-end; + margin-right: 93px; + margin-top: 8px; + } + + } + + .notify { + display: block; + padding: .5rem .3rem; + color: @notify; + animation: blinkingNotifySymbol 1.2s infinite; + } + + .notify-alert { + color: @alert; + animation: blinkingAlertSymbol 1.2s infinite; + } + + @keyframes blinkingNotifySymbol { + 0% { + color: @notify; + } + + 49% { + color: @notify; + } + + 60% { + color: @notify-blink; + } + + 99% { + color: @notify-blink; + } + + 100% { + color: @notify; + } + + } + + @keyframes blinkingAlertSymbol { + 0% { + color: @alert; + } + + 49% { + color: @alert; + } + + 60% { + color: @alert-blink; + } + + 99% { + color: @alert-blink; + } + + 100% { + color: @alert; + } + + } + + /* + .notification-indicator-primary { + background: #047006; + } + + .notification-indicator-warning { + background: #f0825f + } + .notification-indicator-secondary { + background: grey + } + + .notification-indicator-secondary:before { + content: ""; + background: rgba(128, 128, 128, .5) + } + + .notification-indicator-success { + background: #00e093 + } + + .notification-indicator-success:before { + content: ""; + background: rgba(0, 224, 147, .5) + } + + .notification-indicator-info { + background: #6c61f6 + } + + .notification-indicator-info:before { + content: ""; + background: rgba(108, 97, 246, .5) + } + + + .notification-indicator-danger { + background: #ff5f66 + } + + .notification-indicator-danger:before { + content: ""; + background: rgba(255, 95, 102, .5) + } + + .notification-indicator-light { + background: #dfdfdf + } + + .notification-indicator-light:before { + content: ""; + background: rgba(223, 223, 223, .5) + } + + .notification-indicator-dark { + background: #74767b + } + + .notification-indicator-dark:before { + content: ""; + background: rgba(116, 118, 123, .5) + } + + .notification-indicator-white { + background: #fff + } + + .notification-indicator-white:before { + content: ""; + background: rgba(255, 255, 255, .5) + } + */ +} diff --git a/community_server/websrc/src/less/10-center.less b/community_server/websrc/src/less/10-center.less new file mode 100644 index 000000000..3163e566e --- /dev/null +++ b/community_server/websrc/src/less/10-center.less @@ -0,0 +1,224 @@ +/* ============================================================ + + Screen styles for the regular center part. + + Datei : center.css + Datum : 2020-04-30 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + + /* ========= + CONTENT + =========*/ + .content-default { + display: flex; + justify-content: center; + max-width: 90%; + } + + .content { + display: flex; + justify-content: flex-start; + flex-direction: column; + overflow: auto; + width: 100%; + background-color: @main-background; + line-height: @content-lh; + letter-spacing: @content-letter-spacing; + font-family: Roboto, sans-serif; + font-weight: 500; + font-size: 1rem; + padding-right: 5em; + } + + @media @tablet-down { + .content { + padding-right: 0; + } + + } + + /* Center Navigation Top */ + .nav-content { + position: relative; + color: @content-nav; + margin: 0 .25em; + } + + .nav-content-list { + display: flex; + list-style-type: none; + padding: 0; + margin-left: .25em; + } + + .nav-content-separator { + margin: 0 1em; + } + + @media @tablet-down { + .nav-content-list { + display: flex; + font-size: small; + margin-bottom: 0; + justify-content: center; + } + + } + + /* Center Content Container */ + .content-container { + background-color: @container-background; + color: @container-text; + border-radius: .5em; + box-shadow: 0 0 10px 0 @container-shadow; + border: 1px solid @container-border; + margin: 1em .25em; + } + + /* Block Container Above Main */ + .block-container { + width: 100%; + display: flex; + } + + /* Top Info Above Main */ + .info-container { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 70%; + padding: 1em 25px; + } + + @media @wide-screen-down { + .info-container { + flex-direction: column; + max-width: 90%; + line-height: .25em; + } + + } + + /* Main Container */ + .main-container { + width: 100%; + } + + @media @tablet-down { + .main-container { + max-width: 97%; + } + + } + + .default-container { + width: 90%; + margin: auto; + padding: 1em; + } + + /* Content Block */ + .content-block { + width: 170px; + padding: 20px 25px 20px; + border: 1px dashed grey; + border-radius: 16px; + margin: 1em; + display: flex; + flex-direction: column; + justify-content: center; + justify-items: center; + align-items: center; + } + + .block-img { + width: 40px; + height: 40px; + line-height: 20px; + font-size: 24px; + padding: 8px; + border-radius: 20px; + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2); + overflow: hidden; + border-style: none; + box-sizing: border-box; + } + + /* Generic Content */ + .content-region h3 { + color: @container-header; + } + + .content-region { + border-bottom: 1px dashed @light; + padding: 0 25px; + padding-bottom: 2em; + margin: 1em .25em; + } + + .content-collection { + display: flex; + } + + .content-item { + margin: .5em 0; + margin-right: 5em; + width: 220px; + padding: 1em 2em; + } + + .action-button { + background: @action-button-background; + border-left: 3px solid @action-button-border; + } + + .info-item { + border-left: 2px solid @info-item-border; + } + + .inline-header { + display: inline; + } + + .show-profile-img { + display: block; + height: 100px; + vertical-align: middle; + border-radius: 10px; + border: 2px dotted @info-background; + } + + @media @tablet-down { + .content-region { + padding-left: 5px; + } + + .content-collection { + flex-direction: column; + align-items: center; + } + + .content-item { + margin: .5em 0; + margin-right: 0; + width: 160px; + padding: 1em 2em; + } + + } + + /* OTHER */ + .info-item i, + .info-item-link, + .action-button i, + .action-button-link { + vertical-align: middle; + } + +} + +/* Ende @media screen */ diff --git a/community_server/websrc/src/less/12-center-form-single.less b/community_server/websrc/src/less/12-center-form-single.less new file mode 100644 index 000000000..8179da087 --- /dev/null +++ b/community_server/websrc/src/less/12-center-form-single.less @@ -0,0 +1,164 @@ +/* ============================================================ + + Screen styles for the simple center form. (login etc) + + Datei : center-form-single.css + Datum : 2020-07-10 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + .center-form-single { + width: 50%; + margin: auto; + } + + .center-form-header { + margin-bottom: 50px; + } + + .center-logo { + display: block; + margin: 0 auto; + width: 280px; + } + + .center-logo img { + width: 100%; + vertical-align: middle; + border-style: none; + } + + .center-form-container { + display: flex; + flex-direction: column; + padding: 2em 8em; + background-color: @container-background; + border-radius: 6px; + box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2); + margin-bottom: 1.5rem; + border: 1px solid rgba(238, 238, 238, .75); + } + + @media @tablet-down { + .center-form-header { + margin-bottom: 30px; + margin-top: -50px; + } + + .center-form-single { + width: 97%; + margin: auto; + } + + .center-form-container { + padding: 1em .5em; + } + + } + + .center-form-title h1 { + margin-block-start: 0; + } + + .center-form-selectors { + display: flex; + justify-content: flex-end; + align-items: center; + height: 38px; + padding: 5px 0; + margin-bottom: 2em; + } + + .center-form-form, + .center-form-form form { + display: flex; + flex-direction: column; + } + + .center-form-form .form-label { + text-align: left; + } + .center-form-form .form-control { + width: 100%; + margin: auto; + box-sizing: border-box; + margin-bottom: .5em; + } + + .center-form-submit { + width: 100%; + margin: 1em 0; + } + + .reset-pwd-link, + .signup-link { + padding: 0 20px; + + & a { + color: @action-button-background1; + } + + & p { + display: inline-block; + margin-block-start: 0; + margin-block-end: 0; + } + + } + + .center-bottom { + color: @unobtrusive; + text-align: center; + padding-top: 30px; + } + + .flag-btn { + text-align: center; + vertical-align: middle; + padding: 3px 11px; + } + + .flag { + display: block; + } + + .flag-germany { + background: red; + border-top: 9px solid #000; + border-bottom: 9px solid #fc0; + width: 40px; + height: 10px; + } + + .flag-england { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==); + background-size: cover; + width: 40px; + height: 28px; + } + + .group { + padding-left: 10px; + padding-top: 10px; + padding-bottom: 10px; + } + + .group-is-invalid { + background-color: rgba(240, 130, 95, .2); + border-color: #dc3545; + padding-right: calc(1.5em + .75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E"); + background-repeat: no-repeat; + background-position: center right calc(.375em + .1875rem); + background-size: calc(.75em + .375rem) calc(.75em + .375rem) + } + + .group-is-invalid .radio label .input-frame::before { + border-color: red; + } + +} + +/* Ende @media screen */ diff --git a/community_server/websrc/src/less/15-facts.less b/community_server/websrc/src/less/15-facts.less new file mode 100644 index 000000000..3bac37ff7 --- /dev/null +++ b/community_server/websrc/src/less/15-facts.less @@ -0,0 +1,62 @@ +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ + +/* ============================================================ + + Screen styles for plain facts. + + Datei : facts.css + Datum : 08.07.2020 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + .fact-list { + display: flex; + flex-direction: column; + list-style-type: none; + width: 100%; + padding-inline-start: 0; + font-weight: 300; + } + + .fact { + display: inline-block; + padding-left: 1em; + } + + .label { + width: 150px; + text-align: right; + font-weight: bold; + } + + @media @tablet-down { + .fact-list { + margin-block-start: 0; + margin-block-end: 0; + } + + li.fact { + display: flex; + flex-direction: column; + } + + .fact { + padding-left: .5em; + } + + .label { + width: 250px; + text-align: left; + font-size: .9em; + font-weight: normal; + } + + } + +} diff --git a/community_server/websrc/src/less/20-list.less b/community_server/websrc/src/less/20-list.less new file mode 100644 index 000000000..d09fe0594 --- /dev/null +++ b/community_server/websrc/src/less/20-list.less @@ -0,0 +1,239 @@ +/* ============================================================ + + Screen styles for lists. + + Datei : list.css + Datum : 2020-06-09 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + + /* ========= + LISTS + =========*/ + + /* List Content */ + .content-list { + width: 100%; + } + + .content-list-title { + font-size: 1rem; + margin: 0; + padding: 20px 25px; + color: @content-table-title; + } + + .content-list-table { + display: flex; + flex-direction: column; + width: 100%; + overflow: auto; + font-size: 16px; + color: #212529; + } + + .row { + display: flex; + width: 100%; + border-top: 1px solid #f2f4f9; + -webkit-transition-duration: .5s; + transition-duration: .5s; + } + + @media @tablet-down { + .row { + flex-direction: column; + } + + } + + .row:hover { + background-color: #f6f7f9; + } + + .cell { + display: flex; + flex-wrap: wrap; + align-items: center; + padding: 1em 1.5em; + } + + .cell-dense { + padding: .1em .5em; + } + + .centered { + justify-content: center; + } + + .c0 { + flex-grow: 5; + min-width: 20%; + } + + .c1 { + min-width: 40px; + flex: 0 0 40px; + } + + .c2 { + min-width: 80px; + flex: 0 0 80px; + } + + .c3 { + min-width: 160px; + flex: 0 0 160px; + } + + .c4 { + min-width: 240px; + flex: 0 0 240px; + } + + .c5 { + min-width: 320px; + flex: 0 0 320px; + } + + .c6 { + min-width: 400px; + flex: 0 0 400px; + } + + @media @tablet-down { + .cell { + padding: .25em 1.5em; + } + + .c1 { + flex-basis: auto; + } + + .c2 { + flex-basis: auto; + } + + .c3 { + flex-basis: auto; + } + + .c4 { + flex-basis: auto; + } + + .c5 { + flex-basis: auto; + } + + .c6 { + flex-basis: auto; + } + + } + + .header-cell { + border-top: 1px solid @content-table-header-border; + background-color: @content-table-header-bg; + color: @content-table-header; + } + + .content-list-table img, + .content-list-table i { + vertical-align: middle; + } + + .content-list-table > span { + font-size: .8em; + padding: .5em 2em; + vertical-align: middle; + } + + /* Individual Tables XXX rm!! */ + .error-list { + grid-template-columns: 2fr 2fr 5fr 1fr; + } + + .transactions { + grid-template-columns: 1fr 4fr 2fr 2fr; + } + + .profile-img { + width: 30px; + height: 30px; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2); + overflow: hidden; + border-style: none; + box-sizing: border-box; + margin-right: 40px; + } + + .tx-email { + cursor: pointer; + display: block; + color: @content-table-header; + font-weight: 400; + } + + .small { + font-size: 80%; + font-weight: 400; + } + + /*, + .cell-icon .material-icons-outlined */ + .cell-icon { + + /*noch ungeklärt - icon ist nicht aligned */ + + /*font-size: 1.25em;*/ + vertical-align: middle; + } + + /* ===================================== + FORM TOP CONTENT (checkTransaction) + =====================================*/ + .form-content { + padding: 35px; + padding-top: 20px; + max-width: 80%; + margin: auto; + } + + .content-table { + border: 1px solid @content-table-header-border; + border-top: none; + margin-bottom: 1.5rem; + } + + .content-row { + display: flex; + justify-content: space-between; + font-weight: 400; + border-top: 1px solid @content-table-header-border; + } + + .content-row-header { + font-weight: 500; + color: @content-table-header; + } + + .content-row-bg { + background-color: @content-row-bg; + } + + .content-cell { + display: block; + border-collapse: collapse; + padding: 10px 15px; + } + + .form-button .material-icons-outlined { + font-size: 1.25em; + } + +} diff --git a/community_server/websrc/src/less/30-form.less b/community_server/websrc/src/less/30-form.less new file mode 100644 index 000000000..df52a684e --- /dev/null +++ b/community_server/websrc/src/less/30-form.less @@ -0,0 +1,238 @@ +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ + +/* ============================================================ + + Screen styles for forms. + + Datei : form.css + Datum : 2020-06-07 + Autor : Christine Slotty + Copyright : Gradio + + ============================================================*/ +@media screen { + + /* ========= + FORMS + =========*/ + + /* Form Content */ + .action-form { + width: 100%; + } + + .form-header { + border-left: 3px solid @form-header-border; + background: @form-header-background; + padding: 15px 20px; + margin: 0; + margin-bottom: 15px; + border-radius: 0 6px 0 0; + } + + .form-label { + grid-column: 1 / 2; + font-weight: 400; + text-align: right; + padding-right: .5em; + } + + .form-control { + grid-column: 2 / 3; + display: block; + padding: .4em .75em; + padding-left: 20px; + padding-right: 20px; + margin: 0; + margin-right: .5em; + color: rgba(16, 16, 16, .8); + display: block; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6c757d; + background-color: #f6f7f9; + background-clip: padding-box; + border: 1px solid #f0f2f5; + border-radius: .25rem; + -webkit-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; + } + + .form-control:focus { + color: #495057; + background-color: #f6f7f9; + border-color: #d7dee5; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, .25); + } + + textarea { + resize: vertical; + } + + .badge { + display: inline-block; + padding: .45rem 1rem; + font-size: 80%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25rem; + -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out + } + + .badge-warning { + color: @badge-color-warning; + background-color: @badge-background-warning; + } + + .badge-error { + color: @badge-color-error; + background-color: @badge-background-error; + } + + .form-full-width { + grid-column-start: 1; + grid-column-end: 3; + display: flex; + flex-direction: column; + } + + .form-button { + cursor: pointer; + font: 600 13.3333px Arial; + font-size: .875rem; + line-height: 1.5; + text-align: center; + vertical-align: middle; + color: @action-button-text; + background-color: @action-button-background1; + border-color: @action-button-border; + border: 1px solid transparent; + border-radius: .2rem; + height: 35px; + max-height: 35px; + padding: 4px 15px; + margin-right: .5em; + box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2); + } + + .form-button:hover { + background-color: #034b04; + border-color: #023f03; + } + + .button-cancel { + color: #fff !important; + background-color: #f0825f; + border-color: #f0825f; + } + + .button-cancel:hover { + background-color: #ec5e30; + border-color: #eb5425; + } + + .link-button { + display: inline-block; + background: @action-button-background; + color: @action-button-text; + height: 17px; + padding: 1em 2em; + line-height: 1em; + border-radius: 6px; + text-align: center; + vertical-align: middle; + } + + .action-link { + color: @action-button-background1 !important; + } + + .action-link-button { + background-color: @action-button-background1 !important; + color: @action-button-text !important; + margin-top: 1em; + padding: .5em 1em; + } + + .edit-profile-img { + width: 100px; + } + + .note-smaller { + font-size: smaller; + } + + .form-row, + .grid-row { + display: flex; + justify-content: flex-start; + align-items: center; + align-content: center; + width: 100%; + -webkit-transition-duration: .5s; + transition-duration: .5s; + } + + .justify-end { + justify-content: flex-end; + } + + @media @tablet-down { + .grid-row { + flex-direction: column; + } + + } + + .form-row { + border-top: 1px solid #f2f4f9; + } + + .form-row:hover { + background-color: #f6f7f9; + } + + /* CENTER FORM SPECIFICS */ + .form-body form { + display: grid; + grid-template-columns: 220px 1fr; + margin: 36px 75px; + grid-gap: 1em; + } + + .center-form { + width: 450px; + } + + .center-form .form-control { + width: 90%; + } + + .center-form fieldset { + margin-bottom: 1em; + } + + @media @tablet-down { + .form-body form { + grid-template-columns: 1fr; + margin: 20px; + grid-gap: .25em; + } + + .form-label { + text-align: left; + } + + } + +}