diff --git a/.env.dist b/.env.dist new file mode 100644 index 0000000..221f596 --- /dev/null +++ b/.env.dist @@ -0,0 +1,4 @@ +MWDB_TOKEN= +PROXY_METHOD= +PROXY_URL= +PROXY_DEFAULT_PROXY= diff --git a/.github/workflows/push_hub.yml b/.github/workflows/push_hub.yml new file mode 100644 index 0000000..850995a --- /dev/null +++ b/.github/workflows/push_hub.yml @@ -0,0 +1,81 @@ +name: Build and push docker images +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + build_web: + name: Build image + runs-on: ubuntu-latest + env: + DOCKER_BUILDKIT: 1 + steps: + - name: Check out repository + uses: actions/checkout@v2 + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and push the image + uses: docker/build-push-action@v4 + with: + file: ./deploy/docker/web.Dockerfile + repository: nazywam/mtracker-web + tags: | + nazywam/mtracker-web:master + nazywam/mtracker-web:${{ github.sha }} + push: ${{ github.event_name == 'push' }} + # Flux v1 doesn't support OCI-compliant manifests + provenance: false + build_scheduler: + name: Build image + runs-on: ubuntu-latest + env: + DOCKER_BUILDKIT: 1 + steps: + - name: Check out repository + uses: actions/checkout@v2 + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and push the image + uses: docker/build-push-action@v4 + with: + file: ./deploy/docker/scheduler.Dockerfile + repository: nazywam/mtracker-scheduler + tags: | + nazywam/mtracker-scheduler:master + nazywam/mtracker-scheduler:${{ github.sha }} + push: ${{ github.event_name == 'push' }} + # Flux v1 doesn't support OCI-compliant manifests + provenance: false + build_worker: + name: Build image + runs-on: ubuntu-latest + env: + DOCKER_BUILDKIT: 1 + steps: + - name: Check out repository + uses: actions/checkout@v2 + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and push the image + uses: docker/build-push-action@v4 + with: + file: ./deploy/docker/worker.Dockerfile + repository: nazywam/mtracker-worker + tags: | + nazywam/mtracker-worker:master + nazywam/mtracker-worker:${{ github.sha }} + push: ${{ github.event_name == 'push' }} + # Flux v1 doesn't support OCI-compliant manifests + provenance: false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e0ef71 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +mtracker.ini +venv +*.pyc +__pycache__/ +.mypy_cache/ +.vscode +results +data +.env +src/private_modules +build/ +*.egg-info diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..5b01d8a --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,14 @@ +image: python:3.7 +test_style: + script: + - pip3 install black==19.10b0 flake8==3.7.9 + - black --check src/*.py + - flake8 src/ + +image: python:3.7 +test_types: + script: + - pip3 install -r requirements.txt + - pip3 install -r src/modules/requirements.txt + - pip3 install mypy==0.770 + - mypy src/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..69e8517 --- /dev/null +++ b/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2024, CERT Polska + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of mailgoose nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..962e2b2 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +graft src/templates +graft src/static diff --git a/README.md b/README.md new file mode 100644 index 0000000..b7679e4 --- /dev/null +++ b/README.md @@ -0,0 +1,109 @@ +# mtracker + +Mtracker is a system dedicated to tracking malware C2 servers and automatically downloading actionable information from them. + +Mtracker receives "configurations" that are used to create "trackers". Each tracker tries to connect to C2 using the provided configuration (C2 address, host, port, etc) and download more binaries, commands or data. + +Logically, mtracker is divided into several components: + +![](docs/mtracker.png) + +The user-visible component is the mtracker web interface, which provides +a HTTP UI and API: + +![](docs/ui.png) + +The second most important component are workers, which communicate with +the interface using redis task queue (using [rq](https://python-rq.org/docs/)), and execute the tasks. + +Finally there is a scheduler, that makes sure tasks are executed in a regular intervals. + +All the components communicate through the shared postgres database to manage the state, but the results are only uploaded to [mwdb-core](https://github.com/CERT-Polska/mwdb-core/). Mtracker is tightly tied to MWDB. Users who want to customize this behaviour and use another backend need to override the BotModule class and provide their own implmentation of appropriate methods. + +### Installation: docker-compose + +The easiest way to setup mtracker is using a provided docker-compose file + +```bash +docker-compose build +cp .env.dist .env +vim .env # set mwdb token and proxy configuration +mkdir src/private_modules # a place for your modules +echo "trackers = {}" > src/private_modules/__init__.py # empty module list +docker-compose up # You can use '-d' to detach + +# finally, in another tab apply migrations from db/folder in order, using: +docker-compose exec -T postgres psql -U mtracker3 --dbname mtracker3 < db/000_init.sql +docker-compose exec -T postgres psql -U mtracker3 --dbname mtracker3 < db/001_bots_tasks.sql +docker-compose exec -T postgres psql -U mtracker3 --dbname mtracker3 < db/002_update_bots.sql +docker-compose exec -T postgres psql -U mtracker3 --dbname mtracker3 < db/003_bots_add_last_error.sql +docker-compose exec -T postgres psql -U mtracker3 --dbname mtracker3 < db/004_bots_add_family.sql +docker-compose exec -T postgres psql -U mtracker3 --dbname mtracker3 < db/005_results.sql +docker-compose exec -T postgres psql -U mtracker3 --dbname mtracker3 < db/006_add_proxy.sql +docker-compose exec -T postgres psql -U mtracker3 --dbname mtracker3 < db/007_alter_proxy_add_username_password.sql +``` + +You can now access the web interface on port 80. + +### Installation: bare metal + +You can also install mtracker like you would install any other Python package: + +``` +# Assuming mtracker is cloned into /opt/mtracker directory +# And your modules are stored in /opt/mtrackermodules +# Ensure you have postgres and redis running +cp /opt/mtracker/mtracker.example.ini /opt/mtracker/mtracker.ini +# Edit the config, especially mwdb_token, Db config, Redis config, and ProxyConfig +pip install /opt/mtracker +pip install -r /opt/mtrackermodules/requirements.txt +python3 -m mtracker.worker /opt/mtrackermodules/ # start worker process +python3 -m mtracker.server # in another shell, start the server +python3 -m mtracker.scheduler # in another shell, start the scheduler +``` + +### Installation: proxy configuration + +Mtracker needs proxy servers to work. There are two ways to configure proxies: + +* Set proxy.method to "file", and proxy.path to a json file. +* Set proxy.method to "url", and proxy.url to a url that returns a json. + +In both cases, the JSON should look like this (additional fields are allowed): +```json +[ + { + "host": "10.0.0.1234", + "port": 9050, + "password": "", + "username": "", + "country": "pl" + }, + // more proxies in the same format +] +``` + +All the proxies are SOCKS5h proxies. If you don't want to host your own proxies, the easiest solution is to proxy traffic through tor. + +### Module development + +Mtracker is just a framework, and **won't work** without implementing modules. See [the documentation](docs/moduledev.md) for more information about module development. + +### Contact + +If you have any problems, bugs or feature requests related to mquery, you're +encouraged to create a GitHub issue. + +You can chat about this project on Discord: + +[![](https://dcbadge.vercel.app/api/server/3FcP6GQNzd)](https://discord.gg/3FcP6GQNzd) + +If you have questions unsuitable for Github or discord, you can email CERT.PL +(info@cert.pl) directly. + +### Acknowledgements + +This project was created and is maintained by [CERT Polska](https://cert.pl/en/). + +Additional thanks to [Checkpoint Research](research.checkpoint.com), especially [@ITAYC0HEN](https://github.com/ITAYC0HEN), +who contributed to the development and testing of mtracker diff --git a/RELEASES.md b/RELEASES.md new file mode 100644 index 0000000..b610ec8 --- /dev/null +++ b/RELEASES.md @@ -0,0 +1,3 @@ +# Version 1.0.0 + +First public release diff --git a/db/000_init.sql b/db/000_init.sql new file mode 100644 index 0000000..5eb926e --- /dev/null +++ b/db/000_init.sql @@ -0,0 +1,9 @@ +CREATE TYPE status AS ENUM ('crashed', 'inprogress', 'working', 'failing', 'new', 'archived'); + +CREATE TABLE trackers ( + tracker_id SERIAL PRIMARY KEY, + config_hash CHAR(64), + config TEXT, + family TEXT, + status status +); diff --git a/db/001_bots_tasks.sql b/db/001_bots_tasks.sql new file mode 100644 index 0000000..7d1907c --- /dev/null +++ b/db/001_bots_tasks.sql @@ -0,0 +1,18 @@ +CREATE TABLE bots ( + bot_id SERIAL PRIMARY KEY, + tracker_id INT REFERENCES trackers(tracker_id), + status status, + state TEXT, + failing_spree INT, + next_execution DATE, + country TEXT +); + +CREATE TABLE tasks ( + task_id SERIAL PRIMARY KEY, + bot_id INT REFERENCES bots(bot_id), + status status, + report_time DATE, + results TEXT, + logs TEXT +); diff --git a/db/002_update_bots.sql b/db/002_update_bots.sql new file mode 100644 index 0000000..3429c31 --- /dev/null +++ b/db/002_update_bots.sql @@ -0,0 +1,2 @@ +ALTER table bots ALTER next_execution TYPE timestamp; +ALTER table tasks ALTER report_time TYPE timestamp; \ No newline at end of file diff --git a/db/003_bots_add_last_error.sql b/db/003_bots_add_last_error.sql new file mode 100644 index 0000000..8cac226 --- /dev/null +++ b/db/003_bots_add_last_error.sql @@ -0,0 +1 @@ +ALTER TABLE bots ADD COLUMN last_error TEXT; diff --git a/db/004_bots_add_family.sql b/db/004_bots_add_family.sql new file mode 100644 index 0000000..f921a19 --- /dev/null +++ b/db/004_bots_add_family.sql @@ -0,0 +1,2 @@ +ALTER TABLE bots ADD COLUMN family TEXT; +UPDATE bots b SET family = (SELECT family FROM trackers t WHERE b.tracker_id=t.tracker_id); \ No newline at end of file diff --git a/db/005_results.sql b/db/005_results.sql new file mode 100644 index 0000000..49dbd24 --- /dev/null +++ b/db/005_results.sql @@ -0,0 +1,13 @@ +CREATE TYPE result_type AS ENUM ('config', 'blob', 'binary'); + +CREATE TABLE results ( + result_id SERIAL PRIMARY KEY, + task_id INT REFERENCES tasks(task_id), + type result_type, + name TEXT, + sha256 CHAR(64), + tags TEXT [], + upload_time TIMESTAMP +); + +ALTER TABLE tasks DROP COLUMN results; diff --git a/db/006_add_proxy.sql b/db/006_add_proxy.sql new file mode 100644 index 0000000..352c26f --- /dev/null +++ b/db/006_add_proxy.sql @@ -0,0 +1,6 @@ +CREATE TABLE proxies ( + proxy_id SERIAL PRIMARY KEY, + host TEXT, + port INTEGER, + country CHAR(2) +); diff --git a/db/007_alter_proxy_add_username_password.sql b/db/007_alter_proxy_add_username_password.sql new file mode 100644 index 0000000..27f0391 --- /dev/null +++ b/db/007_alter_proxy_add_username_password.sql @@ -0,0 +1,2 @@ +ALTER TABLE proxies ADD COLUMN username TEXT; +ALTER TABLE proxies ADD COLUMN password TEXT; diff --git a/deploy/docker/scheduler.Dockerfile b/deploy/docker/scheduler.Dockerfile new file mode 100644 index 0000000..2f49059 --- /dev/null +++ b/deploy/docker/scheduler.Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.8 + +WORKDIR /usr/src/app + +COPY requirements.txt requirements.txt +RUN pip install --no-cache-dir -r requirements.txt +COPY src ./src +COPY MANIFEST.in setup.py . +RUN pip install . + +CMD ["python3", "-m", "mtracker.scheduler"] diff --git a/deploy/docker/web.Dockerfile b/deploy/docker/web.Dockerfile new file mode 100644 index 0000000..9f01726 --- /dev/null +++ b/deploy/docker/web.Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.8 + +WORKDIR /usr/src/app + +COPY requirements.txt requirements.txt +RUN pip install --no-cache-dir -r requirements.txt +COPY src ./src +COPY MANIFEST.in setup.py . +RUN pip install . + +CMD ["python3", "-m", "mtracker.server"] diff --git a/deploy/docker/worker.Dockerfile b/deploy/docker/worker.Dockerfile new file mode 100644 index 0000000..b474c91 --- /dev/null +++ b/deploy/docker/worker.Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.8 + +WORKDIR /usr/src/app + +COPY requirements.txt requirements.txt +RUN pip install --no-cache-dir -r requirements.txt +COPY src ./src +COPY MANIFEST.in setup.py . +RUN pip install . + +CMD ["python3", "-m", "mtracker.worker", "/usr/src/app/src/modules"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5dcb31d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,69 @@ +version: '3' +services: + postgres: + restart: always + image: postgres:10.4 + ports: + - "127.0.0.1:5432:5432" + volumes: + # If you are using WSL2, you'll need to set the volume folder + # to a location on your WSL2 file system (i.e not under `/mnt/`) + - "./data/postgres:/var/lib/postgresql/data" + scheduler: + restart: always + build: + context: . + dockerfile: deploy/docker/scheduler.Dockerfile + environment: + - DATABASE_URL=postgresql://mtracker3:postgres@postgres:5432/mtracker3 + - REDIS_HOST=redis + links: + - redis + - postgres + web: + restart: always + build: + context: . + dockerfile: deploy/docker/web.Dockerfile + environment: + - DATABASE_URL=postgresql://mtracker3:postgres@postgres:5432/mtracker3 + - REDIS_HOST=redis + - LOG_DIRECTORY=/opt/logs + - PROXY_DEFAULT_PROXY + - PROXY_URL + - PROXY_METHOD + - PROXY_PATH + - MWDB_URL + - MWDB_TOKEN + ports: + - "127.0.0.1:80:5000" + volumes: + - "./data/logs:/opt/logs" + links: + - redis + - postgres + worker: + restart: always + build: + context: . + dockerfile: deploy/docker/worker.Dockerfile + environment: + - DATABASE_URL=postgresql://mtracker3:postgres@postgres:5432/mtracker3 + - REDIS_HOST=redis + - LOG_DIRECTORY=/opt/logs + - PROXY_DEFAULT_PROXY + - PROXY_URL + - PROXY_METHOD + - PROXY_PATH + - MWDB_URL + - MWDB_TOKEN + volumes: + - "./data/logs:/opt/logs" + - "./src/private_modules:/usr/src/app/src/modules" + links: + - redis + - postgres + command: bash -c "pip install -r /usr/src/app/src/modules/requirements.txt; python3 -m mtracker.worker /usr/src/app/src/modules" + redis: + restart: always + image: redis diff --git a/docs/moduledev.md b/docs/moduledev.md new file mode 100644 index 0000000..9aaaf34 --- /dev/null +++ b/docs/moduledev.md @@ -0,0 +1,145 @@ +# module development + +Mtracker is just a framework, and **won't work** without implementing modules. Module is a piece of code responsible for tracking a particular family. + +To run mtracker worker, you need to pass modules path to it, like + +``` +python3 -m mtracker.worker /opt/modules/path +``` + +The directory passed to mtracker worker must contain an `__init__` file that exposes a directory `trackers` with all supported modules. + +### a simple example + +Let's start with a trivial example. Assume that modules will reside in a `/opt/mtrackermodules` path. This means that you should create the following files: + +`/opt/mtrackermodules/__init__.py`: +```python +# Import your module from another file. +# Of course you can do everything in a single file, +# but that's a bad software development habit. +from .testmod.testmod import TestModule + +trackers = { + "testmod": TestModule, +} +``` + +And now we need to implement the module. We recommend to use a separate directory for every module, so create a directory `testmod` and add an empty file called `__init__.py`: + +``` +touch /opt/mtrackermodules/testmod/__init__.py +``` + +Finally, implement the module: + +`/opt/mtrackermodules/testmod/testmod.py` +```python +from typing import Dict, Any, Iterator +import time + +# Mtracker is a normal module, and you can import things from it. +from mtracker.bot import BotModule, BotResult, CNC + + +# In most cases, your module should derive from BotModule. +class TestModule(BotModule): + # Critical parameters - a bot won't be created if config is missing one of this parameters. + # In practice, put all things that must be in the config + # for the bot to work, like host IP and port. + CRITICAL_PARAMS = ["status", "sleep", "memory"] + + # Constructor is not required, but you might want to do some bot initialisation first. + def __init__( + self, config: Dict[str, Any], used_proxy: str, state: Dict[str, Any] + ) -> None: + super().__init__(config, used_proxy, state) + self.sleep = self.config["sleep"] + self.status = self.config["status"] + + # This method is required. `run` is called for every item returned from this method. + # For example, if there are 10 IPs in the config, you might want to iterate over them + # and yield every IP separately. + # In this example we just hardcode 127.0.0.1 as CNC. + @classmethod + def get_cnc_servers( + cls, config: Dict[str, Any], state: Dict[str, Any] + ) -> Iterator[CNC]: + yield "127.0.0.1" + + # This method should connect to C2 (using address c2) and + # download everything interesting. Read below for more information. + def run(self, c2: CNC) -> bool: + time.sleep(self.sleep) + + if self.status == "working": + # This will push blob result to mwdb and database. + self.push_blob( + content="This module is working", + name="test_blob", + blob_type="dyn_cfg", + tags=["testmod", "test"], + ) + # We got the results we needed + return BotResult.WORKING + else: + # We failed, continue to the next C2, if exists + return BotResult.CONTINUE +``` + +### Technical details + +There are some important technical details here. + +First, run() method is just a regular Python code. This means that you must implement proxy handling yourself. +Every module knows which proxy it should use when running, so +in most cases you can just use `self.proxy_dict`. For example: + +```python +result = requests.get(url, headers=headers, proxies=self.proxy_dict) +``` + +Second, to submit result you must use `self.push_*` methods. There are three kinds of data you can push, same as in MWDB: [samples](https://mwdb.readthedocs.io/en/latest/user-guide/2-Storing-malware-samples.html), [configurations](https://mwdb.readthedocs.io/en/latest/user-guide/3-Storing-malware-configurations.html) and [blobs](https://mwdb.readthedocs.io/en/latest/user-guide/4-Storing-blobs.html). + +Uploading files: +```python +self.push_binary( + data=self.dropped, # Bytes of the downloaded file + name=self.dropname or "ostap_drop.exe", # Name of the downloaded file + tags=["ostap_drop"], # Mwdb tags to include +) +``` + +Uploading configs: +```python +# `config` is a python dictionary with config data +self.push_config(config, "dynamic", ["dynamic:danabot"]) +``` + +Uploading blobs: +```python +self.push_blob( + content=commands, # Python string with blob data + name="gcleaner_commands", + blob_type="dyn_cfg", + tags=["dynamic:gcleaner"], +) +``` + +Of course, since it's a regular Python, you don't have to use these methods to upload data somewhere else. +For example, you may write your own push methods it if you don't want to store your data in mwdb. + +Finally, the result of run() method is a BotResult bitflag. There are three flags, `continue`, `workign` and `archive`. +There are a few combinations of flags that make most sense: + +* BotResult.WORKING - successfully downloaded data from C2, don't check other C2 servers (from `get_cnc_servers`) +* BotResult.WORKING | BotResult.CONTINUE - successfully downloaded data from C2, but check other C2 servers just in case +* BotResult.CONTINUE - didn't download data from C2. Continue checking other C2 servers just in case +* BotResult.ARCHIVE - archive this bot after the execution, no matter what happens (useful when invalid config is detected) + +### Local development + +(todo) + +That's it - that's everything you need to know to start writing your own mtracker modules. diff --git a/docs/mtracker.png b/docs/mtracker.png new file mode 100644 index 0000000..6fffb2f Binary files /dev/null and b/docs/mtracker.png differ diff --git a/docs/ui.png b/docs/ui.png new file mode 100644 index 0000000..ef5bea9 Binary files /dev/null and b/docs/ui.png differ diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..0642ed1 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,12 @@ +[tool.black] +target_version = ['py37'] +exclude = ''' +( + /( + | \.git + | \.mypy_cache + | \venv + | emotet_native_pb2.py + ) +) +''' diff --git a/pyrightconfig.json b/pyrightconfig.json new file mode 100644 index 0000000..bc86e50 --- /dev/null +++ b/pyrightconfig.json @@ -0,0 +1,11 @@ +{ + "include": [ + "src" + ], + "pythonVersion": "3.6", + "pythonPlatform": "Linux", + "executionEnvironments": [{ + "root": "src" + } + ] +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9a2a93f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,18 @@ +mwdblib==4.2.1 +flask_sqlalchemy==2.4.1 +flask==2.0.3 +psycopg2-binary==2.8.4 +rq==1.8.1 +rq-scheduler==0.9.1 +redis==3.5.0 +rq-dashboard==0.6.1 +PySocks==1.7.1 +pycrypto==2.6.1 +pycryptodomex==3.8.2 +wincrypto==0.3 +sqlmigrate==1.0.0 +bs4==0.0.1 +dateparser==0.7.6 +prometheus_client==0.9.0 +Werkzeug==2.2.2 +typed-config diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..1f2f112 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,10 @@ +[flake8] +ignore = E501,W503,E203 +exclude = venv/,emotet_native_pb2.py,__init__.py + + +[mypy] +python_version = 3.7 + +[mypy-modules.emotet.emotet_native_pb2] +ignore_errors=True diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..04c57d1 --- /dev/null +++ b/setup.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +from setuptools import setup + +setup( + name="mtracker", + version="1.0.0", + author="CERT Polska", + author_email="info@cert.pl", + description="A framework and web interface for botnet tracking", + packages=[ + "mtracker", + ], + package_dir={"mtracker": "src"}, + include_package_data=True, + url="https://github.com/CERT-Polska/mtracker", + install_requires=open("requirements.txt").read().splitlines(), + python_requires=">=3.7", + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Programming Language :: Python", + "Operating System :: OS Independent", + "OSI Approved :: BSD License", + "Topic :: Security", + ], +) diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/analysis_results.py b/src/analysis_results.py new file mode 100644 index 0000000..1e1f60a --- /dev/null +++ b/src/analysis_results.py @@ -0,0 +1,184 @@ +from typing import Dict, Any, List, Optional +import base64 + + +class GenericObject: + """Base class for result objects""" + + def __init__(self) -> None: + self.children: List[GenericObject] = [] + + def to_dict(self) -> Dict[str, Any]: + """Serialize object to json-dumpable dict + :return: dictionary with all of objects data + """ + return {"object": "object"} + + def to_dict_recursive(self) -> Dict[str, Any]: + """Serialize object and all of its children recursively to json-dumpable dict + :return: dictionary with all of objects and its childrens data + """ + self_dict = self.to_dict() + self_dict["children"] = [child.to_dict_recursive() for child in self.children] + return self_dict + + def push_config( + self, + config: Dict[str, Any], + config_type: str, + tags: Optional[List[str]] = None, + attributes: Optional[Dict[str, Any]] = None, + comments: Optional[List[str]] = None, + ) -> "Config": + """Add a result config + :param config: config data + :param config_type: config type, probably `dynamic` or `static` + :param tags: config tags to be added on mwdb, defaults to None + :param attributes: attributes to be added on mwdb, defaults to None + :param comments: comments to be added on mwdb, defaults to None + :return: appended config object + """ + cfg = Config( + config=config, + config_type=config_type, + tags=tags, + attributes=attributes, + comments=comments, + ) + self.children.append(cfg) + return cfg + + def push_binary( + self, + data: bytes, + name: str, + tags: Optional[List[str]] = None, + attributes: Optional[Dict[str, Any]] = None, + comments: Optional[List[str]] = None, + ) -> "Binary": + """Add a result binary + :param data: binary data + :param name: binary filename + :param tags: binary tags to be added on mwdb, defaults to None + :param attributes: attributes to be added on mwdb, defaults to None + :param comments: comments to be added on mwdb, defaults to None + :return: appended binary object + """ + binary = Binary( + data=data, name=name, tags=tags, attributes=attributes, comments=comments + ) + self.children.append(binary) + return binary + + def push_blob( + self, + content: str, + name: str, + blob_type: str, + tags: Optional[List[str]] = None, + attributes: Optional[Dict[str, Any]] = None, + comments: Optional[List[str]] = None, + ) -> "Blob": + """Add a result blob + :param content: blob data + :param name: blob filename + :param blob_type: blob type, usually `dyn_cfg` + :param tags: blob tags to be added on mwdb, defaults to None + :param attributes: attributes to be added on mwdb, defaults to None + :param comments: comments to be added on mwdb, defaults to None + :return: appended config blob + """ + blob = Blob( + content=content, + name=name, + blob_type=blob_type, + tags=tags, + attributes=attributes, + comments=comments, + ) + self.children.append(blob) + return blob + + +class Config(GenericObject): + def __init__( + self, + config: Dict[str, Any], + config_type: str, + tags: Optional[List[str]] = None, + attributes: Optional[Dict[str, Any]] = None, + comments: Optional[List[str]] = None, + ) -> None: + super().__init__() + self.config = config + self.config_type = config_type + self.tags = tags or [] + self.attributes = attributes or {} + self.comments = comments or [] + + def to_dict(self) -> Dict[str, Any]: + return { + "object": "config", + "config": self.config, + "config_type": self.config_type, + "tags": self.tags, + "attributes": self.attributes, + "comments": self.comments, + } + + +class Binary(GenericObject): + def __init__( + self, + data: bytes, + name: str, + tags: Optional[List[str]] = None, + attributes: Optional[Dict[str, Any]] = None, + comments: Optional[List[str]] = None, + ) -> None: + super().__init__() + self.data = data + self.name = name + self.tags = tags or [] + self.attributes = attributes or {} + self.comments = comments or [] + + def to_dict(self) -> Dict[str, Any]: + return { + "object": "binary", + "data": base64.b64encode(self.data).decode("utf-8"), + "name": self.name, + "tags": self.tags, + "attributes": self.attributes, + "comments": self.comments, + } + + +class Blob(GenericObject): + def __init__( + self, + content: str, + name: str, + blob_type: str, + tags: Optional[List[str]] = None, + attributes: Optional[Dict[str, Any]] = None, + comments: Optional[List[str]] = None, + ) -> None: + super().__init__() + self.content = content + self.name = name + self.blob_type = blob_type + self.tags = tags or [] + self.attributes = attributes or {} + self.comments = comments or [] + + def to_dict(self) -> Dict[str, Any]: + return { + "object": "blob", + "content": self.content, + "blob_type": self.blob_type, + "name": self.name, + "tags": self.tags, + "attributes": self.attributes, + "comments": self.comments, + } diff --git a/src/bot.py b/src/bot.py new file mode 100644 index 0000000..93595cd --- /dev/null +++ b/src/bot.py @@ -0,0 +1,252 @@ +import abc +import logging +import re +from abc import ABC, abstractmethod +from enum import auto, IntFlag +from typing import Any, Dict, Iterator, List, Optional, Tuple, Union, NamedTuple + +from requests import get +from werkzeug.http import parse_options_header + +from .model import Status, Task +from .analysis_results import GenericObject, Binary, Blob, Config + + +class BotResult(IntFlag): + """Flags to be used as a return value from an execution of a server in a bot. A bot can return + any combination of these flags to provide MTracker with instructions how to handle the execution. + """ + # The default value of 0 means that the bot is not working, but don't continue nor archive it. + # This goes without saying, but there's no point in combining this "flag" with anything. + # EMPTY | WORKING means just WORKING. + # In most cases returning CONTINUE is a much better option. + EMPTY = 0 + + # If this flag is set, the execution will be treated as a success. + # Otherwise, it'll be treated as a soft-fail (independed of if anything was downloaded). + WORKING = auto() + + # If this flag is set, mtracker will continue downloading samples from this config. + # This matters only when there is more than one C2 server available. + CONTINUE = auto() + + # If this flag is set, bot will be archived after completing the execution. + # It's pointless to set this both flag and WORKING (ARCHIVE takes precedence). + # This can be used carefully with CONTINUE - bot will continue other C2s, but will + # be archived in the end regardless of what happens. + ARCHIVE = auto() + + + +CNC = Union[str, Tuple[str, int]] + + +def convert_proxy(proxy_string: str) -> Tuple[str, str, int]: + if "://" not in proxy_string: + raise RuntimeError(f"Expected socks*://host:port, got {proxy_string}") + proxy_type, proxy_loc = proxy_string.split("://") + proxy_host = proxy_loc.split(":")[0] + proxy_port = int(proxy_loc.split(":")[-1]) + return proxy_type, proxy_host, proxy_port + + +class TaskResult(NamedTuple): + status: Status + results: GenericObject + state: Dict[str, Any] + + @staticmethod + def empty(status: Status, state: Dict[str, Any]) -> "TaskResult": + return TaskResult(status, GenericObject(), state) + + @staticmethod + def archived() -> "TaskResult": + return TaskResult.empty(Status.ARCHIVED, {}) + + @staticmethod + def failing() -> "TaskResult": + return TaskResult.empty(Status.ARCHIVED, {}) + + +class ModuleBase(ABC): + """A base class for all module types + CRITICAL_PARAMS - list of static config parameters that are *crucial* to the working of the tracker + FAMILY - name of the family that the tracker should report results for + PROXY_WHITELIST - list of proxy countries to run this module on, None = all + """ + + CRITICAL_PARAMS: List[str] = [] + FAMILY: str = "" + PROXY_WHITELIST: Optional[List[str]] = None + + def __init__( + self, config: Dict[str, Any], used_proxy: str, state: Dict[str, Any] + ) -> None: + """Initialization function for module, executed only once. + :param config: input static config + :param used_proxy: proxy to be used for communication + :param state: saved state, gets copied between runs for the same config, must be json-serializable + """ + self.config = config + self.state = state + self.log = logging.getLogger("rq.worker") + self.used_proxy = used_proxy + self.proxy_type, self.proxy_host, self.proxy_port = convert_proxy(used_proxy) + self.proxy_dict = {"http": used_proxy, "https": used_proxy} + + @abstractmethod + def execute_task(self) -> TaskResult: + raise NotImplementedError() + + +class BotModule(ModuleBase): + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + self._results = GenericObject() + + @abc.abstractclassmethod + def get_cnc_servers( + cls, config: Dict[str, Any], state: Dict[str, Any] + ) -> Iterator[CNC]: + """Use config items and/or saved state items to c2s to connect to + :param config: static config + :param state: bots saved state + :raises NotImplementedError: this needs to be implemented in each module + """ + raise NotImplementedError("get_cnc_servers() not implemented()") + + @abc.abstractmethod + def run(self, c2: CNC) -> BotResult: + """Module entry point, any errors here will be treated as a normal bot fail + :raises NotImplementedError: this needs to be implemented in each module + :return: was the run successful, if not, another c2 will be tried + """ + raise NotImplementedError("run() not implemented") + + def push_binary( + self, + data: bytes, + name: str, + tags: Optional[List[str]] = None, + attributes: Optional[Dict[str, Any]] = None, + comments: Optional[List[str]] = None, + ) -> Binary: + """Add a result binary + :param data: binary data + :param name: binary filename + :param tags: binary tags to be added on mwdb, defaults to None + :param attributes: attributes to be added on mwdb, defaults to None + :param comments: comments to be added on mwdb, defaults to None + :return: appended binary object + """ + return self._results.push_binary(data, name, tags, attributes, comments) + + def push_blob( + self, + content: str, + name: str, + blob_type: str, + tags: Optional[List[str]] = None, + attributes: Optional[Dict[str, Any]] = None, + comments: Optional[List[str]] = None, + ) -> Blob: + """Add a result blob + :param content: blob data + :param name: blob filename + :param blob_type: blob type, usually `dyn_cfg` + :param tags: blob tags to be added on mwdb, defaults to None + :param attributes: attributes to be added on mwdb, defaults to None + :param comments: comments to be added on mwdb, defaults to None + :return: appended blob object + """ + return self._results.push_blob( + content, name, blob_type, tags, attributes, comments + ) + + def push_config( + self, + config: Dict[str, Any], + config_type: str, + tags: List[str] = None, + family: Optional[str] = None, + attributes: Optional[Dict[str, Any]] = None, + comments: Optional[List[str]] = None, + ) -> Config: + """Add a result config + :param config: config data + :param config_type: config type, probably `dynamic` or `static` + :param tags: config tags to be added on mwdb (default: {None}), defaults to None + :param family: config family, defaults to None + :param attributes: attributes to be added on mwdb, defaults to None + :param comments: comments to be added on mwdb, defaults to None + :return: appended config object + """ + config["type"] = family or self.FAMILY + return self._results.push_config(config, config_type, tags, attributes, comments) + + def execute_task(self) -> TaskResult: + status = Status.FAILING + + final_working = 0 + final_archive = 0 + + for c2 in self.__class__.get_cnc_servers(self.config, self.state): # type: ignore + self.log.info("Running module.run for %s", c2) + try: + run_result = self.run(c2) + + # Check if the status of this config should be WORKING + final_working |= run_result & BotResult.WORKING + + # Check if this config should be archived when finishing + final_archive |= run_result & BotResult.ARCHIVE + + if run_result & BotResult.WORKING: + logging.info("Found config using %s", c2) + + # Check whether we should continue to the next C2 in the config + if not run_result & BotResult.CONTINUE: + break + + except Exception as e: + self.log.exception("run() failed with %s", str(e)) + + if final_archive: + status = Status.ARCHIVED + elif final_working: + status = Status.WORKING + + return TaskResult(status, self._results, self.state) + + +class Dropper(BotModule): + """An extension class for simple dropper modules""" + + DEFAULT_HEADERS = { + "User-Agent": "Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)" + } + + def download_drop(self, url: str, headers: Optional[Dict[str, str]]=None) -> Optional[Tuple[bytes, str]]: + """Add a result binary + :param url: url to download + :param headers: override the default headers + :return: tuple of response data and downloaded filename + """ + if headers is None: + headers = self.DEFAULT_HEADERS + + response = get( + url, proxies=self.proxy_dict, headers=headers, stream=True, timeout=10.0 + ) + if response.status_code != 200: + return None + + filename = None + if "Content-Disposition" in response.headers.keys(): + parsed = parse_options_header(response.headers["Content-Disposition"]) + if "filename" in parsed[1]: + filename = parsed[1]["filename"] + + if not filename: + filename = url[url.rfind("/") + 1 :] or "sample" + return (response.content, filename) diff --git a/src/config.py b/src/config.py new file mode 100644 index 0000000..dc9779d --- /dev/null +++ b/src/config.py @@ -0,0 +1,89 @@ +from typedconfig import Config, key, section, group_key # type: ignore +from typedconfig.source import EnvironmentConfigSource, IniFileConfigSource # type: ignore +import os + + +@section("mtracker") +class MtrackerConfig(Config): + # How many times can a task fail before being archived + max_failing_spree = key(cast=int, required=False, default=5) + # How long can a single task take before being killed, in seconds + task_timeout = key(cast=int, required=False, default=900) + # How often should tasks be restarted/tried again + task_period = key(cast=int, required=False, default=43200) + # A default timeout that should be used for HTTP requests + default_http_timeout = key(cast=int, required=False, default=3) + + +@section("log") +class LogConfig(Config): + # Only "filesystem" provider is supported + provider = key(cast=str, required=False, default="filesystem") + # Directory where to store the logs + dir = key(cast=str, required=False, default="/tmp/logs") + + +@section("mwdb") +class MwdbConfig(Config): + # Mwdb base URL without trailing slash, for example "https://mwdb.cert.pl" + url = key(cast=str, required=False, default="https://mwdb.cert.pl") + # If the desired MWDB API is *not* just MWDB_URL/api, you can override it here + api_url_override = key(cast=str, required=False, default=None) + # Token used to authenticate to mwdb. + token = key(cast=str, required=True, default="") + + @property + def api_url(self): + """Gets a correct MWDB API URL (either the default, or override).""" + return self.api_url_override or self.url + "/api" + + +@section("database") +class DatabaseConfig(Config): + # URL of a configured sql database. + url = key( + cast=str, required=False, default="postgresql://mtracker3:postgres@localhost:5432/mtracker3" + ) + + +@section("proxy") +class ProxyConfig(Config): + # Default proxy country, for example "us" + default = key(cast=str, required=True, default=None) + # One of "url" or "file" + method = key(cast=str, required=True, default=None) + # Relevant if METHOD is "url" + url = key(cast=str, required=False, default=None) + # Relevant if METHOD is "file" + path = key(cast=str, required=False, default="/etc/proxies/proxies.json") + + +@section("redis") +class RedisConfig(Config): + # Hostname of a configured redis instance. + host = key(cast=str, required=False, default="localhost") + # Port of a configured redis instance. + port = key(cast=int, required=False, default=6379) + + +class AppConfig(Config): + mtracker: MtrackerConfig = group_key(MtrackerConfig) + log: LogConfig = group_key(LogConfig) + mwdb: MwdbConfig = group_key(MwdbConfig) + redis: RedisConfig = group_key(RedisConfig) + database: DatabaseConfig = group_key(DatabaseConfig) + proxy: ProxyConfig = group_key(ProxyConfig) + + +def _config_sources(): + return [ + EnvironmentConfigSource(), + IniFileConfigSource("mtracker.ini", must_exist=False), + IniFileConfigSource( + os.path.expanduser("~/.config/mtracker/mtracker.ini"), must_exist=False + ), + IniFileConfigSource("/etc/mtracker/mtracker.ini", must_exist=False), + ] + + +app_config = AppConfig(sources=_config_sources()) diff --git a/src/config_data.py b/src/config_data.py new file mode 100644 index 0000000..da96dd7 --- /dev/null +++ b/src/config_data.py @@ -0,0 +1,123 @@ +from urllib.parse import urlparse +from typing import Optional, Dict, Any, List + + +def normalise_url(raw_url): + return urlparse(raw_url).geturl() + + +class ConfigData: + def __init__(self, family: str) -> None: + self.__data: Dict[str, Any] = {"type": family} + + def __bool__(self) -> bool: + # the config structure has more than data than just the family + return len(self.__data.keys()) > 1 + + def __add(self, type: str, value: Any): + if type not in self.__data: + self.__data[type] = [] + if value not in self.__data[type]: + self.__data[type].append(value) + + def __add_action( + self, + type: str, + url_pattern: str, + keys: Optional[Dict[str, Any]] = None, + ) -> None: + data = {"type": type, "url_pattern": url_pattern} + if keys: + data.update(keys) + self.__add("actions", data) + + def __add_malicious_url(self, raw_url: str) -> None: + self.__add("malicious_url", normalise_url(raw_url)) + + def serialize(self) -> Dict[str, Any]: + return self.__data + + def add_c2(self, url: str) -> None: + self.__add("c2", url) + self.__add_malicious_url(url) + + def add_malicious_netloc(self, netloc: str) -> None: + self.__add("malicious_netloc", netloc) + + def add_malicious_url(self, url: str) -> None: + self.__add_malicious_url(url) + + def add_screenshot_action(self, target: str) -> None: + self.__add_action("screenshot", target) + + def add_record_action(self, target: str) -> None: + self.__add_action("record", target) + + def add_block_action(self, target: str) -> None: + self.__add_action("block", target) + + def add_redirect_action(self, from_: str, to: str): + self.__add_action("redirect", from_, {"to": to}) + + def add_hide_action(self, target: str) -> None: + self.__add_action("hide", target) + + def add_filter_action(self, target: str) -> None: + self.__add_action("filter", target) + + def add_vnc_action(self, target: str, sources: List[str]): + self.__add_action("vnc", target, {"servers": sources}) + + def add_dynamic_inject(self, url_pattern: str, server_url: str) -> None: + self.__add( + "dynamic_injects", + {"url_pattern": url_pattern, "server_url": server_url}, + ) + self.add_malicious_url(server_url) + + def add_data_steal(self, url_pattern: str, server_url: str) -> None: + self.__add_action("steal_data", url_pattern, {"server_url": server_url}) + self.add_malicious_url(server_url) + + def validate_and_add_action(self, raw_action: Dict[str, Any]) -> None: + act_type = raw_action["type"] + url_pattern = raw_action["url_pattern"] + + params = dict(raw_action) + del params["type"] + del params["url_pattern"] + keys = list(params.keys()) + keys.sort() + + expected_keys: Dict[str, List[str]] = { + "redirect": ["to"], + "hide": [], + "vnc": ["servers"], + "dynamic_injects": ["url_pattern", "server_url"], + "steal_data": ["server_url"], + } + if act_type not in expected_keys: + raise RuntimeError(f"Adding action of unrecognised type: {act_type}") + expected = expected_keys[act_type] + expected.sort() + + if keys != expected: + raise RuntimeError(f"Invalid keys. Has {keys} expected {expected}") + + self.__add_action(act_type, url_pattern, params) + + def add_inject( + self, + url_pattern: str, + data_before: str, + data_inject: str, + data_after: Optional[str] = None, + ) -> None: + elm = { + "url_pattern": url_pattern, + "data_before": data_before, + "data_inject": data_inject, + } + if data_after: + elm["data_after"] = data_after + self.__add("injects", elm) diff --git a/src/error_handler.py b/src/error_handler.py new file mode 100644 index 0000000..5ae7351 --- /dev/null +++ b/src/error_handler.py @@ -0,0 +1,31 @@ +import logging +import traceback + +from . import model +from .config import app_config + + +log = logging.getLogger(__name__) + + +def report_crashed(job, exc_type, exc_value, tb): + log.info("Reporting crashed job to the db") + + bot_id = job.kwargs["bot_id"] + task_id = job.kwargs["task_id"] + + # save short exception as "last error" and store the full exception in the logfile + exc_full_text = "".join(traceback.format_exception(exc_type, exc_value, tb)) + if app_config.log.provider == "filesystem": + with model.Task.get_log_path(task_id).open("a") as f: + f.write(exc_full_text) + else: + raise NotImplementedError + + with model.database_connection() as connection: + cur = connection.cursor() + exc_text = "".join(traceback.format_exception_only(exc_type, exc_value)) + model.Bot.set_crashed(cur=cur, bot_id=bot_id, reason=exc_text) + model.Task.update_after_run( + cur=cur, task_id=task_id, status=model.Status.CRASHED + ) diff --git a/src/fetch.py b/src/fetch.py new file mode 100644 index 0000000..7effebf --- /dev/null +++ b/src/fetch.py @@ -0,0 +1,104 @@ +import argparse +import json +import logging +from random import choice +import sys + +from .config import app_config +from . import report_fetch +from . import utils +from .bot import ModuleBase +from .modules import ModuleManager +from .model import Proxy + + +logging.basicConfig(level=logging.DEBUG) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--hash", help="input hash") + parser.add_argument( + "--proxy", + help="specify proxy two-letter country code (e.g. 'gb')", + nargs="?", + default=app_config.proxy.default + ) + parser.add_argument( + "--file", "-f", help="use static config read from file" + ) + parser.add_argument( + "--modules", "-m", help="Path to mtracker modules" + ) + parser.add_argument( + "--out", + help="specify how the results should be presented", + nargs="?", + default="stdout", + choices=["stdout", "db", "file"], + ) + args = parser.parse_args() + + trackers = ModuleManager.load(args.modules) + + if args.file: + with open(args.file, "r") as f: + static_config = json.loads(f.read()) + config_hash = utils.config_dhash(static_config) + else: + mwdb = utils.get_mwdb() + mwdb_cfg = mwdb.query_config(hash=args.hash, raise_not_found=False) + if not mwdb_cfg: + logging.error("Couldn't find the requestsed config on mwdb") + return 1 + static_config = mwdb_cfg.cfg + config_hash = args.hash + + config_type = static_config.get("type", None) + if not config_type: + logging.error("Config type can't be empty") + return 1 + + if config_type not in trackers: + logging.error("Couldn't find a matching module") + return 1 + + proxies = utils.get_proxies() + + try: + proxy = choice([ + proxy for proxy in proxies if proxy['country'] == args.proxy + ]) + except IndexError: + logging.error( + "Couldn't find any proxy with country %s", + args.proxy, + ) + return 1 + + connection_string = Proxy.deserialize(proxy).connection_string + + static_config["_id"] = config_hash + cls = trackers[config_type] + mod = cls(config=static_config, used_proxy=connection_string, state={}) + + logging.info("Executing module") + if isinstance(mod, ModuleBase): + task_result = mod.execute_task() + + # Reporting the results according to the --out arg + report_fcn = report_fetch.report_stdout + if args.out == "stdout": + report_fcn = report_fetch.report_stdout + elif args.out == "db": + report_fcn = report_fetch.report_mwdb + elif args.out == "file": + report_fcn = report_fetch.report_file + + report_fcn(config_hash, task_result.results) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/src/loader.py b/src/loader.py new file mode 100644 index 0000000..6bb85d5 --- /dev/null +++ b/src/loader.py @@ -0,0 +1,51 @@ +import logging +import pkgutil +import sys +from importlib.util import module_from_spec, spec_from_file_location +from typing import Type, Dict + +from .bot import ModuleBase + + +log = logging.getLogger(__name__) + + +class ModuleManager: + @classmethod + def load(cls, modules_path: str): + cls.trackers = load_trackers(modules_path) + return cls.trackers + + @classmethod + def get(cls): + return cls.trackers + + +def load_trackers(modules_path: str) -> Dict[str, Type[ModuleBase]]: + """Load trackers from a given modules directory. The path must point + at a directory with a __init__.py file, that contains a dictionary + called trackers with a list of trackers. A valid __init__.py file + may look like this: + + from .isfb.isfb import ISFB + trackers = { + "isfb" : ISFB, + } + + This will return a single module for ISFB malware, called "isfb". + """ + for finder, module_name, x in pkgutil.iter_modules([modules_path], "mtracker.modules."): + log.info(f"Loading %s", module_name) + module_spec = finder.find_spec(module_name) + assert module_spec is not None # We just got it from pkgutil + module = module_from_spec(module_spec) + sys.modules[module_name] = module + + spec = spec_from_file_location("mtracker.modules", modules_path + "/__init__.py") + if spec is None or spec.loader is None: + raise RuntimeError("Modules directory is missing the __init__.py file.") + + module = module_from_spec(spec) + spec.loader.exec_module(module) + log.info("Loaded the following modules: %s", ", ".join(module.trackers.keys())) + return module.trackers diff --git a/src/model.py b/src/model.py new file mode 100644 index 0000000..4359129 --- /dev/null +++ b/src/model.py @@ -0,0 +1,865 @@ +import json +from collections import defaultdict, namedtuple +from datetime import datetime +from enum import IntEnum +from pathlib import Path +from typing import Any, Dict, List, Optional, NamedTuple + +import psycopg2 # type: ignore +from psycopg2.extensions import connection, cursor # type: ignore + +from .config import app_config + + +def database_connection() -> connection: + return psycopg2.connect(app_config.database.url) + + +class TrackerModule(NamedTuple): + family: str + critical_params: List[str] = [] + proxy_whitelist: Optional[List[str]] = None + + +class Status(IntEnum): + """Generic status codes, the idea is to chose such values so that + a status for an upper member can be calculated using min(children.status) + """ + + CRASHED = 0 + INPROGRESS = 1 + WORKING = 2 + FAILING = 3 + NEW = 4 + ARCHIVED = 5 + + +ServiceMetrics = namedtuple("ServiceMetrics", ["bot_stats", "task_stats", "trackers"]) + + +STATUS_DB: Dict[Status, str] = { + Status.CRASHED: "crashed", + Status.INPROGRESS: "inprogress", + Status.WORKING: "working", + Status.FAILING: "failing", + Status.NEW: "new", + Status.ARCHIVED: "archived", +} + + +def get_metrics(cur: cursor) -> ServiceMetrics: + cur.execute( + """SELECT b.family, b.status, COUNT(*) + FROM bots b + GROUP BY b.status, b.family""" + ) + bot_stats = cur.fetchall() + + cur.execute( + """SELECT t.status, COUNT(*) + FROM tasks t + GROUP BY t.status""" + ) + task_stats = cur.fetchall() + + cur.execute("SELECT COUNT(*) FROM trackers") + trackers = cur.fetchone()[0] + return ServiceMetrics(bot_stats, task_stats, trackers) + + +def get_status(cur: cursor) -> Dict[str, Any]: + cur.execute( + """SELECT + SUM(CASE WHEN status = 'crashed' THEN 1 ELSE 0 END), + SUM(CASE WHEN status = 'inprogress' THEN 1 ELSE 0 END), + SUM(CASE WHEN status = 'working' OR status = 'new' THEN 1 ELSE 0 END), + SUM(CASE WHEN status = 'failing' THEN 1 ELSE 0 END), + SUM(CASE WHEN status = 'archived' THEN 1 ELSE 0 END) + FROM bots""" + ) + crashed, progress, alive, failing, archived = cur.fetchall()[0] + + return { + "counters": { + "alive": alive, + "archived": archived, + "crashed": crashed, + "failing": failing, + "progress": progress, + } + } + + +class Proxy: + def __init__( + self, + proxy_id: int, + host: str, + port: int, + country: str, + username: Optional[str] = None, + password: Optional[str] = None, + ) -> None: + """Class used for mapping proxies from database + :param proxy_id: proxy id + :param host: proxy host + :param port: proxy port + :param country: ISO 3166 2-letter country code for proxy + :param username: proxy username (optional) + :param password: proxy password (optional) + """ + self.proxy_id = proxy_id + self.host = host + self.port = port + self.country = country + self.username = username + self.password = password + + def serialize(self) -> Dict[str, Any]: + return { + "proxy_id": self.proxy_id, + "host": self.host, + "port": self.port, + "country": self.country, + "username": self.username, + "password": self.password, + } + + @property + def connection_string(self) -> str: + if self.username and self.password: + # Authenticate using username and password + return f"socks5h://{self.username}:{self.password}@{self.host}:{self.port}" + else: + return f"socks5h://{self.host}:{self.port}" + + @staticmethod + def fetch_all(cur: cursor) -> List["Proxy"]: + cur.execute("SELECT * FROM proxies ORDER BY country") + return [Proxy(*x) for x in cur.fetchall()] + + @staticmethod + def insert( + cur: cursor, + host: str, + port: int, + country: str, + username: Optional[str], + password: Optional[str], + ) -> int: + cur.execute( + "INSERT INTO proxies(host, port, country, username, password) VALUES(%s, %s, %s, %s, %s) RETURNING proxy_id", + (host, port, country, username, password), + ) + return int(cur.fetchone()[0]) + + @staticmethod + def delete(cur: cursor, host: str, port: int, country: str) -> None: + cur.execute( + "DELETE FROM proxies WHERE host=%s AND port=%s AND country=%s", + (host, port, country), + ) + + @staticmethod + def get_countries(cur: cursor) -> Dict[str, List["Proxy"]]: + proxies = Proxy.fetch_all(cur) + countries: Dict[str, List["Proxy"]] = defaultdict(list) + for proxy in proxies: + countries[proxy.country].append(proxy) + return countries + + @staticmethod + def synchronize_proxies( + cur: cursor, new_proxies: List[Dict[str, Any]] + ) -> Dict[str, List[Dict[str, Any]]]: + """Calculate the difference between current proxies and a list of new proxies""" + proxies = [ + { + "host": p.host, + "port": p.port, + "country": p.country, + "username": p.username, + "password": p.password, + } + for p in Proxy.fetch_all(cur) + ] + delete_list: List[Dict[str, Any]] = proxies + insert_list: List[Dict[str, Any]] = [] + + for new in new_proxies: + n = { + "host": new["host"], + "port": new["port"], + "country": new["country"], + "username": new["username"], + "password": new["password"], + } + if n in proxies: + delete_list.remove(n) + else: + assert n not in insert_list + insert_list.append(n) + + for d in delete_list: + Proxy.delete(cur, d["host"], d["port"], d["country"]) + for i in insert_list: + Proxy.insert( + cur, i["host"], i["port"], i["country"], i["username"], i["password"] + ) + + return {"added": insert_list, "deleted": delete_list} + + @staticmethod + def deserialize(proxy: Dict[str, Any]) -> "Proxy": + return Proxy( + proxy["id"], + proxy["host"], + int(proxy["port"]), + proxy["country"], + proxy.get("username", None), + proxy.get("password", None), + ) + + +class TaskView: + """A variant of Task with included joined elements from other tables - number of results, family and last error.""" + def __init__( + self, + task_id: int, + bot_id: int, + status: Status, + report_time: datetime, + logs: str, + family: str, + fail_reason: str, + results_no: int, + ) -> None: + self.task_id = task_id + self.bot_id = bot_id + self.status = status + self.report_time = report_time + self.logs = logs + self.family = family + self.results_no = results_no + self.fail_reason = fail_reason + + QUERY = """SELECT t.task_id, t.bot_id, t.status, t.report_time, t.logs, MIN(b.family), MIN(b.last_error), COUNT(r.*) + FROM tasks t + LEFT JOIN results r ON t.task_id=r.task_id + INNER JOIN bots b ON b.bot_id=t.bot_id""" + + @staticmethod + def get_by_id(cur: cursor, task_id: int) -> Optional["TaskView"]: + cur.execute( + f"""{TaskView.QUERY} + WHERE t.task_id=%s + GROUP BY t.task_id""", + (task_id,) + ) + data = cur.fetchone() + if not data: + return None + return TaskView(*data) + + @staticmethod + def get_by_bot_id( + cur: cursor, bot_id: int, count: int = 100, start: int = 0 + ) -> List["TaskView"]: + cur.execute( + f"""{TaskView.QUERY} + GROUP BY t.task_id + HAVING t.bot_id=%s + ORDER BY t.task_id DESC + LIMIT %s OFFSET %s""", + (bot_id, count, start), + ) + data = cur.fetchall() + return [TaskView(*x) for x in data] + + @staticmethod + def fetch_all(cur: cursor, limit: int = 100, start: int = 0, status: Optional[Status] = None) -> List["TaskView"]: + cur.execute( + f"""{TaskView.QUERY} + WHERE t.status=%s OR %s IS NULL + GROUP BY t.task_id + ORDER BY t.task_id DESC + OFFSET %s LIMIT %s""", + (status, status, start, limit), + ) + data = cur.fetchall() + return [TaskView(*x) for x in data] + + +class Task: + def __init__( + self, + task_id: int, + bot_id: int, + status: Status, + report_time: datetime, + logs: str, + ) -> None: + """Class used for mapping tasks from database + :param task_id: task id + :param job_id: RQ job id + :param bot_id: parent bot id + :param report_time: when the task has been reported + :param status: last tasks status + :param logs: worker log + """ + self.task_id = task_id + self.bot_id = bot_id + self.status = status + self.report_time = report_time + self.logs = logs + + @staticmethod + def get_log_path(task_id: int) -> Path: + Path(app_config.log.dir).mkdir(exist_ok=True) + return Path(app_config.log.dir) / f"{task_id}.log" + + def serialize(self) -> Dict[str, Any]: + return { + "taskId": str(self.task_id), + "botId": self.bot_id, + "startTime": str(self.report_time), + "status": self.status, + } + + @staticmethod + def create(cur: cursor, bot_id: int, status: Status) -> int: + report_time = datetime.now() + cur.execute( + "INSERT INTO tasks(bot_id, status, report_time)" + "VALUES (%s, %s, %s) RETURNING task_id", + (bot_id, STATUS_DB[status], report_time), + ) + (task_id,) = cur.fetchone() + return task_id + + @staticmethod + def update_after_run(cur: cursor, task_id: int, status: Status) -> None: + cur.execute( + "UPDATE tasks SET status=%s WHERE task_id=%s", + (STATUS_DB[status], task_id), + ) + + @staticmethod + def count(cur: cursor, status: Optional[Status] = None) -> int: + cur.execute("SELECT COUNT(*) FROM tasks WHERE status=%s OR %s IS NULL", (status, status)) + return int(cur.fetchone()[0]) + + +class Bot: + def __init__( + self, + bot_id: int, + tracker_id: int, + status: Status, + state: str, + failing_spree: int, + next_execution: datetime, + country: str, + last_error: str, + family: str, + ) -> None: + """Class used for mapping bots from database + :param bot_id: bots id + :param tracker_id: tracker id + :param state: json encoded bots state that is passed between executions + :param failing_spree: how many times has this bot failed in a row + :param next_execution: time of next scheduled execution + :param country: country this bot represents + :param status: bots status + :param family: bot family + """ + self.bot_id = bot_id + self.tracker_id = tracker_id + self.status = status + self.state = state + self.failing_spree = failing_spree + self.next_execution = next_execution + self.country = country + self.last_error = last_error + self.family = family + + self.configs: List[Result] = [] + self.blobs: List[Result] = [] + self.binaries: List[Result] = [] + + @staticmethod + def update_after_run( + cur: cursor, + bot_id: int, + state: Optional[str], + status: Status, + next_execution: datetime, + last_error: Optional[str] = None, + ) -> None: + """Update the bot object after a run + :param cur: database connection cursor + :param bot_id: bot id + :param state: serialized bot internal state + :param status: task status + :param next_execution: time of next execution to be scheduled + :param last_error: (Optional) fail reason + """ + if status == Status.WORKING: + # clear the spree and set status + Bot.set_worked(cur=cur, bot_id=bot_id) + elif status == Status.FAILING: + # increment spree, set status and archive if over maximum failing spree + Bot.set_failed( + cur=cur, bot_id=bot_id, reason=last_error or "Failed to get config" + ) + elif status == Status.ARCHIVED: + Bot.set_archived(cur=cur, bot_id=bot_id) + elif status == Status.CRASHED: + # No need to update anything, bot is already marked as crashed + # by the error handler. + return + else: + raise Exception(f"Unexpected bot status {status}") + + cur.execute( + """UPDATE bots + SET state=COALESCE(%s, state), next_execution=%s + WHERE bot_id=%s + """, + (state, next_execution, bot_id), + ) + + def serialize(self) -> Dict[str, Any]: + return { + "botId": self.bot_id, + "trackerId": self.tracker_id, + "trackerName": f"{self.tracker_id}_{self.family}", + "failingSpree": self.failing_spree, + "status": self.status, + "proxyCountry": self.country, + "running": self.status == Status.INPROGRESS, + "nextExecution": self.next_execution, + "lastError": self.last_error, + "state": self.state, + "binaries": [b.serialize() for b in self.binaries], + "blobs": [b.serialize() for b in self.blobs], + "configs": [b.serialize() for b in self.configs], + } + + @staticmethod + def set_statuses(cur: cursor, bot_ids: List[int], status: Status) -> None: + cur.execute( + "UPDATE bots SET status=%s WHERE bot_id = ANY (%s)", + (STATUS_DB[status], bot_ids), + ) + cur.execute( + """SELECT DISTINCT tracker_id + FROM bots + WHERE bot_id = ANY (%s)""", + (bot_ids,), + ) + tracker_ids = [x[0] for x in cur.fetchall()] + Tracker.update_statuses(cur=cur, tracker_ids=tracker_ids) + + @staticmethod + def clear_sprees(cur: cursor, bot_ids: List[int]) -> None: + cur.execute( + "UPDATE bots SET failing_spree=0 WHERE bot_id = ANY (%s)", (bot_ids,) + ) + + @staticmethod + def revive(cur: cursor, bot_ids: List[int]) -> None: + Bot.clear_sprees(cur, bot_ids) + Bot.set_statuses(cur, bot_ids, Status.WORKING) + + @staticmethod + def set_crashed(cur: cursor, bot_id: int, reason: str) -> None: + cur.execute( + """UPDATE bots + SET status=%s, last_error=%s + WHERE bot_id=%s + RETURNING tracker_id""", + (STATUS_DB[Status.CRASHED], reason, bot_id), + ) + tracker_id = int(cur.fetchone()[0]) + Tracker.update_statuses(cur, [tracker_id]) + + @staticmethod + def set_worked(cur: cursor, bot_id: int) -> None: + cur.execute( + """UPDATE bots + SET status=%s, last_error=%s, failing_spree=0 + WHERE bot_id=%s + RETURNING tracker_id""", + (STATUS_DB[Status.WORKING], "", bot_id), + ) + tracker_id = int(cur.fetchone()[0]) + Tracker.update_statuses(cur, [tracker_id]) + + @staticmethod + def set_failed(cur: cursor, bot_id: int, reason: str) -> None: + status = Status.FAILING + cur.execute("SELECT failing_spree FROM bots WHERE bot_id=%s", (bot_id,)) + (failing_spree,) = cur.fetchone() + + failing_spree += 1 + if failing_spree > app_config.mtracker.max_failing_spree: + status = Status.ARCHIVED + + cur.execute( + """UPDATE bots + SET status=%s, last_error=%s, failing_spree=%s + WHERE bot_id=%s + RETURNING tracker_id""", + (STATUS_DB[status], reason, failing_spree, bot_id), + ) + tracker_id = int(cur.fetchone()[0]) + Tracker.update_statuses(cur, [tracker_id]) + + @staticmethod + def set_archived(cur: cursor, bot_id: int) -> None: + cur.execute( + """UPDATE bots + SET status=%s, last_error=%s, failing_spree=0 + WHERE bot_id=%s + RETURNING tracker_id""", + (STATUS_DB[Status.ARCHIVED], "", bot_id), + ) + tracker_id = int(cur.fetchone()[0]) + Tracker.update_statuses(cur, [tracker_id]) + + @staticmethod + def get_by_id(cur: cursor, bot_id: int) -> Optional["Bot"]: + cur.execute("SELECT * FROM bots WHERE bot_id=%s", (bot_id,)) + data = cur.fetchone() + if not data: + return None + return Bot(*data) + + @staticmethod + def create(cur: cursor, tracker_id: int, country: str, family: str) -> int: + state = json.dumps({}) + status = STATUS_DB[Status.NEW] + failing_spree = 0 + next_execution = datetime.now() + cur.execute( + """INSERT INTO bots(tracker_id, status, state, failing_spree, next_execution, country, family) + VALUES (%s, %s, %s, %s, %s, %s, %s) + RETURNING bot_id""", + (tracker_id, status, state, failing_spree, next_execution, country, family), + ) + (bot_id,) = cur.fetchone() + return bot_id + + @staticmethod + def fetch_pending(cur: cursor, before: datetime) -> List["Bot"]: + """Fetch bots that should be executed + :return: List of pending bots + """ + cur.execute( + """SELECT * FROM bots + WHERE (next_execution < %s OR next_execution IS NULL) + AND status IN ('working', 'failing', 'new') + ORDER BY next_execution ASC""", + (before,), + ) + data = cur.fetchall() + return [Bot(*x) for x in data] + + @staticmethod + def fetch_all( + cur: cursor, + limit: int = 100, + start: int = 0, + status: Optional[Status] = None, + family: Optional[str] = None + ) -> List["Bot"]: + cur.execute("""SELECT * + FROM bots + WHERE (status=%s OR %s IS NULL) + AND (family=%s OR %s IS NULL) + ORDER BY bot_id DESC + LIMIT %s OFFSET %s""", + (status, status, family, family, limit, start) + ) + return [Bot(*x) for x in cur.fetchall()] + + @staticmethod + def count(cur: cursor, status: Optional[Status] = None, family: Optional[str] = None) -> int: + cur.execute("""SELECT COUNT(*) + FROM bots + WHERE (status=%s OR %s IS NULL) + AND (family=%s OR %s IS NULL)""", + (status, status, family, family) + ) + return int(cur.fetchone()[0]) + + @staticmethod + def fetch_by_tracker_id( + cur: cursor, tracker_id: int, limit: int = 100, start: int = 0 + ) -> List["Bot"]: + cur.execute( + "SELECT * FROM bots WHERE tracker_id=%s LIMIT %s OFFSET %s", + (tracker_id, limit, start), + ) + return [Bot(*x) for x in cur.fetchall()] + + @staticmethod + def fetch_by_tracker_ids( + cur: cursor, tracker_ids: List[int] + ) -> List["Bot"]: + if not tracker_ids: + return [] + cur.execute( + "SELECT * FROM bots WHERE tracker_id IN %s", + (tuple(tracker_ids),), + ) + return [Bot(*x) for x in cur.fetchall()] + +class TrackerWithBots: + """A model class that contains information about both tracker, and its bots.""" + def __init__(self, tracker, bots) -> None: + self.tracker_id = tracker.tracker_id + self.config_hash = tracker.config_hash + self.config = tracker.config + self.family = tracker.family + self.status = tracker.status + self.bots = bots + + @staticmethod + def fetch_all(cur: cursor, limit: int = 100, start: int = 0, status: Optional[Status] = None, family: Optional[str] = None) -> List["TrackerWithBots"]: + trackers = Tracker.fetch_all(cur, limit, start, status, family) + bots = Bot.fetch_by_tracker_ids(cur, [t.tracker_id for t in trackers]) + return [ + TrackerWithBots(t, [b for b in bots if b.tracker_id == t.tracker_id]) for t in trackers + ] + + +class Tracker: + def __init__( + self, + tracker_id: int, + config_hash: str, + config: str, + family: str, + status: Status, + ) -> None: + """Class used for mapping trackers from database + :param tracker_id: tracker id + :param config_hash: configs dhash + :param config: saved config + :param family: config family/type + :param status: trackers status + """ + self.tracker_id = tracker_id + self.config_hash = config_hash + self.config = config + self.family = family + self.status = status + + def serialize(self) -> Dict[str, Any]: + return { + "trackerId": self.tracker_id, + "mwdbId": self.config_hash, + "name": f"{self.tracker_id}_{self.family}", + "status": self.status, + } + + @property + def config_url(self) -> str: + return f"{app_config.mwdb.url}/config/{self.config_hash}" + + @staticmethod + def get_by_id(cur: cursor, tracker_id: int) -> Optional["Tracker"]: + cur.execute("SELECT * FROM trackers WHERE tracker_id=%s", (tracker_id,)) + data = cur.fetchone() + if not data: + return None + return Tracker(*data) + + @staticmethod + def get_by_hash(cur: cursor, config_hash: str) -> Optional["Tracker"]: + cur.execute("SELECT * FROM trackers WHERE config_hash=%s", (config_hash,)) + data = cur.fetchone() + if not data: + return None + return Tracker(*data) + + @staticmethod + def create(cur: cursor, config_hash: str, config: str, family: str) -> int: + cur.execute( + "INSERT INTO trackers(config_hash, config, family) VALUES (%s, %s, %s) RETURNING tracker_id", + (config_hash, config, family), + ) + (tracker_id,) = cur.fetchone() + return tracker_id + + @staticmethod + def fetch_all(cur: cursor, limit: int = 100, start: int = 0, status: Optional[Status] = None, family: Optional[str] = None) -> List["Tracker"]: + cur.execute( + """SELECT * + FROM trackers + WHERE (status=%s OR %s IS NULL) + AND (family=%s OR %s IS NULL) + ORDER BY tracker_id DESC + OFFSET %s LIMIT %s""", + (status, status, family, family, start, limit), + ) + data = cur.fetchall() + return [Tracker(*x) for x in data] + + @staticmethod + def update_statuses(cur: cursor, tracker_ids: List[int]) -> None: + """Propagate bot statuses to trackers + :param cur: database cursor + :param tracker_ids: list of tracker ids to update + """ + cur.execute( + """UPDATE trackers t_ + SET status=x.new_status + FROM ( + SELECT + t.tracker_id "tracker_id", + MIN(b.status) "new_status" + FROM trackers t + LEFT JOIN bots b ON t.tracker_id=b.tracker_id + GROUP BY t.tracker_id + HAVING t.tracker_id = ANY (%s) + ) x + WHERE t_.tracker_id = x.tracker_id""", + (tracker_ids,), + ) + + @staticmethod + def count(cur: cursor, status: Optional[Status] = None, family: Optional[str] = None) -> int: + cur.execute("""SELECT COUNT(*) + FROM trackers + WHERE (status=%s OR %s IS NULL) + AND (family=%s OR %s is NULL)""", (status, status, family, family)) + return int(cur.fetchone()[0]) + + +class Result: + def __init__( + self, + result_id: int, + task_id: int, + result_type: str, + name: str, + sha256: str, + tags: List[str], + upload_time: datetime, + ) -> None: + self.result_id = result_id + self.task_id = task_id + self.result_type = result_type + self.name = name + self.sha256 = sha256 + self.tags = tags + self.upload_time = upload_time + + @property + def mwdb_url(self) -> str: + path = { + "binary": "file", + "config": "config", + "blob": "blob", + }[self.result_type] + return f"{app_config.mwdb.url}/{path}/{self.sha256}" + + @staticmethod + def create( + cur: cursor, + task_id: str, + result_type: str, + name: str, + sha256: str, + tags: List[str], + ) -> int: + cur.execute( + """INSERT INTO + results(task_id, type, name, sha256, tags, upload_time) + VALUES (%s, %s, %s, %s, %s, %s) + RETURNING result_id""", + (task_id, result_type, name, sha256, tags, datetime.now()), + ) + (result_id,) = cur.fetchone() + return result_id + + def serialize(self) -> Dict[str, Any]: + return { + "resultId": self.result_id, + "taskId": self.task_id, + "resultType": self.result_type, + "sha256": self.sha256, + "name": self.name, + "tags": self.tags, + "uploadTime": str(self.upload_time), + } + + @staticmethod + def count(cur: cursor) -> int: + cur.execute("SELECT COUNT(*) FROM results") + return int(cur.fetchone()[0]) + + @staticmethod + def fetch_all(cur: cursor, limit: int = 100, start: int = 0) -> List["Result"]: + cur.execute( + """SELECT r.result_id, r.task_id, r.type, r.name, r.sha256, r.tags, r.upload_time + FROM results r + ORDER BY result_id DESC + LIMIT %s OFFSET %s""", + (limit, start), + ) + return [Result(*x) for x in cur.fetchall()] + + @staticmethod + def fetch_by_task_id(cur: cursor, task_id: int) -> List["Result"]: + cur.execute("SELECT * FROM results WHERE task_id=%s", (task_id,)) + return [Result(*x) for x in cur.fetchall()] + + @staticmethod + def fetch_by_bot_id( + cur: cursor, bot_id: int, start: int = 0, limit: int = 100 + ) -> List["Result"]: + cur.execute( + """SELECT r.result_id, r.task_id, r.type, r.name, r.sha256, r.tags, r.upload_time + FROM results r + JOIN tasks t ON r.task_id=t.task_id + WHERE t.bot_id=%s + ORDER BY r.result_id DESC + LIMIT %s OFFSET %s""", + (bot_id, limit, start), + ) + return [Result(*x) for x in cur.fetchall()] + + @staticmethod + def fetch_by_tracker_id( + cur: cursor, tracker_id: int, start: int = 0, limit: int = 100 + ) -> List["Result"]: + cur.execute( + """SELECT r.result_id, r.task_id, r.type, r.name, r.sha256, r.tags, r.upload_time + FROM results r + JOIN tasks t ON r.task_id=t.task_id + JOIN bots b on b.bot_id = t.bot_id + WHERE b.tracker_id=%s + ORDER BY r.result_id DESC + LIMIT %s OFFSET %s""", + (tracker_id, limit, start), + ) + return [Result(*x) for x in cur.fetchall()] + + +def run_migrations() -> None: + from sqlturk.migration import MigrationTool # type: ignore + + tool = MigrationTool(app_config.database.url, migration_dir="db") + tool.install() + migrations = tool.find_migrations() + if migrations: + print("Applying migrations: {}".format(migrations)) + tool.run_migrations() + + +if __name__ == "__main__": + run_migrations() diff --git a/src/mtracker.example.ini b/src/mtracker.example.ini new file mode 100755 index 0000000..be71ca5 --- /dev/null +++ b/src/mtracker.example.ini @@ -0,0 +1,26 @@ +; The default configuration is OK for most situations +[mtracker] +; max_failing_spree=5 +; task_timeout=900 +; default_http_timeout=3.0 +; task_period=43200 + +[log] +; provider=filesystem +; dir=/tmp/logs + +[mwdb] +; url=https://mwdb.cert.pl/api/ ; consider changing me +token=AAAA ; CHANGE ME + +[database] +url=postgresql://mtracker3:postgres@localhost:5432/mtracker3 ; CHANGE ME + +[redis] +; host=localhost +; port=6379 + +[proxy] +default_proxy="us" +method=file +URL=/etc/proxies/proxies.json ; CHANGE ME or create this file (see the docs) diff --git a/src/report_fetch.py b/src/report_fetch.py new file mode 100644 index 0000000..9e58cfb --- /dev/null +++ b/src/report_fetch.py @@ -0,0 +1,67 @@ +import json +import logging +import uuid +from pathlib import Path +from typing import List, Tuple + +from . import analysis_results +from . import utils + + +def flatten_results( + results: analysis_results.GenericObject, +) -> Tuple[ + List[analysis_results.Config], + List[analysis_results.Blob], + List[analysis_results.Binary], +]: + output = [] + queue = results.children + while queue: + top = queue.pop() + output.append(top) + queue += top.children + + configs = list(filter(lambda x: type(x) is analysis_results.Config, output)) + blobs = list(filter(lambda x: type(x) is analysis_results.Blob, output)) + binaries = list(filter(lambda x: type(x) is analysis_results.Binary, output)) + return (configs, blobs, binaries) # type: ignore + + +def report_stdout(config_hash: str, results: analysis_results.GenericObject) -> None: + logging.info("Reporting results to stdout") + print(f"Got dynamic config for {config_hash}") + + configs, blobs, binaries = flatten_results(results) + print(f"Got {len(configs)} configs") + print(f"Got {len(blobs)} blobs") + print(f"Got {len(binaries)} binaries") + + +def report_file(config_hash: str, results: analysis_results.GenericObject) -> None: + logging.info("Reporting results to file") + configs, blobs, binaries = flatten_results(results) + + random_name = uuid.uuid4() + out_path = Path("./results") / str(random_name) + out_path.mkdir() + + print(f"Got {len(configs)} configs") + print(f"Got {len(blobs)} blobs") + print(f"Got {len(binaries)} binaries") + + for i, cfg in enumerate(configs): + (out_path / f"config_{i}").write_text(json.dumps(cfg.config)) + + for i, binary in enumerate(binaries): + (out_path / f"binary_{i}_{binary.name}").write_bytes(binary.data) + + for i, blob in enumerate(blobs): + (out_path / f"blob_{i}_{blob.name}").write_text(blob.content) + + +def report_mwdb(config_hash: str, results: analysis_results.GenericObject) -> None: + logging.info("Reporting results to mwdb") + result_json = results.to_dict_recursive() + mwdb = utils.get_mwdb() + utils.report_mwdb_tree(mwdb, result_json, config_hash) diff --git a/src/reporter.py b/src/reporter.py new file mode 100644 index 0000000..4628929 --- /dev/null +++ b/src/reporter.py @@ -0,0 +1,94 @@ +import json +import logging +from typing import Any, Dict, List +from redis import Redis +from rq.job import Job # type: ignore + +from datetime import datetime, timedelta + +from . import utils +from . import model +from .config import app_config + + +logging.basicConfig(level=logging.DEBUG) +log = logging.getLogger(__name__) +log.setLevel(logging.DEBUG) +redis_conn = Redis( + host=app_config.redis.host, port=app_config.redis.port +) + + +def update_bot(bot_id: int, status: model.Status, saved_state: Dict[str, Any]) -> None: + """Update bot information + :param bot_id: bot id + :param status: bots status + :param saved_state: updated save state + """ + log.info("Updating bot state stored in db") + + # setting the next execution at the tasks end will allow a natural task diffusion + next_execution = datetime.now() + timedelta(seconds=app_config.mtracker.task_period) + with model.database_connection() as connection: + cur = connection.cursor() + model.Bot.update_after_run( + cur=cur, + bot_id=bot_id, + state=json.dumps(saved_state), + status=model.Status(status), + next_execution=next_execution, + ) + + +def finalize_task(task_id, results: List[Dict[str, Any]], status: model.Status) -> None: + """Update the tasks status after complection + :param task_id: task_id + :param results: fetched dynamic configuration + :param status: task status + """ + log.info("Setting the task after run") + + with model.database_connection() as connection: + cur = connection.cursor() + model.Task.update_after_run(cur, task_id, model.Status(status)) + + result_data = [ + (task_id, x["type"], x["name"], x["sha256"], x["tags"]) for x in results + ] + # do this in a single query maybe? + for r in result_data: + model.Result.create(cur, *r) + + +def report_results( + task_id: int, bot_id: int, config_hash: str, tracker_job_id: str +) -> None: + log.info("Reporting results for tracker job %s", tracker_job_id) + tracker_job = Job(tracker_job_id, redis_conn) + + mwdb = utils.get_mwdb() + reported_results: List[Dict[str, Any]] = [] + + results = tracker_job.result + if not results: + log.error("Tracker result is empty, has something gone wrong?") + return + + status, dynamic_config, saved_state = results + + # Upload results in cases of Working and Archived + if status in [model.Status.WORKING, model.Status.ARCHIVED]: + if status == model.Status.WORKING: + log.info("Tracker executed successfully") + elif status == model.Status.ARCHIVED: + log.info("Archiving this config") + if dynamic_config: + log.info("Pushing results to mwdb") + reported_results = utils.report_mwdb_tree(mwdb, dynamic_config, config_hash) + elif status == model.Status.FAILING: + log.warning("Tracker couldn't fetch config") + elif status == model.Status.CRASHED: + log.error("Tracker has crashed") + + finalize_task(task_id, reported_results, status) + update_bot(bot_id, status, saved_state) diff --git a/src/reporter_settings.py b/src/reporter_settings.py new file mode 100644 index 0000000..87f8be4 --- /dev/null +++ b/src/reporter_settings.py @@ -0,0 +1 @@ +QUEUES = ["report"] diff --git a/src/scheduler.py b/src/scheduler.py new file mode 100644 index 0000000..92ec2e2 --- /dev/null +++ b/src/scheduler.py @@ -0,0 +1,104 @@ +from rq import Queue # type: ignore +from redis import Redis +from typing import Optional +from datetime import datetime, timedelta +import logging +import json +import time +import random + +from .config import app_config +from . import model + +redis_conn = Redis( + host=app_config.redis.host, port=app_config.redis.port +) +track_queue = Queue("track", connection=redis_conn) +report_queue = Queue("report", connection=redis_conn) + + +logging.basicConfig(level=logging.INFO) +log = logging.getLogger(__name__) + + +def run_bot_task(bot_id: int) -> Optional[str]: + with model.database_connection() as connection: + cur = connection.cursor() + bot = model.Bot.get_by_id(cur, bot_id) + if not bot: + return None + + tracker = model.Tracker.get_by_id(cur, bot.tracker_id) + if not tracker: + raise Exception("Found a bot without tracker, db is corrupted") + + log.info("Getting proxies") + proxy_countries = model.Proxy.get_countries(cur) + + proxy_candidates = proxy_countries[bot.country] + if not proxy_candidates: + log.error( + "Couldn't find any proxy for bot %d with country %s", + bot_id, + bot.country, + ) + model.Bot.update_after_run( + cur=cur, + bot_id=bot_id, + state=None, + status=model.Status.FAILING, + next_execution=datetime.now() + timedelta(hours=24), + last_error="No matching proxy found", + ) + return None + selected_proxy = random.choice(proxy_candidates) + + log.info("Starting task for bot %s", bot.bot_id) + + task_id = model.Task.create(cur, bot_id, model.Status.INPROGRESS) + model.Bot.set_statuses( + cur=cur, bot_ids=[bot_id], status=model.Status.INPROGRESS + ) + + static_config = json.loads(tracker.config) + static_config["_id"] = tracker.config_hash + + job = track_queue.enqueue( + "mtracker.track.execute", + kwargs={ + "static_config": static_config, + "saved_state": json.loads(bot.state), + "proxy": selected_proxy.connection_string, + "bot_id": bot.bot_id, + "task_id": task_id, + }, + job_timeout=app_config.mtracker.task_timeout, + ) + report_queue.enqueue( + "mtracker.reporter.report_results", + kwargs={ + "bot_id": bot.bot_id, + "config_hash": tracker.config_hash, + "tracker_job_id": job.id, + "task_id": task_id, + }, + depends_on=job, + ) + return job.id + + +def run_tasks() -> None: + with model.database_connection() as connection: + cur = connection.cursor() + pending_bots = model.Bot.fetch_pending(cur, datetime.now()) + log.info("There are %d pending bots, starting", len(pending_bots)) + + for bot in pending_bots: + log.info("Enqueueing bot %d", bot.bot_id) + run_bot_task(bot.bot_id) + + +if __name__ == "__main__": + while True: + run_tasks() + time.sleep(60) diff --git a/src/server.py b/src/server.py new file mode 100644 index 0000000..7d37990 --- /dev/null +++ b/src/server.py @@ -0,0 +1,570 @@ +import json +import logging +import re +from rq import Queue # type: ignore +from redis import Redis +from typing import Any, cast, Dict +import time + +import rq_dashboard # type: ignore +from flask import ( + Flask, + Response, + abort, + jsonify, + request, + render_template, + send_from_directory, + redirect, + url_for, +) +from prometheus_client import Gauge, generate_latest # type: ignore + +from . import model +from . import scheduler +from . import utils +from .config import app_config + +PAGE_SIZE = 15 + +AVAILABLE_MODULES: Dict[str, model.TrackerModule] = {} + +redis_conn = Redis( + host=app_config.redis.host, port=app_config.redis.port +) +track_queue = Queue("track", connection=redis_conn) + +log = logging.getLogger() +app = Flask(__name__, static_folder="./static") + +mwdb = utils.get_mwdb() + + +redis_url = f"redis://{app_config.redis.host}:{app_config.redis.port}" +app.config["RQ_DASHBOARD_REDIS_URL"] = redis_url +app.register_blueprint(rq_dashboard.blueprint, url_prefix="/rq") + + +mtracker_bots = Gauge("mtracker_bots", "Bots", ("family", "status")) +mtracker_tasks = Gauge("mtracker_tasks", "Tasks", ("status",)) +mtracker_trackers = Gauge("mtracker_trackers", "Trackers") + + +@app.route("/varz", methods=["GET"]) +def varz() -> Response: + """Update and get prometheus metrics""" + with model.database_connection() as conn: + metrics = model.get_metrics(conn.cursor()) + + mtracker_bots._metrics.clear() + mtracker_tasks._metrics.clear() + + bots = metrics.bot_stats + tasks = metrics.task_stats + mtracker_trackers.set(metrics.trackers) + + for family, status, count in bots: + mtracker_bots.labels(family, status).set(count) + for status, count in tasks: + mtracker_tasks.labels(status).set(count) + + return generate_latest() + + +def track_config(family: str, config_dict: Dict) -> Dict: + dhash = utils.config_dhash(config_dict) + + if family not in AVAILABLE_MODULES: + log.warning("Family not supported") + return { "error": "unsupported family" } + + log.info("Tracking %s (%s)", dhash, family) + + with model.database_connection() as connection: + cur = connection.cursor() + + tracker = model.Tracker.get_by_hash(cur, dhash) + new_tracker = tracker is None + + bot_ids = [] + tracked_countries = [] + + if tracker is not None: + # get more tracker information + tracker_id = tracker.tracker_id + bots = model.Bot.fetch_by_tracker_id(cur=cur, tracker_id=tracker_id) + for b in bots: + bot_ids.append(b.bot_id) + tracked_countries.append(b.country) + else: + # insert a tracker into the database + tracker_id = model.Tracker.create( + cur, dhash, json.dumps(config_dict), family + ) + + proxy_countries = model.Proxy.get_countries(cur).keys() + module_proxy_whitelist = AVAILABLE_MODULES[family].proxy_whitelist + + for country in proxy_countries: + log.info("Creating a bot for %s", country) + if country in tracked_countries: + log.info("Skipping %s because it's already tracked", country) + continue + + if ( + module_proxy_whitelist is not None + and country not in module_proxy_whitelist + ): + log.info( + "Skipping %s because it's not whitelisted in the module", country + ) + continue + + bot_id = model.Bot.create( + cur=cur, tracker_id=tracker_id, country=country, family=family + ) + bot_ids.append(bot_id) + + return {"new": new_tracker, "trackerId": tracker_id, "botIds": bot_ids} + + +@app.route("/api/trackers", methods=["POST"]) +def track_config_api() -> Response: + """Tracker creation API. + The API request format is just {"config": {...config data}}. + Config key should contain a config (as found in mwdb), and other + keys are ignored. + """ + data = request.get_json() + config = data["config"] + family = config.get("type") + if not family: + family = config.get("family") # Fallback for legacy format + + return jsonify(track_config(family, config)) + + +@app.route("/track/", methods=["POST"]) +def track_config_old(dhash: str) -> Response: + """Legacy tracker submission API, TODO to be removed before open-sourcing + :param dhash: config dhash, to be downloaded from mwdb + """ + dhash = dhash.lower() + + if not re.match("^[a-f0-9]+$", dhash): + abort(400) + + mwdb_cfg = mwdb.query_config(hash=dhash, raise_not_found=False) + if mwdb_cfg is None: + log.error("Config %s does not exist", dhash) + abort(400) + + if mwdb_cfg.type != "static": + log.warning("Refusing to track non-static configs") + return jsonify("not a static config") + + response = track_config(mwdb_cfg.family, mwdb_cfg.config_dict) + return jsonify(response) + + +@app.route("/api/tasks//log", methods=["GET"]) +def get_task_log(task_id: int) -> Response: + log_path = model.Task.get_log_path(task_id) + + if not log_path.exists(): + abort(404) + return jsonify({"data": log_path.read_text()}) + + +@app.route("/api/results/") +def get_results() -> Response: + start = int(request.args.get("start", "0")) + count = int(request.args.get("count", "10")) + + with model.database_connection() as conn: + entities = model.Result.fetch_all( + cur=conn.cursor(), limit=count, start=start + ) + return jsonify([e.serialize() for e in entities]) + + +@app.route("/api/tasks/") +def get_tasks() -> Response: + start = int(request.args.get("start", "0")) + count = int(request.args.get("count", "10")) + + with model.database_connection() as conn: + entities = model.TaskView.fetch_all( + cur=conn.cursor(), limit=count, start=start + ) + return jsonify([e.serialize() for e in entities]) + + +@app.route("/api/tasks/") +def get_tass(task_id: int) -> Response: + with model.database_connection() as conn: + task = model.TaskView.get_by_id(conn.cursor(), task_id) + if not task: + abort(404) + return jsonify(task.serialize()) + + +@app.route("/api/trackers/", methods=["GET"]) +def get_trackers() -> Response: + status = request.args.get("status") + start = int(request.args.get("start", "0")) + count = int(request.args.get("count", "10")) + + with model.database_connection() as conn: + entities = model.Tracker.fetch_all( + cur=conn.cursor(), + limit=count, + start=start, + status=status, + ) + return jsonify([e.serialize() for e in entities]) + + +def tracker_action(tracker_id: int, action: str) -> None: + with model.database_connection() as connection: + cur = connection.cursor() + + bots = model.Bot.fetch_by_tracker_id(cur=cur, tracker_id=tracker_id) + bot_ids = [b.bot_id for b in bots] + + if action == "resetSpree": + model.Bot.clear_sprees(cur=cur, bot_ids=bot_ids) + elif action == "archive": + model.Bot.set_statuses( + cur=cur, bot_ids=bot_ids, status=model.Status.ARCHIVED + ) + elif action == "revive": + model.Bot.revive(cur=cur, bot_ids=bot_ids) + elif action == "rerun": + for bot_id in bot_ids: + scheduler.run_bot_task(bot_id) + else: + abort(400) + + +@app.route("/trackers/", methods=["POST"]) +def tracker_action_form(tracker_id: int) -> Response: + tracker_action(tracker_id, request.form["action"]) + return redirect(url_for("tracker", tracker_id=tracker_id)) + + +@app.route("/api/trackers/", methods=["POST"]) +def tracker_action_api(tracker_id: int) -> Response: + action = request.get_json().get("action") + tracker_action(tracker_id, action) + return jsonify({}) + + +@app.route("/api/trackers/") +def get_tracker(tracker_id: int) -> Response: + with model.database_connection() as conn: + tracker = model.Tracker.get_by_id(conn.cursor(), tracker_id) + if not tracker: + abort(404) + return jsonify(tracker.serialize()) + + +@app.route("/api/bots/") +def get_bots() -> Response: + status = request.args.get("status") + start = int(request.args.get("start", "0")) + count = int(request.args.get("count", "10")) + + with model.database_connection() as conn: + entities = model.Bot.fetch_all( + cur=conn.cursor(), + limit=count, + start=start, + status=status, + ) + + return jsonify([e.serialize() for e in entities]) + + +@app.route("/api/bots/", methods=["GET"]) +def get_bot(bot_id: int) -> Response: + with model.database_connection() as connection: + bot = model.Bot.get_by_id(connection.cursor(), bot_id) + if not bot: + abort(404) + return jsonify(bot.serialize()) + + +def bot_action(bot_id: int, action: str) -> None: + with model.database_connection() as connection: + cur = connection.cursor() + if action == "resetSpree": + model.Bot.clear_sprees(cur=cur, bot_ids=[bot_id]) + elif action == "archive": + model.Bot.set_statuses( + cur=cur, bot_ids=[bot_id], status=model.Status.ARCHIVED + ) + elif action == "revive": + model.Bot.revive(cur=cur, bot_ids=[bot_id]) + elif action == "rerun": + scheduler.run_bot_task(bot_id) + else: + abort(400) + + +@app.route("/api/bots/", methods=["POST"]) +def bot_action_api(bot_id: int) -> Response: + action = request.get_json().get("action") + bot_action(bot_id, action) + return jsonify({}) + + +@app.route("/bots/", methods=["POST"]) +def bot_action_form(bot_id: int) -> Response: + action = request.form["action"] + bot_action(bot_id, action) + return redirect(url_for("bot", bot_id=bot_id)) + + +@app.route("/api/bots//tasks", methods=["GET"]) +def get_bot_tasks(bot_id: int) -> Response: + status = request.args.get("status") + start = int(request.args.get("start", "0")) + count = int(request.args.get("count", "10")) + + with model.database_connection() as connection: + entities = model.TaskView.get_by_bot_id( + connection.cursor(), bot_id=bot_id, start=start, count=count, status=status + ) + return jsonify([e.serialize() for e in entities]) + + +@app.route("/api/bots//log", methods=["GET"]) +def get_bot_last_log(bot_id: int) -> Response: + with model.database_connection() as connection: + tasks = model.TaskView.get_by_bot_id(connection.cursor(), bot_id) + + if not tasks: + return jsonify({"data": "No historic tasks"}) + + log_path = model.Task.get_log_path(tasks[0].task_id) + if not log_path.exists(): + return jsonify({"data": "Log file does not exist"}) + return jsonify({"data": log_path.read_text()}) + + +@app.route("/api/proxies/", methods=["GET"]) +def fetch_proxies() -> Response: + with model.database_connection() as connection: + entities = model.Proxy.fetch_all(connection.cursor()) + return jsonify([e.serialize() for e in entities]) + + +@app.route("/api/proxies/update", methods=["POST"]) +def update_proxies() -> Response: + with model.database_connection() as connection: + new_proxies = utils.get_proxies() + new_proxies = [p for p in new_proxies if p.get("is_alive")] + proxy_changes = model.Proxy.synchronize_proxies( + connection.cursor(), new_proxies + ) + return jsonify(proxy_changes) + + +@app.route("/api/heartbeat/", methods=["GET"]) +def heartbeat() -> Response: + with model.database_connection() as conn: + return jsonify(model.get_status(conn.cursor())) + + +@app.route("/src/") +def static_file_src(path: str) -> Any: + return send_from_directory(cast(str, app.static_folder), "src/" + path) + + +@app.route("/build/") +def static_file_build(path: str) -> Any: + return send_from_directory(cast(str, app.static_folder), "build/" + path) + + +@app.route("/css/") +def static_file_css(path: str) -> Any: + return send_from_directory(cast(str, app.static_folder), "css/" + path) + + +@app.route("/flags/") +def static_file_flags(path: str) -> Any: + return send_from_directory(cast(str, app.static_folder), "flags/" + path) + + +@app.route("/proxies") +def proxies() -> Any: + with model.database_connection() as conn: + entities = model.Proxy.fetch_all(cur=conn.cursor()) + + return render_template("proxies.html", rows=entities) + + +@app.route("/proxies/update") +def proxies_update() -> Any: + with model.database_connection() as connection: + new_proxies = utils.get_proxies() + new_proxies = [p for p in new_proxies if p.get("is_alive")] + proxy_changes = model.Proxy.synchronize_proxies( + connection.cursor(), new_proxies + ) + # TODO: maybe flash the proxy_changes + return redirect(url_for("proxies")) + + +@app.route("/results") +def results() -> Any: + page = int(request.args.get("page", "1")) + start = (page - 1) * PAGE_SIZE + count = int(request.args.get("count", PAGE_SIZE)) + + with model.database_connection() as conn: + entities = model.Result.fetch_all( + cur=conn.cursor(), + limit=count, + start=start, + ) + count = model.Result.count(cur=conn.cursor()) + pages = (count + PAGE_SIZE - 1) // PAGE_SIZE + + return render_template("results.html", rows=entities, page=page, pages=pages) + + +@app.route("/tasks") +def tasks() -> Any: + status = request.args.get("status") + page = int(request.args.get("page", "1")) + start = (page - 1) * PAGE_SIZE + count = int(request.args.get("count", PAGE_SIZE)) + + with model.database_connection() as conn: + entities = model.TaskView.fetch_all( + cur=conn.cursor(), + limit=count, + start=start, + status=status, + ) + count = model.Task.count(cur=conn.cursor(), status=status) + pages = (count + PAGE_SIZE - 1) // PAGE_SIZE + + return render_template("tasks.html", rows=entities, page=page, pages=pages) + + +@app.route("/tasks/") +def task(task_id: int) -> Any: + with model.database_connection() as conn: + entity = model.TaskView.get_by_id(cur=conn.cursor(), task_id=task_id) + if entity is None: + abort(404) + results = model.Result.fetch_by_task_id(cur=conn.cursor(), task_id=task_id) + + log_path = model.Task.get_log_path(task_id=task_id) + if log_path.exists(): + log = log_path.read_text() + else: + log = "(missing)" + + return render_template("task.html", entity=entity, results=results, log=log) + + +@app.route("/bots") +def bots() -> Any: + status = request.args.get("status") + family = request.args.get("family") + page = int(request.args.get("page", "1")) + start = (page - 1) * PAGE_SIZE + count = int(request.args.get("count", PAGE_SIZE)) + + with model.database_connection() as conn: + entities = model.Bot.fetch_all( + cur=conn.cursor(), + limit=count, + start=start, + status=status, + family=family, + ) + count = model.Bot.count(cur=conn.cursor(), status=status, family=family) + pages = (count + PAGE_SIZE - 1) // PAGE_SIZE + + return render_template("bots.html", rows=entities, page=page, pages=pages) + + +@app.route("/bots/") +def bot(bot_id: int) -> Any: + with model.database_connection() as conn: + entity = model.Bot.get_by_id(cur=conn.cursor(), bot_id=bot_id) + if entity is None: + abort(404) + tasks = model.TaskView.get_by_bot_id(cur=conn.cursor(), bot_id=bot_id) + last_task_log = None + if tasks: + log_path = model.Task.get_log_path(tasks[0].task_id) + if log_path.exists(): + last_task_log = log_path.read_text() + return render_template("bot.html", entity=entity, tasks=tasks, last_task_log=last_task_log) + + +@app.route("/trackers") +def trackers() -> Any: + status = request.args.get("status") + family = request.args.get("family") + page = int(request.args.get("page", "1")) + start = (page - 1) * PAGE_SIZE + count = int(request.args.get("count", PAGE_SIZE)) + + with model.database_connection() as conn: + entities = model.TrackerWithBots.fetch_all( + cur=conn.cursor(), + limit=count, + start=start, + status=status, + family=family, + ) + count = model.Tracker.count(cur=conn.cursor(), status=status, family=family) + pages = (count + PAGE_SIZE - 1) // PAGE_SIZE + + return render_template("trackers.html", rows=entities, page=page, pages=pages) + + +@app.route("/trackers/") +def tracker(tracker_id) -> Any: + with model.database_connection() as conn: + cur = conn.cursor() + entity = model.Tracker.get_by_id(cur=cur, tracker_id=tracker_id) + if entity is None: + abort(404) + bots = model.Bot.fetch_by_tracker_id(cur=cur, tracker_id=tracker_id) + + return render_template("tracker.html", entity=entity, bots=bots) + + +@app.route("/") +def index() -> Any: + with model.database_connection() as conn: + status = model.get_status(conn.cursor()) + tasks = model.TaskView.fetch_all( + cur=conn.cursor(), + limit=10, + start=0, + ) + + return render_template("index.html", counters=status["counters"], tasks=tasks) + + +if __name__ == "__main__": + log.info("Getting available modules from workers") + q = track_queue.enqueue( + "mtracker.track.get_available_trackers", + ) + while q.result is None: + log.info("Still waiting") + time.sleep(1) + + AVAILABLE_MODULES = {x.family: x for x in q.result} + log.info("Got %d supported modules", len(AVAILABLE_MODULES)) + app.run(host="0.0.0.0", port=5000) diff --git a/src/static/css/app.css b/src/static/css/app.css new file mode 100644 index 0000000..1588f6c --- /dev/null +++ b/src/static/css/app.css @@ -0,0 +1,17 @@ +div.no-items { + text-align: center; + color: #888; +} + +.text-monospace { + font-family: Courier New, Courier, monospace +} + +.nomouse { + pointer-events: none; +} + +.mb-0 { + /* Naming convention from bootstrap 4: https://getbootstrap.com/docs/4.1/utilities/spacing/ */ + margin-bottom: 0px; +} diff --git a/src/static/css/bootstrap.min.css b/src/static/css/bootstrap.min.css new file mode 100644 index 0000000..4cf729e --- /dev/null +++ b/src/static/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{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 #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.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-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-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-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.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{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.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{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.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{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-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-image:-o-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-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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-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-image:-o-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-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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-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-image:-o-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-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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-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-image:-o-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-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)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-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-image:-o-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-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)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.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-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/static/css/bootswatch.min.css b/src/static/css/bootswatch.min.css new file mode 100644 index 0000000..5eb3a4c --- /dev/null +++ b/src/static/css/bootswatch.min.css @@ -0,0 +1,11 @@ +/*! + * bootswatch v3.3.7 + * Homepage: http://bootswatch.com + * Copyright 2012-2016 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#c8c8c8;background-color:#272b30}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#ffffff;text-decoration:none}a:hover,a:focus{color:#ffffff;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#1c1e22;border:1px solid #0c0d0e;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #1c1e22}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#7a8288}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#f89406;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#7a8288}.text-primary{color:#7a8288}a.text-primary:hover,a.text-primary:focus{color:#62686d}.text-success{color:#ffffff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#7a8288}a.bg-primary:hover,a.bg-primary:focus{background-color:#62686d}.bg-success{background-color:#62c462}a.bg-success:hover,a.bg-success:focus{background-color:#42b142}.bg-info{background-color:#5bc0de}a.bg-info:hover,a.bg-info:focus{background-color:#31b0d5}.bg-warning{background-color:#f89406}a.bg-warning:hover,a.bg-warning:focus{background-color:#c67605}.bg-danger{background-color:#ee5f5b}a.bg-danger:hover,a.bg-danger:focus{background-color:#e9322d}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #1c1e22}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #7a8288}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #7a8288}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#7a8288}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #7a8288;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#3a3f44;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.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-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.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-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.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-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:#2e3338}caption{padding-top:8px;padding-bottom:8px;color:#7a8288;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #1c1e22}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #1c1e22}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #1c1e22}.table .table{background-color:#272b30}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #1c1e22}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #1c1e22}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#353a41}.table-hover>tbody>tr:hover{background-color:#49515a}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#49515a}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#3e444c}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#62c462}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#4fbd4f}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#5bc0de}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#46b8da}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#f89406}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#df8505}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#ee5f5b}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ec4844}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #1c1e22}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#c8c8c8;border:0;border-bottom:1px solid #1c1e22}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:14px;line-height:1.42857143;color:#272b30}.form-control{display:block;width:100%;height:38px;padding:8px 12px;font-size:14px;line-height:1.42857143;color:#272b30;background-color:#ffffff;background-image:none;border:1px solid #000000;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#7a8288;opacity:1}.form-control:-ms-input-placeholder{color:#7a8288}.form-control::-webkit-input-placeholder{color:#7a8288}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#999999;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:38px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:54px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:54px;line-height:54px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:54px;line-height:54px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:47.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#62c462}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#f89406}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#ee5f5b}.has-error .form-control-feedback{color:#ffffff}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#ffffff}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:29px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:15px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#3a3f44;border-color:#3a3f44}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#232628;border-color:#000000}.btn-default:hover{color:#ffffff;background-color:#232628;border-color:#1e2023}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#232628;border-color:#1e2023}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#121415;border-color:#000000}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#3a3f44;border-color:#3a3f44}.btn-default .badge{color:#3a3f44;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#7a8288;border-color:#7a8288}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#62686d;border-color:#3e4245}.btn-primary:hover{color:#ffffff;background-color:#62686d;border-color:#5d6368}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#62686d;border-color:#5d6368}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#51565a;border-color:#3e4245}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#7a8288;border-color:#7a8288}.btn-primary .badge{color:#7a8288;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#62c462;border-color:#62c462}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#42b142;border-color:#2d792d}.btn-success:hover{color:#ffffff;background-color:#42b142;border-color:#40a940}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#42b142;border-color:#40a940}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#399739;border-color:#2d792d}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#62c462;border-color:#62c462}.btn-success .badge{color:#62c462;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#31b0d5;border-color:#1f7e9a}.btn-info:hover{color:#ffffff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#269abc;border-color:#1f7e9a}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#5bc0de}.btn-info .badge{color:#5bc0de;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f89406;border-color:#f89406}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#c67605;border-color:#7c4a03}.btn-warning:hover{color:#ffffff;background-color:#c67605;border-color:#bc7005}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#c67605;border-color:#bc7005}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a36104;border-color:#7c4a03}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f89406;border-color:#f89406}.btn-warning .badge{color:#f89406;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#ee5f5b;border-color:#ee5f5b}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#e9322d;border-color:#b71713}.btn-danger:hover{color:#ffffff;background-color:#e9322d;border-color:#e82924}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#e9322d;border-color:#e82924}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#dc1c17;border-color:#b71713}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#ee5f5b;border-color:#ee5f5b}.btn-danger .badge{color:#ee5f5b;background-color:#ffffff}.btn-link{color:#ffffff;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#ffffff;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#7a8288;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#3a3f44;border:1px solid #272b30;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#272b30}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#c8c8c8;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#272b30}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#272b30}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#7a8288}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#7a8288;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:54px;line-height:54px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:8px 12px;font-size:14px;font-weight:normal;line-height:1;color:#272b30;text-align:center;background-color:#3a3f44;border:1px solid rgba(0,0,0,0.6);border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:14px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#3e444c}.nav>li.disabled>a{color:#7a8288}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#7a8288;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#3e444c;border-color:#ffffff}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #1c1e22}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#1c1e22 #1c1e22 #1c1e22}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#ffffff;background-color:#3e444c;border:1px solid #1c1e22;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #1c1e22}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #1c1e22;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#272b30}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:transparent}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #1c1e22}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #1c1e22;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#272b30}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:6px;margin-bottom:6px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:6px;margin-bottom:6px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#3a3f44;border-color:#2b2e32}.navbar-default .navbar-brand{color:#c8c8c8}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-default .navbar-text{color:#c8c8c8}.navbar-default .navbar-nav>li>a{color:#c8c8c8}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#272b2e}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#272b2e}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#272b2e}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#272b2e}.navbar-default .navbar-toggle .icon-bar{background-color:#c8c8c8}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#2b2e32}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#272b2e;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#c8c8c8}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#272b2e}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#272b2e}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#c8c8c8}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#c8c8c8}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#7a8288;border-color:#62686d}.navbar-inverse .navbar-brand{color:#cccccc}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-inverse .navbar-text{color:#cccccc}.navbar-inverse .navbar-nav>li>a{color:#cccccc}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#5d6368}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#5d6368}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#5d6368}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#5d6368}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#697075}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#5d6368;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#62686d}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#62686d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#cccccc}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#5d6368}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#5d6368}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#cccccc}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#cccccc}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#cccccc}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:transparent;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#7a8288}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;line-height:1.42857143;text-decoration:none;color:#ffffff;background-color:#3a3f44;border:1px solid rgba(0,0,0,0.6);margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#ffffff;background-color:transparent;border-color:rgba(0,0,0,0.6)}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#ffffff;background-color:#232628;border-color:rgba(0,0,0,0.6);cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#7a8288;background-color:#ffffff;border-color:rgba(0,0,0,0.6);cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#3a3f44;border:1px solid rgba(0,0,0,0.6);border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:transparent}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#7a8288;background-color:#3a3f44;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#3a3f44}.label-default[href]:hover,.label-default[href]:focus{background-color:#232628}.label-primary{background-color:#7a8288}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#62686d}.label-success{background-color:#62c462}.label-success[href]:hover,.label-success[href]:focus{background-color:#42b142}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f89406}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#c67605}.label-danger{background-color:#ee5f5b}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#e9322d}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#7a8288;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#ffffff;background-color:#7a8288}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#1c1e22}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#050506}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#1c1e22;border:1px solid #0c0d0e;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#ffffff}.thumbnail .caption{padding:9px;color:#c8c8c8}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#62c462;border-color:#62bd4f;color:#ffffff}.alert-success hr{border-top-color:#55b142}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#5bc0de;border-color:#3dced8;color:#ffffff}.alert-info hr{border-top-color:#2ac7d2}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f89406;border-color:#e96506;color:#ffffff}.alert-warning hr{border-top-color:#d05a05}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#ee5f5b;border-color:#ed4d63;color:#ffffff}.alert-danger hr{border-top-color:#ea364f}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#1c1e22;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#7a8288;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#62c462}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f89406}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#ee5f5b}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#32383e;border:1px solid rgba(0,0,0,0.6)}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#c8c8c8}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#ffffff}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#c8c8c8;background-color:#3e444c}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#999999;color:#7a8288;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#7a8288}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#3e444c;border-color:rgba(0,0,0,0.6)}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#a2aab4}.list-group-item-success{color:#ffffff;background-color:#62c462}a.list-group-item-success,button.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ffffff;background-color:#4fbd4f}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#5bc0de}a.list-group-item-info,button.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ffffff;background-color:#46b8da}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#f89406}a.list-group-item-warning,button.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ffffff;background-color:#df8505}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#ee5f5b}a.list-group-item-danger,button.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ffffff;background-color:#ec4844}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#2e3338;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#3e444c;border-top:1px solid rgba(0,0,0,0.6);border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #1c1e22}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid rgba(0,0,0,0.6)}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid rgba(0,0,0,0.6)}.panel-default{border-color:rgba(0,0,0,0.6)}.panel-default>.panel-heading{color:#c8c8c8;background-color:#3e444c;border-color:rgba(0,0,0,0.6)}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-default>.panel-heading .badge{color:#3e444c;background-color:#c8c8c8}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.panel-primary{border-color:rgba(0,0,0,0.6)}.panel-primary>.panel-heading{color:#ffffff;background-color:#7a8288;border-color:rgba(0,0,0,0.6)}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-primary>.panel-heading .badge{color:#7a8288;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.panel-success{border-color:rgba(0,0,0,0.6)}.panel-success>.panel-heading{color:#ffffff;background-color:#62c462;border-color:rgba(0,0,0,0.6)}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-success>.panel-heading .badge{color:#62c462;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.panel-info{border-color:rgba(0,0,0,0.6)}.panel-info>.panel-heading{color:#ffffff;background-color:#5bc0de;border-color:rgba(0,0,0,0.6)}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-info>.panel-heading .badge{color:#5bc0de;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.panel-warning{border-color:rgba(0,0,0,0.6)}.panel-warning>.panel-heading{color:#ffffff;background-color:#f89406;border-color:rgba(0,0,0,0.6)}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-warning>.panel-heading .badge{color:#f89406;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.panel-danger{border-color:rgba(0,0,0,0.6)}.panel-danger>.panel-heading{color:#ffffff;background-color:#ee5f5b;border-color:rgba(0,0,0,0.6)}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-danger>.panel-heading .badge{color:#ee5f5b;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#1c1e22;border:1px solid #0c0d0e;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#2e3338;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #1c1e22}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #1c1e22}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#2e3338;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#2e3338;border-bottom:1px solid #22262a;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#666666;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#2e3338}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#666666;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#2e3338}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#666666;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#2e3338}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#666666;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#2e3338;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar-default,.navbar-inverse{border:1px solid rgba(0,0,0,0.6);text-shadow:1px 1px 1px rgba(0,0,0,0.3)}@media (min-width:768px){.navbar-default .navbar-nav>li>a,.navbar-inverse .navbar-nav>li>a{border-right:1px solid rgba(0,0,0,0.2);border-left:1px solid rgba(255,255,255,0.1)}.navbar-default .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:hover{border-left-color:transparent}.navbar-default .nav .open>a,.navbar-inverse .nav .open>a{border-color:transparent}.navbar-default .navbar-nav>li.active>a,.navbar-inverse .navbar-nav>li.active>a{border-left-color:transparent}.navbar-default .navbar-form,.navbar-inverse .navbar-form{margin-left:5px;margin-right:5px}}.navbar-default{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.navbar-default .navbar-nav>li>a:hover{background-image:-webkit-linear-gradient(#020202, #101112 40%, #141618);background-image:-o-linear-gradient(#020202, #101112 40%, #141618);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#141618));background-image:linear-gradient(#020202, #101112 40%, #141618);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff141618', GradientType=0);-webkit-filter:none;filter:none}.navbar-inverse{background-image:-webkit-linear-gradient(#8a9196, #7a8288 60%, #70787d);background-image:-o-linear-gradient(#8a9196, #7a8288 60%, #70787d);background-image:-webkit-gradient(linear, left top, left bottom, from(#8a9196), color-stop(60%, #7a8288), to(#70787d));background-image:linear-gradient(#8a9196, #7a8288 60%, #70787d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8a9196', endColorstr='#ff70787d', GradientType=0);-webkit-filter:none;filter:none}.navbar-inverse .badge{background-color:#5d6368}.navbar-inverse .navbar-nav>li>a:hover{background-image:-webkit-linear-gradient(#404448, #4e5458 40%, #53595d);background-image:-o-linear-gradient(#404448, #4e5458 40%, #53595d);background-image:-webkit-gradient(linear, left top, left bottom, from(#404448), color-stop(40%, #4e5458), to(#53595d));background-image:linear-gradient(#404448, #4e5458 40%, #53595d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff404448', endColorstr='#ff53595d', GradientType=0);-webkit-filter:none;filter:none}.btn,.btn:hover{border-color:rgba(0,0,0,0.6);text-shadow:1px 1px 1px rgba(0,0,0,0.3)}.btn-default{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.btn-default:hover{background-image:-webkit-linear-gradient(#020202, #101112 40%, #141618);background-image:-o-linear-gradient(#020202, #101112 40%, #141618);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#141618));background-image:linear-gradient(#020202, #101112 40%, #141618);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff141618', GradientType=0);-webkit-filter:none;filter:none}.btn-primary{background-image:-webkit-linear-gradient(#8a9196, #7a8288 60%, #70787d);background-image:-o-linear-gradient(#8a9196, #7a8288 60%, #70787d);background-image:-webkit-gradient(linear, left top, left bottom, from(#8a9196), color-stop(60%, #7a8288), to(#70787d));background-image:linear-gradient(#8a9196, #7a8288 60%, #70787d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8a9196', endColorstr='#ff70787d', GradientType=0);-webkit-filter:none;filter:none}.btn-primary:hover{background-image:-webkit-linear-gradient(#404448, #4e5458 40%, #53595d);background-image:-o-linear-gradient(#404448, #4e5458 40%, #53595d);background-image:-webkit-gradient(linear, left top, left bottom, from(#404448), color-stop(40%, #4e5458), to(#53595d));background-image:linear-gradient(#404448, #4e5458 40%, #53595d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff404448', endColorstr='#ff53595d', GradientType=0);-webkit-filter:none;filter:none}.btn-success{background-image:-webkit-linear-gradient(#78cc78, #62c462 60%, #53be53);background-image:-o-linear-gradient(#78cc78, #62c462 60%, #53be53);background-image:-webkit-gradient(linear, left top, left bottom, from(#78cc78), color-stop(60%, #62c462), to(#53be53));background-image:linear-gradient(#78cc78, #62c462 60%, #53be53);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff78cc78', endColorstr='#ff53be53', GradientType=0);-webkit-filter:none;filter:none}.btn-success:hover{background-image:-webkit-linear-gradient(#2f7d2f, #379337 40%, #3a9a3a);background-image:-o-linear-gradient(#2f7d2f, #379337 40%, #3a9a3a);background-image:-webkit-gradient(linear, left top, left bottom, from(#2f7d2f), color-stop(40%, #379337), to(#3a9a3a));background-image:linear-gradient(#2f7d2f, #379337 40%, #3a9a3a);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2f7d2f', endColorstr='#ff3a9a3a', GradientType=0);-webkit-filter:none;filter:none}.btn-info{background-image:-webkit-linear-gradient(#74cae3, #5bc0de 60%, #4ab9db);background-image:-o-linear-gradient(#74cae3, #5bc0de 60%, #4ab9db);background-image:-webkit-gradient(linear, left top, left bottom, from(#74cae3), color-stop(60%, #5bc0de), to(#4ab9db));background-image:linear-gradient(#74cae3, #5bc0de 60%, #4ab9db);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff74cae3', endColorstr='#ff4ab9db', GradientType=0);-webkit-filter:none;filter:none}.btn-info:hover{background-image:-webkit-linear-gradient(#20829f, #2596b8 40%, #279dc1);background-image:-o-linear-gradient(#20829f, #2596b8 40%, #279dc1);background-image:-webkit-gradient(linear, left top, left bottom, from(#20829f), color-stop(40%, #2596b8), to(#279dc1));background-image:linear-gradient(#20829f, #2596b8 40%, #279dc1);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff20829f', endColorstr='#ff279dc1', GradientType=0);-webkit-filter:none;filter:none}.btn-warning{background-image:-webkit-linear-gradient(#faa123, #f89406 60%, #e48806);background-image:-o-linear-gradient(#faa123, #f89406 60%, #e48806);background-image:-webkit-gradient(linear, left top, left bottom, from(#faa123), color-stop(60%, #f89406), to(#e48806));background-image:linear-gradient(#faa123, #f89406 60%, #e48806);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffaa123', endColorstr='#ffe48806', GradientType=0);-webkit-filter:none;filter:none}.btn-warning:hover{background-image:-webkit-linear-gradient(#804d03, #9e5f04 40%, #a86404);background-image:-o-linear-gradient(#804d03, #9e5f04 40%, #a86404);background-image:-webkit-gradient(linear, left top, left bottom, from(#804d03), color-stop(40%, #9e5f04), to(#a86404));background-image:linear-gradient(#804d03, #9e5f04 40%, #a86404);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff804d03', endColorstr='#ffa86404', GradientType=0);-webkit-filter:none;filter:none}.btn-danger{background-image:-webkit-linear-gradient(#f17a77, #ee5f5b 60%, #ec4d49);background-image:-o-linear-gradient(#f17a77, #ee5f5b 60%, #ec4d49);background-image:-webkit-gradient(linear, left top, left bottom, from(#f17a77), color-stop(60%, #ee5f5b), to(#ec4d49));background-image:linear-gradient(#f17a77, #ee5f5b 60%, #ec4d49);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff17a77', endColorstr='#ffec4d49', GradientType=0);-webkit-filter:none;filter:none}.btn-danger:hover{background-image:-webkit-linear-gradient(#bb1813, #d71c16 40%, #e01d17);background-image:-o-linear-gradient(#bb1813, #d71c16 40%, #e01d17);background-image:-webkit-gradient(linear, left top, left bottom, from(#bb1813), color-stop(40%, #d71c16), to(#e01d17));background-image:linear-gradient(#bb1813, #d71c16 40%, #e01d17);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbb1813', endColorstr='#ffe01d17', GradientType=0);-webkit-filter:none;filter:none}.btn-link,.btn-link:hover{border-color:transparent}h1,h2,h3,h4,h5,h6{text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}.text-primary,.text-primary:hover{color:#7a8288}.text-success,.text-success:hover{color:#62c462}.text-danger,.text-danger:hover{color:#ee5f5b}.text-warning,.text-warning:hover{color:#f89406}.text-info,.text-info:hover{color:#5bc0de}.table .success,.table .warning,.table .danger,.table .info{color:#fff}.table-bordered tbody tr.success td,.table-bordered tbody tr.warning td,.table-bordered tbody tr.danger td,.table-bordered tbody tr.success:hover td,.table-bordered tbody tr.warning:hover td,.table-bordered tbody tr.danger:hover td{border-color:#1c1e22}.table-responsive>.table{background-color:#2e3338}input,textarea{color:#272b30}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f89406}.has-warning .form-control,.has-warning .form-control:focus{border-color:#f89406}.has-warning .input-group-addon{border-color:rgba(0,0,0,0.6)}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#ee5f5b}.has-error .form-control,.has-error .form-control:focus{border-color:#ee5f5b}.has-error .input-group-addon{border-color:rgba(0,0,0,0.6)}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#62c462}.has-success .form-control,.has-success .form-control:focus{border-color:#62c462}.has-success .input-group-addon{border-color:rgba(0,0,0,0.6)}legend{color:#fff}.input-group-addon{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none;text-shadow:1px 1px 1px rgba(0,0,0,0.3);color:#ffffff}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:rgba(0,0,0,0.6)}.nav-pills>li>a{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none;border:1px solid rgba(0,0,0,0.6);text-shadow:1px 1px 1px rgba(0,0,0,0.3)}.nav-pills>li>a:hover{background-image:-webkit-linear-gradient(#020202, #101112 40%, #141618);background-image:-o-linear-gradient(#020202, #101112 40%, #141618);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#141618));background-image:linear-gradient(#020202, #101112 40%, #141618);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff141618', GradientType=0);-webkit-filter:none;filter:none;border:1px solid rgba(0,0,0,0.6)}.nav-pills>li.active>a,.nav-pills>li.active>a:hover{background-color:none;background-image:-webkit-linear-gradient(#020202, #101112 40%, #141618);background-image:-o-linear-gradient(#020202, #101112 40%, #141618);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#141618));background-image:linear-gradient(#020202, #101112 40%, #141618);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff141618', GradientType=0);-webkit-filter:none;filter:none;border:1px solid rgba(0,0,0,0.6)}.nav-pills>li.disabled>a,.nav-pills>li.disabled>a:hover{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.pagination>li>a,.pagination>li>span{text-shadow:1px 1px 1px rgba(0,0,0,0.3);background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.pagination>li>a:hover,.pagination>li>span:hover{background-image:-webkit-linear-gradient(#020202, #101112 40%, #141618);background-image:-o-linear-gradient(#020202, #101112 40%, #141618);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#141618));background-image:linear-gradient(#020202, #101112 40%, #141618);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff141618', GradientType=0);-webkit-filter:none;filter:none}.pagination>li.active>a,.pagination>li.active>span{background-image:-webkit-linear-gradient(#020202, #101112 40%, #141618);background-image:-o-linear-gradient(#020202, #101112 40%, #141618);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#141618));background-image:linear-gradient(#020202, #101112 40%, #141618);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff141618', GradientType=0);-webkit-filter:none;filter:none}.pagination>li.disabled>a,.pagination>li.disabled>a:hover,.pagination>li.disabled>span,.pagination>li.disabled>span:hover{background-color:transparent;background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.pager>li>a{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none;text-shadow:1px 1px 1px rgba(0,0,0,0.3)}.pager>li>a:hover{background-image:-webkit-linear-gradient(#020202, #101112 40%, #141618);background-image:-o-linear-gradient(#020202, #101112 40%, #141618);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#141618));background-image:linear-gradient(#020202, #101112 40%, #141618);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff141618', GradientType=0);-webkit-filter:none;filter:none}.pager>li.disabled>a,.pager>li.disabled>a:hover{background-color:transparent;background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.breadcrumb{border:1px solid rgba(0,0,0,0.6);text-shadow:1px 1px 1px rgba(0,0,0,0.3);background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.alert .alert-link,.alert a{color:#fff;text-decoration:underline}.alert .close{color:#000000;text-decoration:none}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#0c0d0e}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:rgba(0,0,0,0.6)}a.list-group-item-success.active{background-color:#62c462}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#4fbd4f}a.list-group-item-warning.active{background-color:#f89406}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#df8505}a.list-group-item-danger.active{background-color:#ee5f5b}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#ec4844}.jumbotron{border:1px solid rgba(0,0,0,0.6)}.panel-primary .panel-heading,.panel-success .panel-heading,.panel-danger .panel-heading,.panel-warning .panel-heading,.panel-info .panel-heading{border-color:#000} \ No newline at end of file diff --git a/src/static/css/bullet.css b/src/static/css/bullet.css new file mode 100644 index 0000000..97486b0 --- /dev/null +++ b/src/static/css/bullet.css @@ -0,0 +1,12 @@ +.bullet { font: 10px sans-serif; } +.bullet .marker { stroke: black; stroke-width: 2px; } +.bullet .tick text { stroke: white; stroke-width: .5px; } +.bullet .range.s0 { fill: none; } +.bullet .range.s1 { fill: none; } +.bullet .range.s2 { fill: none; } +.bullet .measure.s3 { fill: #62c462; } +.bullet .measure.s2 { fill: #5bc0de; } +.bullet .measure.s1 { fill: #f89406; } +.bullet .measure.s0 { fill: #ee5f5b; } +.bullet .title { font-size: 14px; font-weight: bold; } +.bullet .subtitle { fill: #999; } \ No newline at end of file diff --git a/src/static/css/flag-icon.css b/src/static/css/flag-icon.css new file mode 100644 index 0000000..c5157c8 --- /dev/null +++ b/src/static/css/flag-icon.css @@ -0,0 +1,1551 @@ +.flag-icon-background { + background-size: contain; + background-position: 50%; + background-repeat: no-repeat; +} +.flag-icon { + background-size: contain; + background-position: 50%; + background-repeat: no-repeat; + position: relative; + display: inline-block; + width: 1.33333333em; + line-height: 1em; + margin-right: 8pt; +} +.flag-icon:before { + content: "\00a0"; +} +.flag-icon.flag-icon-squared { + width: 1em; +} +.flag-icon-ad { + background-image: url(../flags/4x3/ad.svg); +} +.flag-icon-ad.flag-icon-squared { + background-image: url(../flags/1x1/ad.svg); +} +.flag-icon-ae { + background-image: url(../flags/4x3/ae.svg); +} +.flag-icon-ae.flag-icon-squared { + background-image: url(../flags/1x1/ae.svg); +} +.flag-icon-af { + background-image: url(../flags/4x3/af.svg); +} +.flag-icon-af.flag-icon-squared { + background-image: url(../flags/1x1/af.svg); +} +.flag-icon-ag { + background-image: url(../flags/4x3/ag.svg); +} +.flag-icon-ag.flag-icon-squared { + background-image: url(../flags/1x1/ag.svg); +} +.flag-icon-ai { + background-image: url(../flags/4x3/ai.svg); +} +.flag-icon-ai.flag-icon-squared { + background-image: url(../flags/1x1/ai.svg); +} +.flag-icon-al { + background-image: url(../flags/4x3/al.svg); +} +.flag-icon-al.flag-icon-squared { + background-image: url(../flags/1x1/al.svg); +} +.flag-icon-am { + background-image: url(../flags/4x3/am.svg); +} +.flag-icon-am.flag-icon-squared { + background-image: url(../flags/1x1/am.svg); +} +.flag-icon-ao { + background-image: url(../flags/4x3/ao.svg); +} +.flag-icon-ao.flag-icon-squared { + background-image: url(../flags/1x1/ao.svg); +} +.flag-icon-aq { + background-image: url(../flags/4x3/aq.svg); +} +.flag-icon-aq.flag-icon-squared { + background-image: url(../flags/1x1/aq.svg); +} +.flag-icon-ar { + background-image: url(../flags/4x3/ar.svg); +} +.flag-icon-ar.flag-icon-squared { + background-image: url(../flags/1x1/ar.svg); +} +.flag-icon-as { + background-image: url(../flags/4x3/as.svg); +} +.flag-icon-as.flag-icon-squared { + background-image: url(../flags/1x1/as.svg); +} +.flag-icon-at { + background-image: url(../flags/4x3/at.svg); +} +.flag-icon-at.flag-icon-squared { + background-image: url(../flags/1x1/at.svg); +} +.flag-icon-au { + background-image: url(../flags/4x3/au.svg); +} +.flag-icon-au.flag-icon-squared { + background-image: url(../flags/1x1/au.svg); +} +.flag-icon-aw { + background-image: url(../flags/4x3/aw.svg); +} +.flag-icon-aw.flag-icon-squared { + background-image: url(../flags/1x1/aw.svg); +} +.flag-icon-ax { + background-image: url(../flags/4x3/ax.svg); +} +.flag-icon-ax.flag-icon-squared { + background-image: url(../flags/1x1/ax.svg); +} +.flag-icon-az { + background-image: url(../flags/4x3/az.svg); +} +.flag-icon-az.flag-icon-squared { + background-image: url(../flags/1x1/az.svg); +} +.flag-icon-ba { + background-image: url(../flags/4x3/ba.svg); +} +.flag-icon-ba.flag-icon-squared { + background-image: url(../flags/1x1/ba.svg); +} +.flag-icon-bb { + background-image: url(../flags/4x3/bb.svg); +} +.flag-icon-bb.flag-icon-squared { + background-image: url(../flags/1x1/bb.svg); +} +.flag-icon-bd { + background-image: url(../flags/4x3/bd.svg); +} +.flag-icon-bd.flag-icon-squared { + background-image: url(../flags/1x1/bd.svg); +} +.flag-icon-be { + background-image: url(../flags/4x3/be.svg); +} +.flag-icon-be.flag-icon-squared { + background-image: url(../flags/1x1/be.svg); +} +.flag-icon-bf { + background-image: url(../flags/4x3/bf.svg); +} +.flag-icon-bf.flag-icon-squared { + background-image: url(../flags/1x1/bf.svg); +} +.flag-icon-bg { + background-image: url(../flags/4x3/bg.svg); +} +.flag-icon-bg.flag-icon-squared { + background-image: url(../flags/1x1/bg.svg); +} +.flag-icon-bh { + background-image: url(../flags/4x3/bh.svg); +} +.flag-icon-bh.flag-icon-squared { + background-image: url(../flags/1x1/bh.svg); +} +.flag-icon-bi { + background-image: url(../flags/4x3/bi.svg); +} +.flag-icon-bi.flag-icon-squared { + background-image: url(../flags/1x1/bi.svg); +} +.flag-icon-bj { + background-image: url(../flags/4x3/bj.svg); +} +.flag-icon-bj.flag-icon-squared { + background-image: url(../flags/1x1/bj.svg); +} +.flag-icon-bl { + background-image: url(../flags/4x3/bl.svg); +} +.flag-icon-bl.flag-icon-squared { + background-image: url(../flags/1x1/bl.svg); +} +.flag-icon-bm { + background-image: url(../flags/4x3/bm.svg); +} +.flag-icon-bm.flag-icon-squared { + background-image: url(../flags/1x1/bm.svg); +} +.flag-icon-bn { + background-image: url(../flags/4x3/bn.svg); +} +.flag-icon-bn.flag-icon-squared { + background-image: url(../flags/1x1/bn.svg); +} +.flag-icon-bo { + background-image: url(../flags/4x3/bo.svg); +} +.flag-icon-bo.flag-icon-squared { + background-image: url(../flags/1x1/bo.svg); +} +.flag-icon-bq { + background-image: url(../flags/4x3/bq.svg); +} +.flag-icon-bq.flag-icon-squared { + background-image: url(../flags/1x1/bq.svg); +} +.flag-icon-br { + background-image: url(../flags/4x3/br.svg); +} +.flag-icon-br.flag-icon-squared { + background-image: url(../flags/1x1/br.svg); +} +.flag-icon-bs { + background-image: url(../flags/4x3/bs.svg); +} +.flag-icon-bs.flag-icon-squared { + background-image: url(../flags/1x1/bs.svg); +} +.flag-icon-bt { + background-image: url(../flags/4x3/bt.svg); +} +.flag-icon-bt.flag-icon-squared { + background-image: url(../flags/1x1/bt.svg); +} +.flag-icon-bv { + background-image: url(../flags/4x3/bv.svg); +} +.flag-icon-bv.flag-icon-squared { + background-image: url(../flags/1x1/bv.svg); +} +.flag-icon-bw { + background-image: url(../flags/4x3/bw.svg); +} +.flag-icon-bw.flag-icon-squared { + background-image: url(../flags/1x1/bw.svg); +} +.flag-icon-by { + background-image: url(../flags/4x3/by.svg); +} +.flag-icon-by.flag-icon-squared { + background-image: url(../flags/1x1/by.svg); +} +.flag-icon-bz { + background-image: url(../flags/4x3/bz.svg); +} +.flag-icon-bz.flag-icon-squared { + background-image: url(../flags/1x1/bz.svg); +} +.flag-icon-ca { + background-image: url(../flags/4x3/ca.svg); +} +.flag-icon-ca.flag-icon-squared { + background-image: url(../flags/1x1/ca.svg); +} +.flag-icon-cc { + background-image: url(../flags/4x3/cc.svg); +} +.flag-icon-cc.flag-icon-squared { + background-image: url(../flags/1x1/cc.svg); +} +.flag-icon-cd { + background-image: url(../flags/4x3/cd.svg); +} +.flag-icon-cd.flag-icon-squared { + background-image: url(../flags/1x1/cd.svg); +} +.flag-icon-cf { + background-image: url(../flags/4x3/cf.svg); +} +.flag-icon-cf.flag-icon-squared { + background-image: url(../flags/1x1/cf.svg); +} +.flag-icon-cg { + background-image: url(../flags/4x3/cg.svg); +} +.flag-icon-cg.flag-icon-squared { + background-image: url(../flags/1x1/cg.svg); +} +.flag-icon-ch { + background-image: url(../flags/4x3/ch.svg); +} +.flag-icon-ch.flag-icon-squared { + background-image: url(../flags/1x1/ch.svg); +} +.flag-icon-ci { + background-image: url(../flags/4x3/ci.svg); +} +.flag-icon-ci.flag-icon-squared { + background-image: url(../flags/1x1/ci.svg); +} +.flag-icon-ck { + background-image: url(../flags/4x3/ck.svg); +} +.flag-icon-ck.flag-icon-squared { + background-image: url(../flags/1x1/ck.svg); +} +.flag-icon-cl { + background-image: url(../flags/4x3/cl.svg); +} +.flag-icon-cl.flag-icon-squared { + background-image: url(../flags/1x1/cl.svg); +} +.flag-icon-cm { + background-image: url(../flags/4x3/cm.svg); +} +.flag-icon-cm.flag-icon-squared { + background-image: url(../flags/1x1/cm.svg); +} +.flag-icon-cn { + background-image: url(../flags/4x3/cn.svg); +} +.flag-icon-cn.flag-icon-squared { + background-image: url(../flags/1x1/cn.svg); +} +.flag-icon-co { + background-image: url(../flags/4x3/co.svg); +} +.flag-icon-co.flag-icon-squared { + background-image: url(../flags/1x1/co.svg); +} +.flag-icon-cr { + background-image: url(../flags/4x3/cr.svg); +} +.flag-icon-cr.flag-icon-squared { + background-image: url(../flags/1x1/cr.svg); +} +.flag-icon-cu { + background-image: url(../flags/4x3/cu.svg); +} +.flag-icon-cu.flag-icon-squared { + background-image: url(../flags/1x1/cu.svg); +} +.flag-icon-cv { + background-image: url(../flags/4x3/cv.svg); +} +.flag-icon-cv.flag-icon-squared { + background-image: url(../flags/1x1/cv.svg); +} +.flag-icon-cw { + background-image: url(../flags/4x3/cw.svg); +} +.flag-icon-cw.flag-icon-squared { + background-image: url(../flags/1x1/cw.svg); +} +.flag-icon-cx { + background-image: url(../flags/4x3/cx.svg); +} +.flag-icon-cx.flag-icon-squared { + background-image: url(../flags/1x1/cx.svg); +} +.flag-icon-cy { + background-image: url(../flags/4x3/cy.svg); +} +.flag-icon-cy.flag-icon-squared { + background-image: url(../flags/1x1/cy.svg); +} +.flag-icon-cz { + background-image: url(../flags/4x3/cz.svg); +} +.flag-icon-cz.flag-icon-squared { + background-image: url(../flags/1x1/cz.svg); +} +.flag-icon-de { + background-image: url(../flags/4x3/de.svg); +} +.flag-icon-de.flag-icon-squared { + background-image: url(../flags/1x1/de.svg); +} +.flag-icon-dj { + background-image: url(../flags/4x3/dj.svg); +} +.flag-icon-dj.flag-icon-squared { + background-image: url(../flags/1x1/dj.svg); +} +.flag-icon-dk { + background-image: url(../flags/4x3/dk.svg); +} +.flag-icon-dk.flag-icon-squared { + background-image: url(../flags/1x1/dk.svg); +} +.flag-icon-dm { + background-image: url(../flags/4x3/dm.svg); +} +.flag-icon-dm.flag-icon-squared { + background-image: url(../flags/1x1/dm.svg); +} +.flag-icon-do { + background-image: url(../flags/4x3/do.svg); +} +.flag-icon-do.flag-icon-squared { + background-image: url(../flags/1x1/do.svg); +} +.flag-icon-dz { + background-image: url(../flags/4x3/dz.svg); +} +.flag-icon-dz.flag-icon-squared { + background-image: url(../flags/1x1/dz.svg); +} +.flag-icon-ec { + background-image: url(../flags/4x3/ec.svg); +} +.flag-icon-ec.flag-icon-squared { + background-image: url(../flags/1x1/ec.svg); +} +.flag-icon-ee { + background-image: url(../flags/4x3/ee.svg); +} +.flag-icon-ee.flag-icon-squared { + background-image: url(../flags/1x1/ee.svg); +} +.flag-icon-eg { + background-image: url(../flags/4x3/eg.svg); +} +.flag-icon-eg.flag-icon-squared { + background-image: url(../flags/1x1/eg.svg); +} +.flag-icon-eh { + background-image: url(../flags/4x3/eh.svg); +} +.flag-icon-eh.flag-icon-squared { + background-image: url(../flags/1x1/eh.svg); +} +.flag-icon-er { + background-image: url(../flags/4x3/er.svg); +} +.flag-icon-er.flag-icon-squared { + background-image: url(../flags/1x1/er.svg); +} +.flag-icon-es { + background-image: url(../flags/4x3/es.svg); +} +.flag-icon-es.flag-icon-squared { + background-image: url(../flags/1x1/es.svg); +} +.flag-icon-et { + background-image: url(../flags/4x3/et.svg); +} +.flag-icon-et.flag-icon-squared { + background-image: url(../flags/1x1/et.svg); +} +.flag-icon-fi { + background-image: url(../flags/4x3/fi.svg); +} +.flag-icon-fi.flag-icon-squared { + background-image: url(../flags/1x1/fi.svg); +} +.flag-icon-fj { + background-image: url(../flags/4x3/fj.svg); +} +.flag-icon-fj.flag-icon-squared { + background-image: url(../flags/1x1/fj.svg); +} +.flag-icon-fk { + background-image: url(../flags/4x3/fk.svg); +} +.flag-icon-fk.flag-icon-squared { + background-image: url(../flags/1x1/fk.svg); +} +.flag-icon-fm { + background-image: url(../flags/4x3/fm.svg); +} +.flag-icon-fm.flag-icon-squared { + background-image: url(../flags/1x1/fm.svg); +} +.flag-icon-fo { + background-image: url(../flags/4x3/fo.svg); +} +.flag-icon-fo.flag-icon-squared { + background-image: url(../flags/1x1/fo.svg); +} +.flag-icon-fr { + background-image: url(../flags/4x3/fr.svg); +} +.flag-icon-fr.flag-icon-squared { + background-image: url(../flags/1x1/fr.svg); +} +.flag-icon-ga { + background-image: url(../flags/4x3/ga.svg); +} +.flag-icon-ga.flag-icon-squared { + background-image: url(../flags/1x1/ga.svg); +} +.flag-icon-gb { + background-image: url(../flags/4x3/gb.svg); +} +.flag-icon-gb.flag-icon-squared { + background-image: url(../flags/1x1/gb.svg); +} +.flag-icon-gd { + background-image: url(../flags/4x3/gd.svg); +} +.flag-icon-gd.flag-icon-squared { + background-image: url(../flags/1x1/gd.svg); +} +.flag-icon-ge { + background-image: url(../flags/4x3/ge.svg); +} +.flag-icon-ge.flag-icon-squared { + background-image: url(../flags/1x1/ge.svg); +} +.flag-icon-gf { + background-image: url(../flags/4x3/gf.svg); +} +.flag-icon-gf.flag-icon-squared { + background-image: url(../flags/1x1/gf.svg); +} +.flag-icon-gg { + background-image: url(../flags/4x3/gg.svg); +} +.flag-icon-gg.flag-icon-squared { + background-image: url(../flags/1x1/gg.svg); +} +.flag-icon-gh { + background-image: url(../flags/4x3/gh.svg); +} +.flag-icon-gh.flag-icon-squared { + background-image: url(../flags/1x1/gh.svg); +} +.flag-icon-gi { + background-image: url(../flags/4x3/gi.svg); +} +.flag-icon-gi.flag-icon-squared { + background-image: url(../flags/1x1/gi.svg); +} +.flag-icon-gl { + background-image: url(../flags/4x3/gl.svg); +} +.flag-icon-gl.flag-icon-squared { + background-image: url(../flags/1x1/gl.svg); +} +.flag-icon-gm { + background-image: url(../flags/4x3/gm.svg); +} +.flag-icon-gm.flag-icon-squared { + background-image: url(../flags/1x1/gm.svg); +} +.flag-icon-gn { + background-image: url(../flags/4x3/gn.svg); +} +.flag-icon-gn.flag-icon-squared { + background-image: url(../flags/1x1/gn.svg); +} +.flag-icon-gp { + background-image: url(../flags/4x3/gp.svg); +} +.flag-icon-gp.flag-icon-squared { + background-image: url(../flags/1x1/gp.svg); +} +.flag-icon-gq { + background-image: url(../flags/4x3/gq.svg); +} +.flag-icon-gq.flag-icon-squared { + background-image: url(../flags/1x1/gq.svg); +} +.flag-icon-gr { + background-image: url(../flags/4x3/gr.svg); +} +.flag-icon-gr.flag-icon-squared { + background-image: url(../flags/1x1/gr.svg); +} +.flag-icon-gs { + background-image: url(../flags/4x3/gs.svg); +} +.flag-icon-gs.flag-icon-squared { + background-image: url(../flags/1x1/gs.svg); +} +.flag-icon-gt { + background-image: url(../flags/4x3/gt.svg); +} +.flag-icon-gt.flag-icon-squared { + background-image: url(../flags/1x1/gt.svg); +} +.flag-icon-gu { + background-image: url(../flags/4x3/gu.svg); +} +.flag-icon-gu.flag-icon-squared { + background-image: url(../flags/1x1/gu.svg); +} +.flag-icon-gw { + background-image: url(../flags/4x3/gw.svg); +} +.flag-icon-gw.flag-icon-squared { + background-image: url(../flags/1x1/gw.svg); +} +.flag-icon-gy { + background-image: url(../flags/4x3/gy.svg); +} +.flag-icon-gy.flag-icon-squared { + background-image: url(../flags/1x1/gy.svg); +} +.flag-icon-hk { + background-image: url(../flags/4x3/hk.svg); +} +.flag-icon-hk.flag-icon-squared { + background-image: url(../flags/1x1/hk.svg); +} +.flag-icon-hm { + background-image: url(../flags/4x3/hm.svg); +} +.flag-icon-hm.flag-icon-squared { + background-image: url(../flags/1x1/hm.svg); +} +.flag-icon-hn { + background-image: url(../flags/4x3/hn.svg); +} +.flag-icon-hn.flag-icon-squared { + background-image: url(../flags/1x1/hn.svg); +} +.flag-icon-hr { + background-image: url(../flags/4x3/hr.svg); +} +.flag-icon-hr.flag-icon-squared { + background-image: url(../flags/1x1/hr.svg); +} +.flag-icon-ht { + background-image: url(../flags/4x3/ht.svg); +} +.flag-icon-ht.flag-icon-squared { + background-image: url(../flags/1x1/ht.svg); +} +.flag-icon-hu { + background-image: url(../flags/4x3/hu.svg); +} +.flag-icon-hu.flag-icon-squared { + background-image: url(../flags/1x1/hu.svg); +} +.flag-icon-id { + background-image: url(../flags/4x3/id.svg); +} +.flag-icon-id.flag-icon-squared { + background-image: url(../flags/1x1/id.svg); +} +.flag-icon-ie { + background-image: url(../flags/4x3/ie.svg); +} +.flag-icon-ie.flag-icon-squared { + background-image: url(../flags/1x1/ie.svg); +} +.flag-icon-il { + background-image: url(../flags/4x3/il.svg); +} +.flag-icon-il.flag-icon-squared { + background-image: url(../flags/1x1/il.svg); +} +.flag-icon-im { + background-image: url(../flags/4x3/im.svg); +} +.flag-icon-im.flag-icon-squared { + background-image: url(../flags/1x1/im.svg); +} +.flag-icon-in { + background-image: url(../flags/4x3/in.svg); +} +.flag-icon-in.flag-icon-squared { + background-image: url(../flags/1x1/in.svg); +} +.flag-icon-io { + background-image: url(../flags/4x3/io.svg); +} +.flag-icon-io.flag-icon-squared { + background-image: url(../flags/1x1/io.svg); +} +.flag-icon-iq { + background-image: url(../flags/4x3/iq.svg); +} +.flag-icon-iq.flag-icon-squared { + background-image: url(../flags/1x1/iq.svg); +} +.flag-icon-ir { + background-image: url(../flags/4x3/ir.svg); +} +.flag-icon-ir.flag-icon-squared { + background-image: url(../flags/1x1/ir.svg); +} +.flag-icon-is { + background-image: url(../flags/4x3/is.svg); +} +.flag-icon-is.flag-icon-squared { + background-image: url(../flags/1x1/is.svg); +} +.flag-icon-it { + background-image: url(../flags/4x3/it.svg); +} +.flag-icon-it.flag-icon-squared { + background-image: url(../flags/1x1/it.svg); +} +.flag-icon-je { + background-image: url(../flags/4x3/je.svg); +} +.flag-icon-je.flag-icon-squared { + background-image: url(../flags/1x1/je.svg); +} +.flag-icon-jm { + background-image: url(../flags/4x3/jm.svg); +} +.flag-icon-jm.flag-icon-squared { + background-image: url(../flags/1x1/jm.svg); +} +.flag-icon-jo { + background-image: url(../flags/4x3/jo.svg); +} +.flag-icon-jo.flag-icon-squared { + background-image: url(../flags/1x1/jo.svg); +} +.flag-icon-jp { + background-image: url(../flags/4x3/jp.svg); +} +.flag-icon-jp.flag-icon-squared { + background-image: url(../flags/1x1/jp.svg); +} +.flag-icon-ke { + background-image: url(../flags/4x3/ke.svg); +} +.flag-icon-ke.flag-icon-squared { + background-image: url(../flags/1x1/ke.svg); +} +.flag-icon-kg { + background-image: url(../flags/4x3/kg.svg); +} +.flag-icon-kg.flag-icon-squared { + background-image: url(../flags/1x1/kg.svg); +} +.flag-icon-kh { + background-image: url(../flags/4x3/kh.svg); +} +.flag-icon-kh.flag-icon-squared { + background-image: url(../flags/1x1/kh.svg); +} +.flag-icon-ki { + background-image: url(../flags/4x3/ki.svg); +} +.flag-icon-ki.flag-icon-squared { + background-image: url(../flags/1x1/ki.svg); +} +.flag-icon-km { + background-image: url(../flags/4x3/km.svg); +} +.flag-icon-km.flag-icon-squared { + background-image: url(../flags/1x1/km.svg); +} +.flag-icon-kn { + background-image: url(../flags/4x3/kn.svg); +} +.flag-icon-kn.flag-icon-squared { + background-image: url(../flags/1x1/kn.svg); +} +.flag-icon-kp { + background-image: url(../flags/4x3/kp.svg); +} +.flag-icon-kp.flag-icon-squared { + background-image: url(../flags/1x1/kp.svg); +} +.flag-icon-kr { + background-image: url(../flags/4x3/kr.svg); +} +.flag-icon-kr.flag-icon-squared { + background-image: url(../flags/1x1/kr.svg); +} +.flag-icon-kw { + background-image: url(../flags/4x3/kw.svg); +} +.flag-icon-kw.flag-icon-squared { + background-image: url(../flags/1x1/kw.svg); +} +.flag-icon-ky { + background-image: url(../flags/4x3/ky.svg); +} +.flag-icon-ky.flag-icon-squared { + background-image: url(../flags/1x1/ky.svg); +} +.flag-icon-kz { + background-image: url(../flags/4x3/kz.svg); +} +.flag-icon-kz.flag-icon-squared { + background-image: url(../flags/1x1/kz.svg); +} +.flag-icon-la { + background-image: url(../flags/4x3/la.svg); +} +.flag-icon-la.flag-icon-squared { + background-image: url(../flags/1x1/la.svg); +} +.flag-icon-lb { + background-image: url(../flags/4x3/lb.svg); +} +.flag-icon-lb.flag-icon-squared { + background-image: url(../flags/1x1/lb.svg); +} +.flag-icon-lc { + background-image: url(../flags/4x3/lc.svg); +} +.flag-icon-lc.flag-icon-squared { + background-image: url(../flags/1x1/lc.svg); +} +.flag-icon-li { + background-image: url(../flags/4x3/li.svg); +} +.flag-icon-li.flag-icon-squared { + background-image: url(../flags/1x1/li.svg); +} +.flag-icon-lk { + background-image: url(../flags/4x3/lk.svg); +} +.flag-icon-lk.flag-icon-squared { + background-image: url(../flags/1x1/lk.svg); +} +.flag-icon-lr { + background-image: url(../flags/4x3/lr.svg); +} +.flag-icon-lr.flag-icon-squared { + background-image: url(../flags/1x1/lr.svg); +} +.flag-icon-ls { + background-image: url(../flags/4x3/ls.svg); +} +.flag-icon-ls.flag-icon-squared { + background-image: url(../flags/1x1/ls.svg); +} +.flag-icon-lt { + background-image: url(../flags/4x3/lt.svg); +} +.flag-icon-lt.flag-icon-squared { + background-image: url(../flags/1x1/lt.svg); +} +.flag-icon-lu { + background-image: url(../flags/4x3/lu.svg); +} +.flag-icon-lu.flag-icon-squared { + background-image: url(../flags/1x1/lu.svg); +} +.flag-icon-lv { + background-image: url(../flags/4x3/lv.svg); +} +.flag-icon-lv.flag-icon-squared { + background-image: url(../flags/1x1/lv.svg); +} +.flag-icon-ly { + background-image: url(../flags/4x3/ly.svg); +} +.flag-icon-ly.flag-icon-squared { + background-image: url(../flags/1x1/ly.svg); +} +.flag-icon-ma { + background-image: url(../flags/4x3/ma.svg); +} +.flag-icon-ma.flag-icon-squared { + background-image: url(../flags/1x1/ma.svg); +} +.flag-icon-mc { + background-image: url(../flags/4x3/mc.svg); +} +.flag-icon-mc.flag-icon-squared { + background-image: url(../flags/1x1/mc.svg); +} +.flag-icon-md { + background-image: url(../flags/4x3/md.svg); +} +.flag-icon-md.flag-icon-squared { + background-image: url(../flags/1x1/md.svg); +} +.flag-icon-me { + background-image: url(../flags/4x3/me.svg); +} +.flag-icon-me.flag-icon-squared { + background-image: url(../flags/1x1/me.svg); +} +.flag-icon-mf { + background-image: url(../flags/4x3/mf.svg); +} +.flag-icon-mf.flag-icon-squared { + background-image: url(../flags/1x1/mf.svg); +} +.flag-icon-mg { + background-image: url(../flags/4x3/mg.svg); +} +.flag-icon-mg.flag-icon-squared { + background-image: url(../flags/1x1/mg.svg); +} +.flag-icon-mh { + background-image: url(../flags/4x3/mh.svg); +} +.flag-icon-mh.flag-icon-squared { + background-image: url(../flags/1x1/mh.svg); +} +.flag-icon-mk { + background-image: url(../flags/4x3/mk.svg); +} +.flag-icon-mk.flag-icon-squared { + background-image: url(../flags/1x1/mk.svg); +} +.flag-icon-ml { + background-image: url(../flags/4x3/ml.svg); +} +.flag-icon-ml.flag-icon-squared { + background-image: url(../flags/1x1/ml.svg); +} +.flag-icon-mm { + background-image: url(../flags/4x3/mm.svg); +} +.flag-icon-mm.flag-icon-squared { + background-image: url(../flags/1x1/mm.svg); +} +.flag-icon-mn { + background-image: url(../flags/4x3/mn.svg); +} +.flag-icon-mn.flag-icon-squared { + background-image: url(../flags/1x1/mn.svg); +} +.flag-icon-mo { + background-image: url(../flags/4x3/mo.svg); +} +.flag-icon-mo.flag-icon-squared { + background-image: url(../flags/1x1/mo.svg); +} +.flag-icon-mp { + background-image: url(../flags/4x3/mp.svg); +} +.flag-icon-mp.flag-icon-squared { + background-image: url(../flags/1x1/mp.svg); +} +.flag-icon-mq { + background-image: url(../flags/4x3/mq.svg); +} +.flag-icon-mq.flag-icon-squared { + background-image: url(../flags/1x1/mq.svg); +} +.flag-icon-mr { + background-image: url(../flags/4x3/mr.svg); +} +.flag-icon-mr.flag-icon-squared { + background-image: url(../flags/1x1/mr.svg); +} +.flag-icon-ms { + background-image: url(../flags/4x3/ms.svg); +} +.flag-icon-ms.flag-icon-squared { + background-image: url(../flags/1x1/ms.svg); +} +.flag-icon-mt { + background-image: url(../flags/4x3/mt.svg); +} +.flag-icon-mt.flag-icon-squared { + background-image: url(../flags/1x1/mt.svg); +} +.flag-icon-mu { + background-image: url(../flags/4x3/mu.svg); +} +.flag-icon-mu.flag-icon-squared { + background-image: url(../flags/1x1/mu.svg); +} +.flag-icon-mv { + background-image: url(../flags/4x3/mv.svg); +} +.flag-icon-mv.flag-icon-squared { + background-image: url(../flags/1x1/mv.svg); +} +.flag-icon-mw { + background-image: url(../flags/4x3/mw.svg); +} +.flag-icon-mw.flag-icon-squared { + background-image: url(../flags/1x1/mw.svg); +} +.flag-icon-mx { + background-image: url(../flags/4x3/mx.svg); +} +.flag-icon-mx.flag-icon-squared { + background-image: url(../flags/1x1/mx.svg); +} +.flag-icon-my { + background-image: url(../flags/4x3/my.svg); +} +.flag-icon-my.flag-icon-squared { + background-image: url(../flags/1x1/my.svg); +} +.flag-icon-mz { + background-image: url(../flags/4x3/mz.svg); +} +.flag-icon-mz.flag-icon-squared { + background-image: url(../flags/1x1/mz.svg); +} +.flag-icon-na { + background-image: url(../flags/4x3/na.svg); +} +.flag-icon-na.flag-icon-squared { + background-image: url(../flags/1x1/na.svg); +} +.flag-icon-nc { + background-image: url(../flags/4x3/nc.svg); +} +.flag-icon-nc.flag-icon-squared { + background-image: url(../flags/1x1/nc.svg); +} +.flag-icon-ne { + background-image: url(../flags/4x3/ne.svg); +} +.flag-icon-ne.flag-icon-squared { + background-image: url(../flags/1x1/ne.svg); +} +.flag-icon-nf { + background-image: url(../flags/4x3/nf.svg); +} +.flag-icon-nf.flag-icon-squared { + background-image: url(../flags/1x1/nf.svg); +} +.flag-icon-ng { + background-image: url(../flags/4x3/ng.svg); +} +.flag-icon-ng.flag-icon-squared { + background-image: url(../flags/1x1/ng.svg); +} +.flag-icon-ni { + background-image: url(../flags/4x3/ni.svg); +} +.flag-icon-ni.flag-icon-squared { + background-image: url(../flags/1x1/ni.svg); +} +.flag-icon-nl { + background-image: url(../flags/4x3/nl.svg); +} +.flag-icon-nl.flag-icon-squared { + background-image: url(../flags/1x1/nl.svg); +} +.flag-icon-no { + background-image: url(../flags/4x3/no.svg); +} +.flag-icon-no.flag-icon-squared { + background-image: url(../flags/1x1/no.svg); +} +.flag-icon-np { + background-image: url(../flags/4x3/np.svg); +} +.flag-icon-np.flag-icon-squared { + background-image: url(../flags/1x1/np.svg); +} +.flag-icon-nr { + background-image: url(../flags/4x3/nr.svg); +} +.flag-icon-nr.flag-icon-squared { + background-image: url(../flags/1x1/nr.svg); +} +.flag-icon-nu { + background-image: url(../flags/4x3/nu.svg); +} +.flag-icon-nu.flag-icon-squared { + background-image: url(../flags/1x1/nu.svg); +} +.flag-icon-nz { + background-image: url(../flags/4x3/nz.svg); +} +.flag-icon-nz.flag-icon-squared { + background-image: url(../flags/1x1/nz.svg); +} +.flag-icon-om { + background-image: url(../flags/4x3/om.svg); +} +.flag-icon-om.flag-icon-squared { + background-image: url(../flags/1x1/om.svg); +} +.flag-icon-pa { + background-image: url(../flags/4x3/pa.svg); +} +.flag-icon-pa.flag-icon-squared { + background-image: url(../flags/1x1/pa.svg); +} +.flag-icon-pe { + background-image: url(../flags/4x3/pe.svg); +} +.flag-icon-pe.flag-icon-squared { + background-image: url(../flags/1x1/pe.svg); +} +.flag-icon-pf { + background-image: url(../flags/4x3/pf.svg); +} +.flag-icon-pf.flag-icon-squared { + background-image: url(../flags/1x1/pf.svg); +} +.flag-icon-pg { + background-image: url(../flags/4x3/pg.svg); +} +.flag-icon-pg.flag-icon-squared { + background-image: url(../flags/1x1/pg.svg); +} +.flag-icon-ph { + background-image: url(../flags/4x3/ph.svg); +} +.flag-icon-ph.flag-icon-squared { + background-image: url(../flags/1x1/ph.svg); +} +.flag-icon-pk { + background-image: url(../flags/4x3/pk.svg); +} +.flag-icon-pk.flag-icon-squared { + background-image: url(../flags/1x1/pk.svg); +} +.flag-icon-pl { + background-image: url(../flags/4x3/pl.svg); +} +.flag-icon-pl.flag-icon-squared { + background-image: url(../flags/1x1/pl.svg); +} +.flag-icon-pm { + background-image: url(../flags/4x3/pm.svg); +} +.flag-icon-pm.flag-icon-squared { + background-image: url(../flags/1x1/pm.svg); +} +.flag-icon-pn { + background-image: url(../flags/4x3/pn.svg); +} +.flag-icon-pn.flag-icon-squared { + background-image: url(../flags/1x1/pn.svg); +} +.flag-icon-pr { + background-image: url(../flags/4x3/pr.svg); +} +.flag-icon-pr.flag-icon-squared { + background-image: url(../flags/1x1/pr.svg); +} +.flag-icon-ps { + background-image: url(../flags/4x3/ps.svg); +} +.flag-icon-ps.flag-icon-squared { + background-image: url(../flags/1x1/ps.svg); +} +.flag-icon-pt { + background-image: url(../flags/4x3/pt.svg); +} +.flag-icon-pt.flag-icon-squared { + background-image: url(../flags/1x1/pt.svg); +} +.flag-icon-pw { + background-image: url(../flags/4x3/pw.svg); +} +.flag-icon-pw.flag-icon-squared { + background-image: url(../flags/1x1/pw.svg); +} +.flag-icon-py { + background-image: url(../flags/4x3/py.svg); +} +.flag-icon-py.flag-icon-squared { + background-image: url(../flags/1x1/py.svg); +} +.flag-icon-qa { + background-image: url(../flags/4x3/qa.svg); +} +.flag-icon-qa.flag-icon-squared { + background-image: url(../flags/1x1/qa.svg); +} +.flag-icon-re { + background-image: url(../flags/4x3/re.svg); +} +.flag-icon-re.flag-icon-squared { + background-image: url(../flags/1x1/re.svg); +} +.flag-icon-ro { + background-image: url(../flags/4x3/ro.svg); +} +.flag-icon-ro.flag-icon-squared { + background-image: url(../flags/1x1/ro.svg); +} +.flag-icon-rs { + background-image: url(../flags/4x3/rs.svg); +} +.flag-icon-rs.flag-icon-squared { + background-image: url(../flags/1x1/rs.svg); +} +.flag-icon-ru { + background-image: url(../flags/4x3/ru.svg); +} +.flag-icon-ru.flag-icon-squared { + background-image: url(../flags/1x1/ru.svg); +} +.flag-icon-rw { + background-image: url(../flags/4x3/rw.svg); +} +.flag-icon-rw.flag-icon-squared { + background-image: url(../flags/1x1/rw.svg); +} +.flag-icon-sa { + background-image: url(../flags/4x3/sa.svg); +} +.flag-icon-sa.flag-icon-squared { + background-image: url(../flags/1x1/sa.svg); +} +.flag-icon-sb { + background-image: url(../flags/4x3/sb.svg); +} +.flag-icon-sb.flag-icon-squared { + background-image: url(../flags/1x1/sb.svg); +} +.flag-icon-sc { + background-image: url(../flags/4x3/sc.svg); +} +.flag-icon-sc.flag-icon-squared { + background-image: url(../flags/1x1/sc.svg); +} +.flag-icon-sd { + background-image: url(../flags/4x3/sd.svg); +} +.flag-icon-sd.flag-icon-squared { + background-image: url(../flags/1x1/sd.svg); +} +.flag-icon-se { + background-image: url(../flags/4x3/se.svg); +} +.flag-icon-se.flag-icon-squared { + background-image: url(../flags/1x1/se.svg); +} +.flag-icon-sg { + background-image: url(../flags/4x3/sg.svg); +} +.flag-icon-sg.flag-icon-squared { + background-image: url(../flags/1x1/sg.svg); +} +.flag-icon-sh { + background-image: url(../flags/4x3/sh.svg); +} +.flag-icon-sh.flag-icon-squared { + background-image: url(../flags/1x1/sh.svg); +} +.flag-icon-si { + background-image: url(../flags/4x3/si.svg); +} +.flag-icon-si.flag-icon-squared { + background-image: url(../flags/1x1/si.svg); +} +.flag-icon-sj { + background-image: url(../flags/4x3/sj.svg); +} +.flag-icon-sj.flag-icon-squared { + background-image: url(../flags/1x1/sj.svg); +} +.flag-icon-sk { + background-image: url(../flags/4x3/sk.svg); +} +.flag-icon-sk.flag-icon-squared { + background-image: url(../flags/1x1/sk.svg); +} +.flag-icon-sl { + background-image: url(../flags/4x3/sl.svg); +} +.flag-icon-sl.flag-icon-squared { + background-image: url(../flags/1x1/sl.svg); +} +.flag-icon-sm { + background-image: url(../flags/4x3/sm.svg); +} +.flag-icon-sm.flag-icon-squared { + background-image: url(../flags/1x1/sm.svg); +} +.flag-icon-sn { + background-image: url(../flags/4x3/sn.svg); +} +.flag-icon-sn.flag-icon-squared { + background-image: url(../flags/1x1/sn.svg); +} +.flag-icon-so { + background-image: url(../flags/4x3/so.svg); +} +.flag-icon-so.flag-icon-squared { + background-image: url(../flags/1x1/so.svg); +} +.flag-icon-sr { + background-image: url(../flags/4x3/sr.svg); +} +.flag-icon-sr.flag-icon-squared { + background-image: url(../flags/1x1/sr.svg); +} +.flag-icon-ss { + background-image: url(../flags/4x3/ss.svg); +} +.flag-icon-ss.flag-icon-squared { + background-image: url(../flags/1x1/ss.svg); +} +.flag-icon-st { + background-image: url(../flags/4x3/st.svg); +} +.flag-icon-st.flag-icon-squared { + background-image: url(../flags/1x1/st.svg); +} +.flag-icon-sv { + background-image: url(../flags/4x3/sv.svg); +} +.flag-icon-sv.flag-icon-squared { + background-image: url(../flags/1x1/sv.svg); +} +.flag-icon-sx { + background-image: url(../flags/4x3/sx.svg); +} +.flag-icon-sx.flag-icon-squared { + background-image: url(../flags/1x1/sx.svg); +} +.flag-icon-sy { + background-image: url(../flags/4x3/sy.svg); +} +.flag-icon-sy.flag-icon-squared { + background-image: url(../flags/1x1/sy.svg); +} +.flag-icon-sz { + background-image: url(../flags/4x3/sz.svg); +} +.flag-icon-sz.flag-icon-squared { + background-image: url(../flags/1x1/sz.svg); +} +.flag-icon-tc { + background-image: url(../flags/4x3/tc.svg); +} +.flag-icon-tc.flag-icon-squared { + background-image: url(../flags/1x1/tc.svg); +} +.flag-icon-td { + background-image: url(../flags/4x3/td.svg); +} +.flag-icon-td.flag-icon-squared { + background-image: url(../flags/1x1/td.svg); +} +.flag-icon-tf { + background-image: url(../flags/4x3/tf.svg); +} +.flag-icon-tf.flag-icon-squared { + background-image: url(../flags/1x1/tf.svg); +} +.flag-icon-tg { + background-image: url(../flags/4x3/tg.svg); +} +.flag-icon-tg.flag-icon-squared { + background-image: url(../flags/1x1/tg.svg); +} +.flag-icon-th { + background-image: url(../flags/4x3/th.svg); +} +.flag-icon-th.flag-icon-squared { + background-image: url(../flags/1x1/th.svg); +} +.flag-icon-tj { + background-image: url(../flags/4x3/tj.svg); +} +.flag-icon-tj.flag-icon-squared { + background-image: url(../flags/1x1/tj.svg); +} +.flag-icon-tk { + background-image: url(../flags/4x3/tk.svg); +} +.flag-icon-tk.flag-icon-squared { + background-image: url(../flags/1x1/tk.svg); +} +.flag-icon-tl { + background-image: url(../flags/4x3/tl.svg); +} +.flag-icon-tl.flag-icon-squared { + background-image: url(../flags/1x1/tl.svg); +} +.flag-icon-tm { + background-image: url(../flags/4x3/tm.svg); +} +.flag-icon-tm.flag-icon-squared { + background-image: url(../flags/1x1/tm.svg); +} +.flag-icon-tn { + background-image: url(../flags/4x3/tn.svg); +} +.flag-icon-tn.flag-icon-squared { + background-image: url(../flags/1x1/tn.svg); +} +.flag-icon-to { + background-image: url(../flags/4x3/to.svg); +} +.flag-icon-to.flag-icon-squared { + background-image: url(../flags/1x1/to.svg); +} +.flag-icon-tr { + background-image: url(../flags/4x3/tr.svg); +} +.flag-icon-tr.flag-icon-squared { + background-image: url(../flags/1x1/tr.svg); +} +.flag-icon-tt { + background-image: url(../flags/4x3/tt.svg); +} +.flag-icon-tt.flag-icon-squared { + background-image: url(../flags/1x1/tt.svg); +} +.flag-icon-tv { + background-image: url(../flags/4x3/tv.svg); +} +.flag-icon-tv.flag-icon-squared { + background-image: url(../flags/1x1/tv.svg); +} +.flag-icon-tw { + background-image: url(../flags/4x3/tw.svg); +} +.flag-icon-tw.flag-icon-squared { + background-image: url(../flags/1x1/tw.svg); +} +.flag-icon-tz { + background-image: url(../flags/4x3/tz.svg); +} +.flag-icon-tz.flag-icon-squared { + background-image: url(../flags/1x1/tz.svg); +} +.flag-icon-ua { + background-image: url(../flags/4x3/ua.svg); +} +.flag-icon-ua.flag-icon-squared { + background-image: url(../flags/1x1/ua.svg); +} +.flag-icon-ug { + background-image: url(../flags/4x3/ug.svg); +} +.flag-icon-ug.flag-icon-squared { + background-image: url(../flags/1x1/ug.svg); +} +.flag-icon-um { + background-image: url(../flags/4x3/um.svg); +} +.flag-icon-um.flag-icon-squared { + background-image: url(../flags/1x1/um.svg); +} +.flag-icon-us { + background-image: url(../flags/4x3/us.svg); +} +.flag-icon-us.flag-icon-squared { + background-image: url(../flags/1x1/us.svg); +} +.flag-icon-uy { + background-image: url(../flags/4x3/uy.svg); +} +.flag-icon-uy.flag-icon-squared { + background-image: url(../flags/1x1/uy.svg); +} +.flag-icon-uz { + background-image: url(../flags/4x3/uz.svg); +} +.flag-icon-uz.flag-icon-squared { + background-image: url(../flags/1x1/uz.svg); +} +.flag-icon-va { + background-image: url(../flags/4x3/va.svg); +} +.flag-icon-va.flag-icon-squared { + background-image: url(../flags/1x1/va.svg); +} +.flag-icon-vc { + background-image: url(../flags/4x3/vc.svg); +} +.flag-icon-vc.flag-icon-squared { + background-image: url(../flags/1x1/vc.svg); +} +.flag-icon-ve { + background-image: url(../flags/4x3/ve.svg); +} +.flag-icon-ve.flag-icon-squared { + background-image: url(../flags/1x1/ve.svg); +} +.flag-icon-vg { + background-image: url(../flags/4x3/vg.svg); +} +.flag-icon-vg.flag-icon-squared { + background-image: url(../flags/1x1/vg.svg); +} +.flag-icon-vi { + background-image: url(../flags/4x3/vi.svg); +} +.flag-icon-vi.flag-icon-squared { + background-image: url(../flags/1x1/vi.svg); +} +.flag-icon-vn { + background-image: url(../flags/4x3/vn.svg); +} +.flag-icon-vn.flag-icon-squared { + background-image: url(../flags/1x1/vn.svg); +} +.flag-icon-vu { + background-image: url(../flags/4x3/vu.svg); +} +.flag-icon-vu.flag-icon-squared { + background-image: url(../flags/1x1/vu.svg); +} +.flag-icon-wf { + background-image: url(../flags/4x3/wf.svg); +} +.flag-icon-wf.flag-icon-squared { + background-image: url(../flags/1x1/wf.svg); +} +.flag-icon-ws { + background-image: url(../flags/4x3/ws.svg); +} +.flag-icon-ws.flag-icon-squared { + background-image: url(../flags/1x1/ws.svg); +} +.flag-icon-ye { + background-image: url(../flags/4x3/ye.svg); +} +.flag-icon-ye.flag-icon-squared { + background-image: url(../flags/1x1/ye.svg); +} +.flag-icon-yt { + background-image: url(../flags/4x3/yt.svg); +} +.flag-icon-yt.flag-icon-squared { + background-image: url(../flags/1x1/yt.svg); +} +.flag-icon-za { + background-image: url(../flags/4x3/za.svg); +} +.flag-icon-za.flag-icon-squared { + background-image: url(../flags/1x1/za.svg); +} +.flag-icon-zm { + background-image: url(../flags/4x3/zm.svg); +} +.flag-icon-zm.flag-icon-squared { + background-image: url(../flags/1x1/zm.svg); +} +.flag-icon-zw { + background-image: url(../flags/4x3/zw.svg); +} +.flag-icon-zw.flag-icon-squared { + background-image: url(../flags/1x1/zw.svg); +} +.flag-icon-eu { + background-image: url(../flags/4x3/eu.svg); +} +.flag-icon-eu.flag-icon-squared { + background-image: url(../flags/1x1/eu.svg); +} +.flag-icon-gb-eng { + background-image: url(../flags/4x3/gb-eng.svg); +} +.flag-icon-gb-eng.flag-icon-squared { + background-image: url(../flags/1x1/gb-eng.svg); +} +.flag-icon-gb-nir { + background-image: url(../flags/4x3/gb-nir.svg); +} +.flag-icon-gb-nir.flag-icon-squared { + background-image: url(../flags/1x1/gb-nir.svg); +} +.flag-icon-gb-sct { + background-image: url(../flags/4x3/gb-sct.svg); +} +.flag-icon-gb-sct.flag-icon-squared { + background-image: url(../flags/1x1/gb-sct.svg); +} +.flag-icon-gb-wls { + background-image: url(../flags/4x3/gb-wls.svg); +} +.flag-icon-gb-wls.flag-icon-squared { + background-image: url(../flags/1x1/gb-wls.svg); +} +.flag-icon-un { + background-image: url(../flags/4x3/un.svg); +} +.flag-icon-un.flag-icon-squared { + background-image: url(../flags/1x1/un.svg); +} diff --git a/src/static/flags/1x1/ad.svg b/src/static/flags/1x1/ad.svg new file mode 100644 index 0000000..cafda60 --- /dev/null +++ b/src/static/flags/1x1/ad.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ae.svg b/src/static/flags/1x1/ae.svg new file mode 100644 index 0000000..9ac2866 --- /dev/null +++ b/src/static/flags/1x1/ae.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/af.svg b/src/static/flags/1x1/af.svg new file mode 100644 index 0000000..c278ff3 --- /dev/null +++ b/src/static/flags/1x1/af.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ag.svg b/src/static/flags/1x1/ag.svg new file mode 100644 index 0000000..0b5d4fd --- /dev/null +++ b/src/static/flags/1x1/ag.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ai.svg b/src/static/flags/1x1/ai.svg new file mode 100644 index 0000000..bbecfad --- /dev/null +++ b/src/static/flags/1x1/ai.svg @@ -0,0 +1,767 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/al.svg b/src/static/flags/1x1/al.svg new file mode 100644 index 0000000..93bce4a --- /dev/null +++ b/src/static/flags/1x1/al.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/am.svg b/src/static/flags/1x1/am.svg new file mode 100644 index 0000000..150db22 --- /dev/null +++ b/src/static/flags/1x1/am.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/ao.svg b/src/static/flags/1x1/ao.svg new file mode 100644 index 0000000..3bbd6ce --- /dev/null +++ b/src/static/flags/1x1/ao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/aq.svg b/src/static/flags/1x1/aq.svg new file mode 100644 index 0000000..043f1e0 --- /dev/null +++ b/src/static/flags/1x1/aq.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ar.svg b/src/static/flags/1x1/ar.svg new file mode 100644 index 0000000..e5112be --- /dev/null +++ b/src/static/flags/1x1/ar.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/as.svg b/src/static/flags/1x1/as.svg new file mode 100644 index 0000000..81e28e2 --- /dev/null +++ b/src/static/flags/1x1/as.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/at.svg b/src/static/flags/1x1/at.svg new file mode 100644 index 0000000..fc25f26 --- /dev/null +++ b/src/static/flags/1x1/at.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/au.svg b/src/static/flags/1x1/au.svg new file mode 100644 index 0000000..b868658 --- /dev/null +++ b/src/static/flags/1x1/au.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/aw.svg b/src/static/flags/1x1/aw.svg new file mode 100644 index 0000000..e7994af --- /dev/null +++ b/src/static/flags/1x1/aw.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ax.svg b/src/static/flags/1x1/ax.svg new file mode 100644 index 0000000..680dd1d --- /dev/null +++ b/src/static/flags/1x1/ax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/az.svg b/src/static/flags/1x1/az.svg new file mode 100644 index 0000000..df5a172 --- /dev/null +++ b/src/static/flags/1x1/az.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/1x1/ba.svg b/src/static/flags/1x1/ba.svg new file mode 100644 index 0000000..8e94f6c --- /dev/null +++ b/src/static/flags/1x1/ba.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bb.svg b/src/static/flags/1x1/bb.svg new file mode 100644 index 0000000..bb0daec --- /dev/null +++ b/src/static/flags/1x1/bb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/bd.svg b/src/static/flags/1x1/bd.svg new file mode 100644 index 0000000..b8866da --- /dev/null +++ b/src/static/flags/1x1/bd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/static/flags/1x1/be.svg b/src/static/flags/1x1/be.svg new file mode 100644 index 0000000..92f51fc --- /dev/null +++ b/src/static/flags/1x1/be.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/bf.svg b/src/static/flags/1x1/bf.svg new file mode 100644 index 0000000..54c86ce --- /dev/null +++ b/src/static/flags/1x1/bf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/bg.svg b/src/static/flags/1x1/bg.svg new file mode 100644 index 0000000..e21c614 --- /dev/null +++ b/src/static/flags/1x1/bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/bh.svg b/src/static/flags/1x1/bh.svg new file mode 100644 index 0000000..beaefe9 --- /dev/null +++ b/src/static/flags/1x1/bh.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/1x1/bi.svg b/src/static/flags/1x1/bi.svg new file mode 100644 index 0000000..b4268f6 --- /dev/null +++ b/src/static/flags/1x1/bi.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bj.svg b/src/static/flags/1x1/bj.svg new file mode 100644 index 0000000..0306fd0 --- /dev/null +++ b/src/static/flags/1x1/bj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bl.svg b/src/static/flags/1x1/bl.svg new file mode 100644 index 0000000..2385562 --- /dev/null +++ b/src/static/flags/1x1/bl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/bm.svg b/src/static/flags/1x1/bm.svg new file mode 100644 index 0000000..f6239cc --- /dev/null +++ b/src/static/flags/1x1/bm.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bn.svg b/src/static/flags/1x1/bn.svg new file mode 100644 index 0000000..43bcabc --- /dev/null +++ b/src/static/flags/1x1/bn.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bo.svg b/src/static/flags/1x1/bo.svg new file mode 100644 index 0000000..7b27d90 --- /dev/null +++ b/src/static/flags/1x1/bo.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bq.svg b/src/static/flags/1x1/bq.svg new file mode 100644 index 0000000..29b5af6 --- /dev/null +++ b/src/static/flags/1x1/bq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/br.svg b/src/static/flags/1x1/br.svg new file mode 100644 index 0000000..3421e38 --- /dev/null +++ b/src/static/flags/1x1/br.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bs.svg b/src/static/flags/1x1/bs.svg new file mode 100644 index 0000000..d4e24ad --- /dev/null +++ b/src/static/flags/1x1/bs.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bt.svg b/src/static/flags/1x1/bt.svg new file mode 100644 index 0000000..37f60c9 --- /dev/null +++ b/src/static/flags/1x1/bt.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bv.svg b/src/static/flags/1x1/bv.svg new file mode 100644 index 0000000..6dd0007 --- /dev/null +++ b/src/static/flags/1x1/bv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bw.svg b/src/static/flags/1x1/bw.svg new file mode 100644 index 0000000..fa886bb --- /dev/null +++ b/src/static/flags/1x1/bw.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/by.svg b/src/static/flags/1x1/by.svg new file mode 100644 index 0000000..e0ba400 --- /dev/null +++ b/src/static/flags/1x1/by.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/bz.svg b/src/static/flags/1x1/bz.svg new file mode 100644 index 0000000..1d8d6b3 --- /dev/null +++ b/src/static/flags/1x1/bz.svg @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ca.svg b/src/static/flags/1x1/ca.svg new file mode 100644 index 0000000..acc3a3f --- /dev/null +++ b/src/static/flags/1x1/ca.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/cc.svg b/src/static/flags/1x1/cc.svg new file mode 100644 index 0000000..e2ab9cd --- /dev/null +++ b/src/static/flags/1x1/cc.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/cd.svg b/src/static/flags/1x1/cd.svg new file mode 100644 index 0000000..44b3c09 --- /dev/null +++ b/src/static/flags/1x1/cd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/1x1/cf.svg b/src/static/flags/1x1/cf.svg new file mode 100644 index 0000000..d48e669 --- /dev/null +++ b/src/static/flags/1x1/cf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/cg.svg b/src/static/flags/1x1/cg.svg new file mode 100644 index 0000000..021f36d --- /dev/null +++ b/src/static/flags/1x1/cg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ch.svg b/src/static/flags/1x1/ch.svg new file mode 100644 index 0000000..2009774 --- /dev/null +++ b/src/static/flags/1x1/ch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/ci.svg b/src/static/flags/1x1/ci.svg new file mode 100644 index 0000000..048e8b5 --- /dev/null +++ b/src/static/flags/1x1/ci.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/ck.svg b/src/static/flags/1x1/ck.svg new file mode 100644 index 0000000..cfb93b9 --- /dev/null +++ b/src/static/flags/1x1/ck.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/cl.svg b/src/static/flags/1x1/cl.svg new file mode 100644 index 0000000..fd2f344 --- /dev/null +++ b/src/static/flags/1x1/cl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/cm.svg b/src/static/flags/1x1/cm.svg new file mode 100644 index 0000000..72a7c8a --- /dev/null +++ b/src/static/flags/1x1/cm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/cn.svg b/src/static/flags/1x1/cn.svg new file mode 100644 index 0000000..36a7f81 --- /dev/null +++ b/src/static/flags/1x1/cn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/1x1/co.svg b/src/static/flags/1x1/co.svg new file mode 100644 index 0000000..ccaa606 --- /dev/null +++ b/src/static/flags/1x1/co.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/cr.svg b/src/static/flags/1x1/cr.svg new file mode 100644 index 0000000..e100d16 --- /dev/null +++ b/src/static/flags/1x1/cr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/cu.svg b/src/static/flags/1x1/cu.svg new file mode 100644 index 0000000..2fadf06 --- /dev/null +++ b/src/static/flags/1x1/cu.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/cv.svg b/src/static/flags/1x1/cv.svg new file mode 100644 index 0000000..03610d2 --- /dev/null +++ b/src/static/flags/1x1/cv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/cw.svg b/src/static/flags/1x1/cw.svg new file mode 100644 index 0000000..3c8803a --- /dev/null +++ b/src/static/flags/1x1/cw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/cx.svg b/src/static/flags/1x1/cx.svg new file mode 100644 index 0000000..c151611 --- /dev/null +++ b/src/static/flags/1x1/cx.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/cy.svg b/src/static/flags/1x1/cy.svg new file mode 100644 index 0000000..dd51fa4 --- /dev/null +++ b/src/static/flags/1x1/cy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/cz.svg b/src/static/flags/1x1/cz.svg new file mode 100644 index 0000000..c8ad655 --- /dev/null +++ b/src/static/flags/1x1/cz.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/1x1/de.svg b/src/static/flags/1x1/de.svg new file mode 100644 index 0000000..7af71b9 --- /dev/null +++ b/src/static/flags/1x1/de.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/dj.svg b/src/static/flags/1x1/dj.svg new file mode 100644 index 0000000..2cf2b9f --- /dev/null +++ b/src/static/flags/1x1/dj.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/dk.svg b/src/static/flags/1x1/dk.svg new file mode 100644 index 0000000..0b4ee37 --- /dev/null +++ b/src/static/flags/1x1/dk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/dm.svg b/src/static/flags/1x1/dm.svg new file mode 100644 index 0000000..54f6732 --- /dev/null +++ b/src/static/flags/1x1/dm.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/do.svg b/src/static/flags/1x1/do.svg new file mode 100644 index 0000000..428e564 --- /dev/null +++ b/src/static/flags/1x1/do.svg @@ -0,0 +1,6745 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/dz.svg b/src/static/flags/1x1/dz.svg new file mode 100644 index 0000000..d2d436a --- /dev/null +++ b/src/static/flags/1x1/dz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/ec.svg b/src/static/flags/1x1/ec.svg new file mode 100644 index 0000000..715c301 --- /dev/null +++ b/src/static/flags/1x1/ec.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ee.svg b/src/static/flags/1x1/ee.svg new file mode 100644 index 0000000..42d5807 --- /dev/null +++ b/src/static/flags/1x1/ee.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/eg.svg b/src/static/flags/1x1/eg.svg new file mode 100644 index 0000000..b138d58 --- /dev/null +++ b/src/static/flags/1x1/eg.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/eh.svg b/src/static/flags/1x1/eh.svg new file mode 100644 index 0000000..29eb21e --- /dev/null +++ b/src/static/flags/1x1/eh.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/er.svg b/src/static/flags/1x1/er.svg new file mode 100644 index 0000000..ef48578 --- /dev/null +++ b/src/static/flags/1x1/er.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/es.svg b/src/static/flags/1x1/es.svg new file mode 100644 index 0000000..9a7e10c --- /dev/null +++ b/src/static/flags/1x1/es.svg @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/et.svg b/src/static/flags/1x1/et.svg new file mode 100644 index 0000000..7b07563 --- /dev/null +++ b/src/static/flags/1x1/et.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/eu.svg b/src/static/flags/1x1/eu.svg new file mode 100644 index 0000000..80d96b7 --- /dev/null +++ b/src/static/flags/1x1/eu.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/fi.svg b/src/static/flags/1x1/fi.svg new file mode 100644 index 0000000..736a548 --- /dev/null +++ b/src/static/flags/1x1/fi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/fj.svg b/src/static/flags/1x1/fj.svg new file mode 100644 index 0000000..04486bd --- /dev/null +++ b/src/static/flags/1x1/fj.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/fk.svg b/src/static/flags/1x1/fk.svg new file mode 100644 index 0000000..9e1c388 --- /dev/null +++ b/src/static/flags/1x1/fk.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/fm.svg b/src/static/flags/1x1/fm.svg new file mode 100644 index 0000000..ee33a4c --- /dev/null +++ b/src/static/flags/1x1/fm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/1x1/fo.svg b/src/static/flags/1x1/fo.svg new file mode 100644 index 0000000..8be250d --- /dev/null +++ b/src/static/flags/1x1/fo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/1x1/fr.svg b/src/static/flags/1x1/fr.svg new file mode 100644 index 0000000..2385562 --- /dev/null +++ b/src/static/flags/1x1/fr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/ga.svg b/src/static/flags/1x1/ga.svg new file mode 100644 index 0000000..621ef95 --- /dev/null +++ b/src/static/flags/1x1/ga.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/gb-eng.svg b/src/static/flags/1x1/gb-eng.svg new file mode 100644 index 0000000..0141bfd --- /dev/null +++ b/src/static/flags/1x1/gb-eng.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/gb-nir.svg b/src/static/flags/1x1/gb-nir.svg new file mode 100644 index 0000000..f35c38d --- /dev/null +++ b/src/static/flags/1x1/gb-nir.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/gb-sct.svg b/src/static/flags/1x1/gb-sct.svg new file mode 100644 index 0000000..ff49ecc --- /dev/null +++ b/src/static/flags/1x1/gb-sct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/static/flags/1x1/gb-wls.svg b/src/static/flags/1x1/gb-wls.svg new file mode 100644 index 0000000..705ac63 --- /dev/null +++ b/src/static/flags/1x1/gb-wls.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/gb.svg b/src/static/flags/1x1/gb.svg new file mode 100644 index 0000000..4018e2a --- /dev/null +++ b/src/static/flags/1x1/gb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/gd.svg b/src/static/flags/1x1/gd.svg new file mode 100644 index 0000000..97c17f8 --- /dev/null +++ b/src/static/flags/1x1/gd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ge.svg b/src/static/flags/1x1/ge.svg new file mode 100644 index 0000000..e6108fc --- /dev/null +++ b/src/static/flags/1x1/ge.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/gf.svg b/src/static/flags/1x1/gf.svg new file mode 100644 index 0000000..054d94e --- /dev/null +++ b/src/static/flags/1x1/gf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/gg.svg b/src/static/flags/1x1/gg.svg new file mode 100644 index 0000000..73e0b60 --- /dev/null +++ b/src/static/flags/1x1/gg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/gh.svg b/src/static/flags/1x1/gh.svg new file mode 100644 index 0000000..8e26562 --- /dev/null +++ b/src/static/flags/1x1/gh.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/gi.svg b/src/static/flags/1x1/gi.svg new file mode 100644 index 0000000..e0403dd --- /dev/null +++ b/src/static/flags/1x1/gi.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/gl.svg b/src/static/flags/1x1/gl.svg new file mode 100644 index 0000000..db612be --- /dev/null +++ b/src/static/flags/1x1/gl.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/1x1/gm.svg b/src/static/flags/1x1/gm.svg new file mode 100644 index 0000000..a3b62e8 --- /dev/null +++ b/src/static/flags/1x1/gm.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/gn.svg b/src/static/flags/1x1/gn.svg new file mode 100644 index 0000000..e10e240 --- /dev/null +++ b/src/static/flags/1x1/gn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/gp.svg b/src/static/flags/1x1/gp.svg new file mode 100644 index 0000000..2385562 --- /dev/null +++ b/src/static/flags/1x1/gp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/gq.svg b/src/static/flags/1x1/gq.svg new file mode 100644 index 0000000..b093994 --- /dev/null +++ b/src/static/flags/1x1/gq.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/gr.svg b/src/static/flags/1x1/gr.svg new file mode 100644 index 0000000..4240e9c --- /dev/null +++ b/src/static/flags/1x1/gr.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/gs.svg b/src/static/flags/1x1/gs.svg new file mode 100644 index 0000000..d5a7d46 --- /dev/null +++ b/src/static/flags/1x1/gs.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L + + + E + + + O + + + T + + + E + + + R + + + R + + + R + + + R + + + R + + + E + + + O + + + O + + + A + + + A + + + A + + + M + + + P + + + P + + + P + + + I + + + T + + + T + + + M + + + G + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/gt.svg b/src/static/flags/1x1/gt.svg new file mode 100644 index 0000000..8ce5e46 --- /dev/null +++ b/src/static/flags/1x1/gt.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/gu.svg b/src/static/flags/1x1/gu.svg new file mode 100644 index 0000000..855e1a9 --- /dev/null +++ b/src/static/flags/1x1/gu.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + G + + + U + + + A + + + M + + + + + + + + G + + + U + + + A + + + M + + diff --git a/src/static/flags/1x1/gw.svg b/src/static/flags/1x1/gw.svg new file mode 100644 index 0000000..2f318ca --- /dev/null +++ b/src/static/flags/1x1/gw.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/gy.svg b/src/static/flags/1x1/gy.svg new file mode 100644 index 0000000..64104b5 --- /dev/null +++ b/src/static/flags/1x1/gy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/hk.svg b/src/static/flags/1x1/hk.svg new file mode 100644 index 0000000..b1b8f79 --- /dev/null +++ b/src/static/flags/1x1/hk.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/hm.svg b/src/static/flags/1x1/hm.svg new file mode 100644 index 0000000..c97d4f1 --- /dev/null +++ b/src/static/flags/1x1/hm.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/hn.svg b/src/static/flags/1x1/hn.svg new file mode 100644 index 0000000..cee1714 --- /dev/null +++ b/src/static/flags/1x1/hn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/hr.svg b/src/static/flags/1x1/hr.svg new file mode 100644 index 0000000..24b1854 --- /dev/null +++ b/src/static/flags/1x1/hr.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ht.svg b/src/static/flags/1x1/ht.svg new file mode 100644 index 0000000..634b608 --- /dev/null +++ b/src/static/flags/1x1/ht.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/hu.svg b/src/static/flags/1x1/hu.svg new file mode 100644 index 0000000..d2b40b4 --- /dev/null +++ b/src/static/flags/1x1/hu.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/id.svg b/src/static/flags/1x1/id.svg new file mode 100644 index 0000000..5772afb --- /dev/null +++ b/src/static/flags/1x1/id.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/ie.svg b/src/static/flags/1x1/ie.svg new file mode 100644 index 0000000..6b44322 --- /dev/null +++ b/src/static/flags/1x1/ie.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/il.svg b/src/static/flags/1x1/il.svg new file mode 100644 index 0000000..1359160 --- /dev/null +++ b/src/static/flags/1x1/il.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/im.svg b/src/static/flags/1x1/im.svg new file mode 100644 index 0000000..6143f5b --- /dev/null +++ b/src/static/flags/1x1/im.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/in.svg b/src/static/flags/1x1/in.svg new file mode 100644 index 0000000..9dbf204 --- /dev/null +++ b/src/static/flags/1x1/in.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/io.svg b/src/static/flags/1x1/io.svg new file mode 100644 index 0000000..585e76e --- /dev/null +++ b/src/static/flags/1x1/io.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/iq.svg b/src/static/flags/1x1/iq.svg new file mode 100644 index 0000000..100c336 --- /dev/null +++ b/src/static/flags/1x1/iq.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/static/flags/1x1/ir.svg b/src/static/flags/1x1/ir.svg new file mode 100644 index 0000000..a6419b5 --- /dev/null +++ b/src/static/flags/1x1/ir.svg @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/is.svg b/src/static/flags/1x1/is.svg new file mode 100644 index 0000000..f0c46ca --- /dev/null +++ b/src/static/flags/1x1/is.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/1x1/it.svg b/src/static/flags/1x1/it.svg new file mode 100644 index 0000000..125d41c --- /dev/null +++ b/src/static/flags/1x1/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/je.svg b/src/static/flags/1x1/je.svg new file mode 100644 index 0000000..8c3552d --- /dev/null +++ b/src/static/flags/1x1/je.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/jm.svg b/src/static/flags/1x1/jm.svg new file mode 100644 index 0000000..f241be7 --- /dev/null +++ b/src/static/flags/1x1/jm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/1x1/jo.svg b/src/static/flags/1x1/jo.svg new file mode 100644 index 0000000..4d7fcdd --- /dev/null +++ b/src/static/flags/1x1/jo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/jp.svg b/src/static/flags/1x1/jp.svg new file mode 100644 index 0000000..a7a1cbb --- /dev/null +++ b/src/static/flags/1x1/jp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/1x1/ke.svg b/src/static/flags/1x1/ke.svg new file mode 100644 index 0000000..098c78f --- /dev/null +++ b/src/static/flags/1x1/ke.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/kg.svg b/src/static/flags/1x1/kg.svg new file mode 100644 index 0000000..5a4be2b --- /dev/null +++ b/src/static/flags/1x1/kg.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/kh.svg b/src/static/flags/1x1/kh.svg new file mode 100644 index 0000000..bc0631d --- /dev/null +++ b/src/static/flags/1x1/kh.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ki.svg b/src/static/flags/1x1/ki.svg new file mode 100644 index 0000000..e363667 --- /dev/null +++ b/src/static/flags/1x1/ki.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/km.svg b/src/static/flags/1x1/km.svg new file mode 100644 index 0000000..11c3348 --- /dev/null +++ b/src/static/flags/1x1/km.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/kn.svg b/src/static/flags/1x1/kn.svg new file mode 100644 index 0000000..193b236 --- /dev/null +++ b/src/static/flags/1x1/kn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/kp.svg b/src/static/flags/1x1/kp.svg new file mode 100644 index 0000000..0c0521e --- /dev/null +++ b/src/static/flags/1x1/kp.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/kr.svg b/src/static/flags/1x1/kr.svg new file mode 100644 index 0000000..72f42c4 --- /dev/null +++ b/src/static/flags/1x1/kr.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/kw.svg b/src/static/flags/1x1/kw.svg new file mode 100644 index 0000000..f8176f0 --- /dev/null +++ b/src/static/flags/1x1/kw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ky.svg b/src/static/flags/1x1/ky.svg new file mode 100644 index 0000000..e661613 --- /dev/null +++ b/src/static/flags/1x1/ky.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/kz.svg b/src/static/flags/1x1/kz.svg new file mode 100644 index 0000000..7b2bb3c --- /dev/null +++ b/src/static/flags/1x1/kz.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/la.svg b/src/static/flags/1x1/la.svg new file mode 100644 index 0000000..b03cc49 --- /dev/null +++ b/src/static/flags/1x1/la.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/1x1/lb.svg b/src/static/flags/1x1/lb.svg new file mode 100644 index 0000000..9fc5a64 --- /dev/null +++ b/src/static/flags/1x1/lb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/lc.svg b/src/static/flags/1x1/lc.svg new file mode 100644 index 0000000..9f76562 --- /dev/null +++ b/src/static/flags/1x1/lc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/1x1/li.svg b/src/static/flags/1x1/li.svg new file mode 100644 index 0000000..e9ae555 --- /dev/null +++ b/src/static/flags/1x1/li.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/lk.svg b/src/static/flags/1x1/lk.svg new file mode 100644 index 0000000..de6a5ba --- /dev/null +++ b/src/static/flags/1x1/lk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/lr.svg b/src/static/flags/1x1/lr.svg new file mode 100644 index 0000000..4dbc516 --- /dev/null +++ b/src/static/flags/1x1/lr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ls.svg b/src/static/flags/1x1/ls.svg new file mode 100644 index 0000000..b200672 --- /dev/null +++ b/src/static/flags/1x1/ls.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/1x1/lt.svg b/src/static/flags/1x1/lt.svg new file mode 100644 index 0000000..2f03f7c --- /dev/null +++ b/src/static/flags/1x1/lt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/lu.svg b/src/static/flags/1x1/lu.svg new file mode 100644 index 0000000..505b0d6 --- /dev/null +++ b/src/static/flags/1x1/lu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/lv.svg b/src/static/flags/1x1/lv.svg new file mode 100644 index 0000000..4219876 --- /dev/null +++ b/src/static/flags/1x1/lv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/ly.svg b/src/static/flags/1x1/ly.svg new file mode 100644 index 0000000..98c1103 --- /dev/null +++ b/src/static/flags/1x1/ly.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ma.svg b/src/static/flags/1x1/ma.svg new file mode 100644 index 0000000..40db1ab --- /dev/null +++ b/src/static/flags/1x1/ma.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/static/flags/1x1/mc.svg b/src/static/flags/1x1/mc.svg new file mode 100644 index 0000000..8c53385 --- /dev/null +++ b/src/static/flags/1x1/mc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/md.svg b/src/static/flags/1x1/md.svg new file mode 100644 index 0000000..4851fa4 --- /dev/null +++ b/src/static/flags/1x1/md.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/me.svg b/src/static/flags/1x1/me.svg new file mode 100644 index 0000000..dd519bd --- /dev/null +++ b/src/static/flags/1x1/me.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/mf.svg b/src/static/flags/1x1/mf.svg new file mode 100644 index 0000000..2385562 --- /dev/null +++ b/src/static/flags/1x1/mf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/mg.svg b/src/static/flags/1x1/mg.svg new file mode 100644 index 0000000..ec53b17 --- /dev/null +++ b/src/static/flags/1x1/mg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/mh.svg b/src/static/flags/1x1/mh.svg new file mode 100644 index 0000000..f296605 --- /dev/null +++ b/src/static/flags/1x1/mh.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/1x1/mk.svg b/src/static/flags/1x1/mk.svg new file mode 100644 index 0000000..9c82c3c --- /dev/null +++ b/src/static/flags/1x1/mk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/ml.svg b/src/static/flags/1x1/ml.svg new file mode 100644 index 0000000..6b54ecb --- /dev/null +++ b/src/static/flags/1x1/ml.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/mm.svg b/src/static/flags/1x1/mm.svg new file mode 100644 index 0000000..562c97b --- /dev/null +++ b/src/static/flags/1x1/mm.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/mn.svg b/src/static/flags/1x1/mn.svg new file mode 100644 index 0000000..99cfeae --- /dev/null +++ b/src/static/flags/1x1/mn.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/mo.svg b/src/static/flags/1x1/mo.svg new file mode 100644 index 0000000..70ad7fd --- /dev/null +++ b/src/static/flags/1x1/mo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/mp.svg b/src/static/flags/1x1/mp.svg new file mode 100644 index 0000000..7d9f188 --- /dev/null +++ b/src/static/flags/1x1/mp.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/mq.svg b/src/static/flags/1x1/mq.svg new file mode 100644 index 0000000..2385562 --- /dev/null +++ b/src/static/flags/1x1/mq.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/mr.svg b/src/static/flags/1x1/mr.svg new file mode 100644 index 0000000..9b3d612 --- /dev/null +++ b/src/static/flags/1x1/mr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ms.svg b/src/static/flags/1x1/ms.svg new file mode 100644 index 0000000..91a4be7 --- /dev/null +++ b/src/static/flags/1x1/ms.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/mt.svg b/src/static/flags/1x1/mt.svg new file mode 100644 index 0000000..1e37824 --- /dev/null +++ b/src/static/flags/1x1/mt.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/mu.svg b/src/static/flags/1x1/mu.svg new file mode 100644 index 0000000..c84c685 --- /dev/null +++ b/src/static/flags/1x1/mu.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/1x1/mv.svg b/src/static/flags/1x1/mv.svg new file mode 100644 index 0000000..61d2bfc --- /dev/null +++ b/src/static/flags/1x1/mv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/mw.svg b/src/static/flags/1x1/mw.svg new file mode 100644 index 0000000..ee6be8f --- /dev/null +++ b/src/static/flags/1x1/mw.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/mx.svg b/src/static/flags/1x1/mx.svg new file mode 100644 index 0000000..61e1128 --- /dev/null +++ b/src/static/flags/1x1/mx.svg @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/my.svg b/src/static/flags/1x1/my.svg new file mode 100644 index 0000000..fd64f6b --- /dev/null +++ b/src/static/flags/1x1/my.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/mz.svg b/src/static/flags/1x1/mz.svg new file mode 100644 index 0000000..b6cd89d --- /dev/null +++ b/src/static/flags/1x1/mz.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/na.svg b/src/static/flags/1x1/na.svg new file mode 100644 index 0000000..2ccf17f --- /dev/null +++ b/src/static/flags/1x1/na.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/nc.svg b/src/static/flags/1x1/nc.svg new file mode 100644 index 0000000..2385562 --- /dev/null +++ b/src/static/flags/1x1/nc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/ne.svg b/src/static/flags/1x1/ne.svg new file mode 100644 index 0000000..90179f2 --- /dev/null +++ b/src/static/flags/1x1/ne.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/nf.svg b/src/static/flags/1x1/nf.svg new file mode 100644 index 0000000..e1473f6 --- /dev/null +++ b/src/static/flags/1x1/nf.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/1x1/ng.svg b/src/static/flags/1x1/ng.svg new file mode 100644 index 0000000..29b7329 --- /dev/null +++ b/src/static/flags/1x1/ng.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/ni.svg b/src/static/flags/1x1/ni.svg new file mode 100644 index 0000000..27d49a2 --- /dev/null +++ b/src/static/flags/1x1/ni.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/nl.svg b/src/static/flags/1x1/nl.svg new file mode 100644 index 0000000..af31c87 --- /dev/null +++ b/src/static/flags/1x1/nl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/no.svg b/src/static/flags/1x1/no.svg new file mode 100644 index 0000000..c8851f9 --- /dev/null +++ b/src/static/flags/1x1/no.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/np.svg b/src/static/flags/1x1/np.svg new file mode 100644 index 0000000..41127bf --- /dev/null +++ b/src/static/flags/1x1/np.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/nr.svg b/src/static/flags/1x1/nr.svg new file mode 100644 index 0000000..969f711 --- /dev/null +++ b/src/static/flags/1x1/nr.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/1x1/nu.svg b/src/static/flags/1x1/nu.svg new file mode 100644 index 0000000..2d9b2fd --- /dev/null +++ b/src/static/flags/1x1/nu.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/nz.svg b/src/static/flags/1x1/nz.svg new file mode 100644 index 0000000..0a3b102 --- /dev/null +++ b/src/static/flags/1x1/nz.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/om.svg b/src/static/flags/1x1/om.svg new file mode 100644 index 0000000..ba4e160 --- /dev/null +++ b/src/static/flags/1x1/om.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/pa.svg b/src/static/flags/1x1/pa.svg new file mode 100644 index 0000000..2cf091a --- /dev/null +++ b/src/static/flags/1x1/pa.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/pe.svg b/src/static/flags/1x1/pe.svg new file mode 100644 index 0000000..78455bc --- /dev/null +++ b/src/static/flags/1x1/pe.svg @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/pf.svg b/src/static/flags/1x1/pf.svg new file mode 100644 index 0000000..becd293 --- /dev/null +++ b/src/static/flags/1x1/pf.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/pg.svg b/src/static/flags/1x1/pg.svg new file mode 100644 index 0000000..a032732 --- /dev/null +++ b/src/static/flags/1x1/pg.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ph.svg b/src/static/flags/1x1/ph.svg new file mode 100644 index 0000000..b9d31b5 --- /dev/null +++ b/src/static/flags/1x1/ph.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/pk.svg b/src/static/flags/1x1/pk.svg new file mode 100644 index 0000000..d7722c9 --- /dev/null +++ b/src/static/flags/1x1/pk.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/pl.svg b/src/static/flags/1x1/pl.svg new file mode 100644 index 0000000..6818a05 --- /dev/null +++ b/src/static/flags/1x1/pl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/pm.svg b/src/static/flags/1x1/pm.svg new file mode 100644 index 0000000..2385562 --- /dev/null +++ b/src/static/flags/1x1/pm.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/pn.svg b/src/static/flags/1x1/pn.svg new file mode 100644 index 0000000..d27d977 --- /dev/null +++ b/src/static/flags/1x1/pn.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/pr.svg b/src/static/flags/1x1/pr.svg new file mode 100644 index 0000000..10d4055 --- /dev/null +++ b/src/static/flags/1x1/pr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ps.svg b/src/static/flags/1x1/ps.svg new file mode 100644 index 0000000..c712700 --- /dev/null +++ b/src/static/flags/1x1/ps.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/pt.svg b/src/static/flags/1x1/pt.svg new file mode 100644 index 0000000..bffbfcd --- /dev/null +++ b/src/static/flags/1x1/pt.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/pw.svg b/src/static/flags/1x1/pw.svg new file mode 100644 index 0000000..fd8bd35 --- /dev/null +++ b/src/static/flags/1x1/pw.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/1x1/py.svg b/src/static/flags/1x1/py.svg new file mode 100644 index 0000000..df61d0c --- /dev/null +++ b/src/static/flags/1x1/py.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/qa.svg b/src/static/flags/1x1/qa.svg new file mode 100644 index 0000000..88486de --- /dev/null +++ b/src/static/flags/1x1/qa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/static/flags/1x1/re.svg b/src/static/flags/1x1/re.svg new file mode 100644 index 0000000..2385562 --- /dev/null +++ b/src/static/flags/1x1/re.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/ro.svg b/src/static/flags/1x1/ro.svg new file mode 100644 index 0000000..e7cc44c --- /dev/null +++ b/src/static/flags/1x1/ro.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/rs.svg b/src/static/flags/1x1/rs.svg new file mode 100644 index 0000000..a613f0e --- /dev/null +++ b/src/static/flags/1x1/rs.svg @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ru.svg b/src/static/flags/1x1/ru.svg new file mode 100644 index 0000000..78cea08 --- /dev/null +++ b/src/static/flags/1x1/ru.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/rw.svg b/src/static/flags/1x1/rw.svg new file mode 100644 index 0000000..33ff031 --- /dev/null +++ b/src/static/flags/1x1/rw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sa.svg b/src/static/flags/1x1/sa.svg new file mode 100644 index 0000000..a12ae3b --- /dev/null +++ b/src/static/flags/1x1/sa.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sb.svg b/src/static/flags/1x1/sb.svg new file mode 100644 index 0000000..f2b3508 --- /dev/null +++ b/src/static/flags/1x1/sb.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sc.svg b/src/static/flags/1x1/sc.svg new file mode 100644 index 0000000..f13b625 --- /dev/null +++ b/src/static/flags/1x1/sc.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sd.svg b/src/static/flags/1x1/sd.svg new file mode 100644 index 0000000..9d50744 --- /dev/null +++ b/src/static/flags/1x1/sd.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/se.svg b/src/static/flags/1x1/se.svg new file mode 100644 index 0000000..0e07503 --- /dev/null +++ b/src/static/flags/1x1/se.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sg.svg b/src/static/flags/1x1/sg.svg new file mode 100644 index 0000000..04b19eb --- /dev/null +++ b/src/static/flags/1x1/sg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sh.svg b/src/static/flags/1x1/sh.svg new file mode 100644 index 0000000..ad7c2d0 --- /dev/null +++ b/src/static/flags/1x1/sh.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/si.svg b/src/static/flags/1x1/si.svg new file mode 100644 index 0000000..fa15217 --- /dev/null +++ b/src/static/flags/1x1/si.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sj.svg b/src/static/flags/1x1/sj.svg new file mode 100644 index 0000000..c8851f9 --- /dev/null +++ b/src/static/flags/1x1/sj.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/sk.svg b/src/static/flags/1x1/sk.svg new file mode 100644 index 0000000..8b4dd8d --- /dev/null +++ b/src/static/flags/1x1/sk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/sl.svg b/src/static/flags/1x1/sl.svg new file mode 100644 index 0000000..42a34ea --- /dev/null +++ b/src/static/flags/1x1/sl.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sm.svg b/src/static/flags/1x1/sm.svg new file mode 100644 index 0000000..e3afd20 --- /dev/null +++ b/src/static/flags/1x1/sm.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L + + + I + + + B + + + E + + + R + + + T + + + A + + + S + + + + diff --git a/src/static/flags/1x1/sn.svg b/src/static/flags/1x1/sn.svg new file mode 100644 index 0000000..dfc5114 --- /dev/null +++ b/src/static/flags/1x1/sn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/1x1/so.svg b/src/static/flags/1x1/so.svg new file mode 100644 index 0000000..032dc58 --- /dev/null +++ b/src/static/flags/1x1/so.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/1x1/sr.svg b/src/static/flags/1x1/sr.svg new file mode 100644 index 0000000..f020a22 --- /dev/null +++ b/src/static/flags/1x1/sr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/ss.svg b/src/static/flags/1x1/ss.svg new file mode 100644 index 0000000..ce272c0 --- /dev/null +++ b/src/static/flags/1x1/ss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/1x1/st.svg b/src/static/flags/1x1/st.svg new file mode 100644 index 0000000..8aab85a --- /dev/null +++ b/src/static/flags/1x1/st.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sv.svg b/src/static/flags/1x1/sv.svg new file mode 100644 index 0000000..c902f40 --- /dev/null +++ b/src/static/flags/1x1/sv.svg @@ -0,0 +1,621 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sx.svg b/src/static/flags/1x1/sx.svg new file mode 100644 index 0000000..e0ac27e --- /dev/null +++ b/src/static/flags/1x1/sx.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/sy.svg b/src/static/flags/1x1/sy.svg new file mode 100644 index 0000000..b8d910d --- /dev/null +++ b/src/static/flags/1x1/sy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/sz.svg b/src/static/flags/1x1/sz.svg new file mode 100644 index 0000000..d2529e9 --- /dev/null +++ b/src/static/flags/1x1/sz.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/tc.svg b/src/static/flags/1x1/tc.svg new file mode 100644 index 0000000..6d7332b --- /dev/null +++ b/src/static/flags/1x1/tc.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/td.svg b/src/static/flags/1x1/td.svg new file mode 100644 index 0000000..4e74705 --- /dev/null +++ b/src/static/flags/1x1/td.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/tf.svg b/src/static/flags/1x1/tf.svg new file mode 100644 index 0000000..e4cb677 --- /dev/null +++ b/src/static/flags/1x1/tf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/tg.svg b/src/static/flags/1x1/tg.svg new file mode 100644 index 0000000..ebab69a --- /dev/null +++ b/src/static/flags/1x1/tg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/th.svg b/src/static/flags/1x1/th.svg new file mode 100644 index 0000000..caa2c57 --- /dev/null +++ b/src/static/flags/1x1/th.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/tj.svg b/src/static/flags/1x1/tj.svg new file mode 100644 index 0000000..be4518d --- /dev/null +++ b/src/static/flags/1x1/tj.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/tk.svg b/src/static/flags/1x1/tk.svg new file mode 100644 index 0000000..7b0c888 --- /dev/null +++ b/src/static/flags/1x1/tk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/1x1/tl.svg b/src/static/flags/1x1/tl.svg new file mode 100644 index 0000000..1bdde24 --- /dev/null +++ b/src/static/flags/1x1/tl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/tm.svg b/src/static/flags/1x1/tm.svg new file mode 100644 index 0000000..a45d767 --- /dev/null +++ b/src/static/flags/1x1/tm.svg @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/tn.svg b/src/static/flags/1x1/tn.svg new file mode 100644 index 0000000..4dbf359 --- /dev/null +++ b/src/static/flags/1x1/tn.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/to.svg b/src/static/flags/1x1/to.svg new file mode 100644 index 0000000..71c6631 --- /dev/null +++ b/src/static/flags/1x1/to.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/static/flags/1x1/tr.svg b/src/static/flags/1x1/tr.svg new file mode 100644 index 0000000..3b44b79 --- /dev/null +++ b/src/static/flags/1x1/tr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/1x1/tt.svg b/src/static/flags/1x1/tt.svg new file mode 100644 index 0000000..7fd199c --- /dev/null +++ b/src/static/flags/1x1/tt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/tv.svg b/src/static/flags/1x1/tv.svg new file mode 100644 index 0000000..c36ce7f --- /dev/null +++ b/src/static/flags/1x1/tv.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/tw.svg b/src/static/flags/1x1/tw.svg new file mode 100644 index 0000000..d802078 --- /dev/null +++ b/src/static/flags/1x1/tw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/tz.svg b/src/static/flags/1x1/tz.svg new file mode 100644 index 0000000..58e9e1a --- /dev/null +++ b/src/static/flags/1x1/tz.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/ua.svg b/src/static/flags/1x1/ua.svg new file mode 100644 index 0000000..90d8551 --- /dev/null +++ b/src/static/flags/1x1/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/1x1/ug.svg b/src/static/flags/1x1/ug.svg new file mode 100644 index 0000000..477edd2 --- /dev/null +++ b/src/static/flags/1x1/ug.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/um.svg b/src/static/flags/1x1/um.svg new file mode 100644 index 0000000..037114a --- /dev/null +++ b/src/static/flags/1x1/um.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/un.svg b/src/static/flags/1x1/un.svg new file mode 100644 index 0000000..f259213 --- /dev/null +++ b/src/static/flags/1x1/un.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/us.svg b/src/static/flags/1x1/us.svg new file mode 100644 index 0000000..15d50af --- /dev/null +++ b/src/static/flags/1x1/us.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/uy.svg b/src/static/flags/1x1/uy.svg new file mode 100644 index 0000000..13eba52 --- /dev/null +++ b/src/static/flags/1x1/uy.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/uz.svg b/src/static/flags/1x1/uz.svg new file mode 100644 index 0000000..80a0aa5 --- /dev/null +++ b/src/static/flags/1x1/uz.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/va.svg b/src/static/flags/1x1/va.svg new file mode 100644 index 0000000..16fa3fa --- /dev/null +++ b/src/static/flags/1x1/va.svg @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/vc.svg b/src/static/flags/1x1/vc.svg new file mode 100644 index 0000000..7dd8df0 --- /dev/null +++ b/src/static/flags/1x1/vc.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/static/flags/1x1/ve.svg b/src/static/flags/1x1/ve.svg new file mode 100644 index 0000000..96a8853 --- /dev/null +++ b/src/static/flags/1x1/ve.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/vg.svg b/src/static/flags/1x1/vg.svg new file mode 100644 index 0000000..db5fd17 --- /dev/null +++ b/src/static/flags/1x1/vg.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/vi.svg b/src/static/flags/1x1/vi.svg new file mode 100644 index 0000000..b99c568 --- /dev/null +++ b/src/static/flags/1x1/vi.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/vn.svg b/src/static/flags/1x1/vn.svg new file mode 100644 index 0000000..1653281 --- /dev/null +++ b/src/static/flags/1x1/vn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/1x1/vu.svg b/src/static/flags/1x1/vu.svg new file mode 100644 index 0000000..11307f6 --- /dev/null +++ b/src/static/flags/1x1/vu.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/wf.svg b/src/static/flags/1x1/wf.svg new file mode 100644 index 0000000..f1725d8 --- /dev/null +++ b/src/static/flags/1x1/wf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/ws.svg b/src/static/flags/1x1/ws.svg new file mode 100644 index 0000000..1cc33ab --- /dev/null +++ b/src/static/flags/1x1/ws.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/1x1/ye.svg b/src/static/flags/1x1/ye.svg new file mode 100644 index 0000000..cdc7769 --- /dev/null +++ b/src/static/flags/1x1/ye.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/yt.svg b/src/static/flags/1x1/yt.svg new file mode 100644 index 0000000..2385562 --- /dev/null +++ b/src/static/flags/1x1/yt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/1x1/za.svg b/src/static/flags/1x1/za.svg new file mode 100644 index 0000000..83c3792 --- /dev/null +++ b/src/static/flags/1x1/za.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/zm.svg b/src/static/flags/1x1/zm.svg new file mode 100644 index 0000000..f1f63da --- /dev/null +++ b/src/static/flags/1x1/zm.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/1x1/zw.svg b/src/static/flags/1x1/zw.svg new file mode 100644 index 0000000..00eaf58 --- /dev/null +++ b/src/static/flags/1x1/zw.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ad.svg b/src/static/flags/4x3/ad.svg new file mode 100644 index 0000000..07ae7e0 --- /dev/null +++ b/src/static/flags/4x3/ad.svg @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ae.svg b/src/static/flags/4x3/ae.svg new file mode 100644 index 0000000..ef64730 --- /dev/null +++ b/src/static/flags/4x3/ae.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/af.svg b/src/static/flags/4x3/af.svg new file mode 100644 index 0000000..95f38b7 --- /dev/null +++ b/src/static/flags/4x3/af.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ag.svg b/src/static/flags/4x3/ag.svg new file mode 100644 index 0000000..f6a9ad4 --- /dev/null +++ b/src/static/flags/4x3/ag.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ai.svg b/src/static/flags/4x3/ai.svg new file mode 100644 index 0000000..8cbe796 --- /dev/null +++ b/src/static/flags/4x3/ai.svg @@ -0,0 +1,767 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/al.svg b/src/static/flags/4x3/al.svg new file mode 100644 index 0000000..8846696 --- /dev/null +++ b/src/static/flags/4x3/al.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/am.svg b/src/static/flags/4x3/am.svg new file mode 100644 index 0000000..046d22f --- /dev/null +++ b/src/static/flags/4x3/am.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/ao.svg b/src/static/flags/4x3/ao.svg new file mode 100644 index 0000000..32b49ea --- /dev/null +++ b/src/static/flags/4x3/ao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/aq.svg b/src/static/flags/4x3/aq.svg new file mode 100644 index 0000000..656c8b7 --- /dev/null +++ b/src/static/flags/4x3/aq.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/ar.svg b/src/static/flags/4x3/ar.svg new file mode 100644 index 0000000..6750068 --- /dev/null +++ b/src/static/flags/4x3/ar.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/as.svg b/src/static/flags/4x3/as.svg new file mode 100644 index 0000000..3bdc5bc --- /dev/null +++ b/src/static/flags/4x3/as.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/at.svg b/src/static/flags/4x3/at.svg new file mode 100644 index 0000000..0e45da9 --- /dev/null +++ b/src/static/flags/4x3/at.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/au.svg b/src/static/flags/4x3/au.svg new file mode 100644 index 0000000..cd823e1 --- /dev/null +++ b/src/static/flags/4x3/au.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/aw.svg b/src/static/flags/4x3/aw.svg new file mode 100644 index 0000000..7e7087d --- /dev/null +++ b/src/static/flags/4x3/aw.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ax.svg b/src/static/flags/4x3/ax.svg new file mode 100644 index 0000000..fa9417e --- /dev/null +++ b/src/static/flags/4x3/ax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/az.svg b/src/static/flags/4x3/az.svg new file mode 100644 index 0000000..f563b60 --- /dev/null +++ b/src/static/flags/4x3/az.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/4x3/ba.svg b/src/static/flags/4x3/ba.svg new file mode 100644 index 0000000..9d0ec2d --- /dev/null +++ b/src/static/flags/4x3/ba.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bb.svg b/src/static/flags/4x3/bb.svg new file mode 100644 index 0000000..da8972e --- /dev/null +++ b/src/static/flags/4x3/bb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/bd.svg b/src/static/flags/4x3/bd.svg new file mode 100644 index 0000000..df9a6d8 --- /dev/null +++ b/src/static/flags/4x3/bd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/static/flags/4x3/be.svg b/src/static/flags/4x3/be.svg new file mode 100644 index 0000000..4fd48df --- /dev/null +++ b/src/static/flags/4x3/be.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/bf.svg b/src/static/flags/4x3/bf.svg new file mode 100644 index 0000000..46061b9 --- /dev/null +++ b/src/static/flags/4x3/bf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/bg.svg b/src/static/flags/4x3/bg.svg new file mode 100644 index 0000000..3cec9c7 --- /dev/null +++ b/src/static/flags/4x3/bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/bh.svg b/src/static/flags/4x3/bh.svg new file mode 100644 index 0000000..42dda2c --- /dev/null +++ b/src/static/flags/4x3/bh.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/4x3/bi.svg b/src/static/flags/4x3/bi.svg new file mode 100644 index 0000000..dc0e0e7 --- /dev/null +++ b/src/static/flags/4x3/bi.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bj.svg b/src/static/flags/4x3/bj.svg new file mode 100644 index 0000000..a626289 --- /dev/null +++ b/src/static/flags/4x3/bj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bl.svg b/src/static/flags/4x3/bl.svg new file mode 100644 index 0000000..db651fc --- /dev/null +++ b/src/static/flags/4x3/bl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/bm.svg b/src/static/flags/4x3/bm.svg new file mode 100644 index 0000000..b7c79f2 --- /dev/null +++ b/src/static/flags/4x3/bm.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bn.svg b/src/static/flags/4x3/bn.svg new file mode 100644 index 0000000..109576c --- /dev/null +++ b/src/static/flags/4x3/bn.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bo.svg b/src/static/flags/4x3/bo.svg new file mode 100644 index 0000000..c443ec5 --- /dev/null +++ b/src/static/flags/4x3/bo.svg @@ -0,0 +1,686 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bq.svg b/src/static/flags/4x3/bq.svg new file mode 100644 index 0000000..0a7b5f8 --- /dev/null +++ b/src/static/flags/4x3/bq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/br.svg b/src/static/flags/4x3/br.svg new file mode 100644 index 0000000..c0445ba --- /dev/null +++ b/src/static/flags/4x3/br.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bs.svg b/src/static/flags/4x3/bs.svg new file mode 100644 index 0000000..321eb19 --- /dev/null +++ b/src/static/flags/4x3/bs.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bt.svg b/src/static/flags/4x3/bt.svg new file mode 100644 index 0000000..05df9c8 --- /dev/null +++ b/src/static/flags/4x3/bt.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bv.svg b/src/static/flags/4x3/bv.svg new file mode 100644 index 0000000..a62e60d --- /dev/null +++ b/src/static/flags/4x3/bv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bw.svg b/src/static/flags/4x3/bw.svg new file mode 100644 index 0000000..ed161bf --- /dev/null +++ b/src/static/flags/4x3/bw.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/by.svg b/src/static/flags/4x3/by.svg new file mode 100644 index 0000000..bfb0f64 --- /dev/null +++ b/src/static/flags/4x3/by.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/bz.svg b/src/static/flags/4x3/bz.svg new file mode 100644 index 0000000..440fd9d --- /dev/null +++ b/src/static/flags/4x3/bz.svg @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ca.svg b/src/static/flags/4x3/ca.svg new file mode 100644 index 0000000..fb542b0 --- /dev/null +++ b/src/static/flags/4x3/ca.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/cc.svg b/src/static/flags/4x3/cc.svg new file mode 100644 index 0000000..0e44596 --- /dev/null +++ b/src/static/flags/4x3/cc.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/cd.svg b/src/static/flags/4x3/cd.svg new file mode 100644 index 0000000..d8931c2 --- /dev/null +++ b/src/static/flags/4x3/cd.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/cf.svg b/src/static/flags/4x3/cf.svg new file mode 100644 index 0000000..8a67616 --- /dev/null +++ b/src/static/flags/4x3/cf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/cg.svg b/src/static/flags/4x3/cg.svg new file mode 100644 index 0000000..f37bff8 --- /dev/null +++ b/src/static/flags/4x3/cg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ch.svg b/src/static/flags/4x3/ch.svg new file mode 100644 index 0000000..6157702 --- /dev/null +++ b/src/static/flags/4x3/ch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/ci.svg b/src/static/flags/4x3/ci.svg new file mode 100644 index 0000000..6b4f66e --- /dev/null +++ b/src/static/flags/4x3/ci.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/ck.svg b/src/static/flags/4x3/ck.svg new file mode 100644 index 0000000..f3ce1af --- /dev/null +++ b/src/static/flags/4x3/ck.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/cl.svg b/src/static/flags/4x3/cl.svg new file mode 100644 index 0000000..63ee47c --- /dev/null +++ b/src/static/flags/4x3/cl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/cm.svg b/src/static/flags/4x3/cm.svg new file mode 100644 index 0000000..1bef2f8 --- /dev/null +++ b/src/static/flags/4x3/cm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/cn.svg b/src/static/flags/4x3/cn.svg new file mode 100644 index 0000000..4381476 --- /dev/null +++ b/src/static/flags/4x3/cn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/4x3/co.svg b/src/static/flags/4x3/co.svg new file mode 100644 index 0000000..671f0a3 --- /dev/null +++ b/src/static/flags/4x3/co.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/cr.svg b/src/static/flags/4x3/cr.svg new file mode 100644 index 0000000..ca6d24f --- /dev/null +++ b/src/static/flags/4x3/cr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/cu.svg b/src/static/flags/4x3/cu.svg new file mode 100644 index 0000000..0e7c323 --- /dev/null +++ b/src/static/flags/4x3/cu.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/cv.svg b/src/static/flags/4x3/cv.svg new file mode 100644 index 0000000..bf9427b --- /dev/null +++ b/src/static/flags/4x3/cv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/cw.svg b/src/static/flags/4x3/cw.svg new file mode 100644 index 0000000..dce07cf --- /dev/null +++ b/src/static/flags/4x3/cw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/cx.svg b/src/static/flags/4x3/cx.svg new file mode 100644 index 0000000..53f0ee8 --- /dev/null +++ b/src/static/flags/4x3/cx.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/cy.svg b/src/static/flags/4x3/cy.svg new file mode 100644 index 0000000..aa46cda --- /dev/null +++ b/src/static/flags/4x3/cy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/cz.svg b/src/static/flags/4x3/cz.svg new file mode 100644 index 0000000..236c4ba --- /dev/null +++ b/src/static/flags/4x3/cz.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/4x3/de.svg b/src/static/flags/4x3/de.svg new file mode 100644 index 0000000..344d6c9 --- /dev/null +++ b/src/static/flags/4x3/de.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/dj.svg b/src/static/flags/4x3/dj.svg new file mode 100644 index 0000000..eb23800 --- /dev/null +++ b/src/static/flags/4x3/dj.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/dk.svg b/src/static/flags/4x3/dk.svg new file mode 100644 index 0000000..b29f331 --- /dev/null +++ b/src/static/flags/4x3/dk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/dm.svg b/src/static/flags/4x3/dm.svg new file mode 100644 index 0000000..b060f6f --- /dev/null +++ b/src/static/flags/4x3/dm.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/do.svg b/src/static/flags/4x3/do.svg new file mode 100644 index 0000000..2923855 --- /dev/null +++ b/src/static/flags/4x3/do.svg @@ -0,0 +1,6745 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/dz.svg b/src/static/flags/4x3/dz.svg new file mode 100644 index 0000000..9971ec6 --- /dev/null +++ b/src/static/flags/4x3/dz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/ec.svg b/src/static/flags/4x3/ec.svg new file mode 100644 index 0000000..01ef340 --- /dev/null +++ b/src/static/flags/4x3/ec.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ee.svg b/src/static/flags/4x3/ee.svg new file mode 100644 index 0000000..e4eead4 --- /dev/null +++ b/src/static/flags/4x3/ee.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/eg.svg b/src/static/flags/4x3/eg.svg new file mode 100644 index 0000000..d4bed74 --- /dev/null +++ b/src/static/flags/4x3/eg.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/eh.svg b/src/static/flags/4x3/eh.svg new file mode 100644 index 0000000..efdd83b --- /dev/null +++ b/src/static/flags/4x3/eh.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/er.svg b/src/static/flags/4x3/er.svg new file mode 100644 index 0000000..4a2b17c --- /dev/null +++ b/src/static/flags/4x3/er.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/4x3/es.svg b/src/static/flags/4x3/es.svg new file mode 100644 index 0000000..3a9dcd2 --- /dev/null +++ b/src/static/flags/4x3/es.svg @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/et.svg b/src/static/flags/4x3/et.svg new file mode 100644 index 0000000..09e5d3d --- /dev/null +++ b/src/static/flags/4x3/et.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/eu.svg b/src/static/flags/4x3/eu.svg new file mode 100644 index 0000000..4cf8a66 --- /dev/null +++ b/src/static/flags/4x3/eu.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/fi.svg b/src/static/flags/4x3/fi.svg new file mode 100644 index 0000000..a7b58e2 --- /dev/null +++ b/src/static/flags/4x3/fi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/fj.svg b/src/static/flags/4x3/fj.svg new file mode 100644 index 0000000..9f5e2a5 --- /dev/null +++ b/src/static/flags/4x3/fj.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/fk.svg b/src/static/flags/4x3/fk.svg new file mode 100644 index 0000000..7864f54 --- /dev/null +++ b/src/static/flags/4x3/fk.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/fm.svg b/src/static/flags/4x3/fm.svg new file mode 100644 index 0000000..e9d1f66 --- /dev/null +++ b/src/static/flags/4x3/fm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/4x3/fo.svg b/src/static/flags/4x3/fo.svg new file mode 100644 index 0000000..d22c0cb --- /dev/null +++ b/src/static/flags/4x3/fo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/4x3/fr.svg b/src/static/flags/4x3/fr.svg new file mode 100644 index 0000000..b17c8ad --- /dev/null +++ b/src/static/flags/4x3/fr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/ga.svg b/src/static/flags/4x3/ga.svg new file mode 100644 index 0000000..1c7fdd3 --- /dev/null +++ b/src/static/flags/4x3/ga.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/gb-eng.svg b/src/static/flags/4x3/gb-eng.svg new file mode 100644 index 0000000..7fa48fa --- /dev/null +++ b/src/static/flags/4x3/gb-eng.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/gb-nir.svg b/src/static/flags/4x3/gb-nir.svg new file mode 100644 index 0000000..8c26551 --- /dev/null +++ b/src/static/flags/4x3/gb-nir.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/gb-sct.svg b/src/static/flags/4x3/gb-sct.svg new file mode 100644 index 0000000..5e47f07 --- /dev/null +++ b/src/static/flags/4x3/gb-sct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/static/flags/4x3/gb-wls.svg b/src/static/flags/4x3/gb-wls.svg new file mode 100644 index 0000000..59b4181 --- /dev/null +++ b/src/static/flags/4x3/gb-wls.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/gb.svg b/src/static/flags/4x3/gb.svg new file mode 100644 index 0000000..7296592 --- /dev/null +++ b/src/static/flags/4x3/gb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/gd.svg b/src/static/flags/4x3/gd.svg new file mode 100644 index 0000000..5d84dc7 --- /dev/null +++ b/src/static/flags/4x3/gd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ge.svg b/src/static/flags/4x3/ge.svg new file mode 100644 index 0000000..0a9129c --- /dev/null +++ b/src/static/flags/4x3/ge.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/gf.svg b/src/static/flags/4x3/gf.svg new file mode 100644 index 0000000..25d0159 --- /dev/null +++ b/src/static/flags/4x3/gf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/gg.svg b/src/static/flags/4x3/gg.svg new file mode 100644 index 0000000..4869ed6 --- /dev/null +++ b/src/static/flags/4x3/gg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/gh.svg b/src/static/flags/4x3/gh.svg new file mode 100644 index 0000000..56c18f6 --- /dev/null +++ b/src/static/flags/4x3/gh.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/gi.svg b/src/static/flags/4x3/gi.svg new file mode 100644 index 0000000..0715e01 --- /dev/null +++ b/src/static/flags/4x3/gi.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/gl.svg b/src/static/flags/4x3/gl.svg new file mode 100644 index 0000000..38e9b5c --- /dev/null +++ b/src/static/flags/4x3/gl.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/4x3/gm.svg b/src/static/flags/4x3/gm.svg new file mode 100644 index 0000000..9d2ce5c --- /dev/null +++ b/src/static/flags/4x3/gm.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/gn.svg b/src/static/flags/4x3/gn.svg new file mode 100644 index 0000000..4a3adab --- /dev/null +++ b/src/static/flags/4x3/gn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/gp.svg b/src/static/flags/4x3/gp.svg new file mode 100644 index 0000000..b17c8ad --- /dev/null +++ b/src/static/flags/4x3/gp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/gq.svg b/src/static/flags/4x3/gq.svg new file mode 100644 index 0000000..9e3c900 --- /dev/null +++ b/src/static/flags/4x3/gq.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/gr.svg b/src/static/flags/4x3/gr.svg new file mode 100644 index 0000000..5126e38 --- /dev/null +++ b/src/static/flags/4x3/gr.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/gs.svg b/src/static/flags/4x3/gs.svg new file mode 100644 index 0000000..43b8fd6 --- /dev/null +++ b/src/static/flags/4x3/gs.svg @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L + + + E + + + O + + + T + + + E + + + R + + + R + + + R + + + R + + + R + + + E + + + O + + + O + + + A + + + A + + + A + + + M + + + P + + + P + + + P + + + I + + + T + + + T + + + M + + + G + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/gt.svg b/src/static/flags/4x3/gt.svg new file mode 100644 index 0000000..0fdaa11 --- /dev/null +++ b/src/static/flags/4x3/gt.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/gu.svg b/src/static/flags/4x3/gu.svg new file mode 100644 index 0000000..b4885bd --- /dev/null +++ b/src/static/flags/4x3/gu.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + G + + + U + + + A + + + M + + + + + + + + G + + + U + + + A + + + M + + diff --git a/src/static/flags/4x3/gw.svg b/src/static/flags/4x3/gw.svg new file mode 100644 index 0000000..be1d5c3 --- /dev/null +++ b/src/static/flags/4x3/gw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/gy.svg b/src/static/flags/4x3/gy.svg new file mode 100644 index 0000000..218ecce --- /dev/null +++ b/src/static/flags/4x3/gy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/hk.svg b/src/static/flags/4x3/hk.svg new file mode 100644 index 0000000..df8aefd --- /dev/null +++ b/src/static/flags/4x3/hk.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/hm.svg b/src/static/flags/4x3/hm.svg new file mode 100644 index 0000000..67cec54 --- /dev/null +++ b/src/static/flags/4x3/hm.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/hn.svg b/src/static/flags/4x3/hn.svg new file mode 100644 index 0000000..6e9bb25 --- /dev/null +++ b/src/static/flags/4x3/hn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/hr.svg b/src/static/flags/4x3/hr.svg new file mode 100644 index 0000000..bf33cbe --- /dev/null +++ b/src/static/flags/4x3/hr.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ht.svg b/src/static/flags/4x3/ht.svg new file mode 100644 index 0000000..4cee314 --- /dev/null +++ b/src/static/flags/4x3/ht.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/hu.svg b/src/static/flags/4x3/hu.svg new file mode 100644 index 0000000..cb7e5ee --- /dev/null +++ b/src/static/flags/4x3/hu.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/id.svg b/src/static/flags/4x3/id.svg new file mode 100644 index 0000000..4df97ba --- /dev/null +++ b/src/static/flags/4x3/id.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/ie.svg b/src/static/flags/4x3/ie.svg new file mode 100644 index 0000000..b295b50 --- /dev/null +++ b/src/static/flags/4x3/ie.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/il.svg b/src/static/flags/4x3/il.svg new file mode 100644 index 0000000..b22f792 --- /dev/null +++ b/src/static/flags/4x3/il.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/im.svg b/src/static/flags/4x3/im.svg new file mode 100644 index 0000000..5864dc0 --- /dev/null +++ b/src/static/flags/4x3/im.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/in.svg b/src/static/flags/4x3/in.svg new file mode 100644 index 0000000..7eeb5c3 --- /dev/null +++ b/src/static/flags/4x3/in.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/io.svg b/src/static/flags/4x3/io.svg new file mode 100644 index 0000000..d5c6db5 --- /dev/null +++ b/src/static/flags/4x3/io.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/iq.svg b/src/static/flags/4x3/iq.svg new file mode 100644 index 0000000..c1fb196 --- /dev/null +++ b/src/static/flags/4x3/iq.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/static/flags/4x3/ir.svg b/src/static/flags/4x3/ir.svg new file mode 100644 index 0000000..9a6feaf --- /dev/null +++ b/src/static/flags/4x3/ir.svg @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/is.svg b/src/static/flags/4x3/is.svg new file mode 100644 index 0000000..f5c5c9a --- /dev/null +++ b/src/static/flags/4x3/is.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/4x3/it.svg b/src/static/flags/4x3/it.svg new file mode 100644 index 0000000..05d58ec --- /dev/null +++ b/src/static/flags/4x3/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/je.svg b/src/static/flags/4x3/je.svg new file mode 100644 index 0000000..c5c1877 --- /dev/null +++ b/src/static/flags/4x3/je.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/jm.svg b/src/static/flags/4x3/jm.svg new file mode 100644 index 0000000..bda8cd3 --- /dev/null +++ b/src/static/flags/4x3/jm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/4x3/jo.svg b/src/static/flags/4x3/jo.svg new file mode 100644 index 0000000..a321347 --- /dev/null +++ b/src/static/flags/4x3/jo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/jp.svg b/src/static/flags/4x3/jp.svg new file mode 100644 index 0000000..ed5fd40 --- /dev/null +++ b/src/static/flags/4x3/jp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/4x3/ke.svg b/src/static/flags/4x3/ke.svg new file mode 100644 index 0000000..fe8fd0c --- /dev/null +++ b/src/static/flags/4x3/ke.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/kg.svg b/src/static/flags/4x3/kg.svg new file mode 100644 index 0000000..fba85f5 --- /dev/null +++ b/src/static/flags/4x3/kg.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/kh.svg b/src/static/flags/4x3/kh.svg new file mode 100644 index 0000000..e48f41e --- /dev/null +++ b/src/static/flags/4x3/kh.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ki.svg b/src/static/flags/4x3/ki.svg new file mode 100644 index 0000000..11b0d40 --- /dev/null +++ b/src/static/flags/4x3/ki.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/km.svg b/src/static/flags/4x3/km.svg new file mode 100644 index 0000000..b3dfb68 --- /dev/null +++ b/src/static/flags/4x3/km.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/kn.svg b/src/static/flags/4x3/kn.svg new file mode 100644 index 0000000..d078161 --- /dev/null +++ b/src/static/flags/4x3/kn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/kp.svg b/src/static/flags/4x3/kp.svg new file mode 100644 index 0000000..f986141 --- /dev/null +++ b/src/static/flags/4x3/kp.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/kr.svg b/src/static/flags/4x3/kr.svg new file mode 100644 index 0000000..ee84b6e --- /dev/null +++ b/src/static/flags/4x3/kr.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/kw.svg b/src/static/flags/4x3/kw.svg new file mode 100644 index 0000000..3217d78 --- /dev/null +++ b/src/static/flags/4x3/kw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ky.svg b/src/static/flags/4x3/ky.svg new file mode 100644 index 0000000..ac1d318 --- /dev/null +++ b/src/static/flags/4x3/ky.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/kz.svg b/src/static/flags/4x3/kz.svg new file mode 100644 index 0000000..7949bce --- /dev/null +++ b/src/static/flags/4x3/kz.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/la.svg b/src/static/flags/4x3/la.svg new file mode 100644 index 0000000..72ba65f --- /dev/null +++ b/src/static/flags/4x3/la.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/4x3/lb.svg b/src/static/flags/4x3/lb.svg new file mode 100644 index 0000000..a6b1794 --- /dev/null +++ b/src/static/flags/4x3/lb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/lc.svg b/src/static/flags/4x3/lc.svg new file mode 100644 index 0000000..aacce3e --- /dev/null +++ b/src/static/flags/4x3/lc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/4x3/li.svg b/src/static/flags/4x3/li.svg new file mode 100644 index 0000000..57ef479 --- /dev/null +++ b/src/static/flags/4x3/li.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/lk.svg b/src/static/flags/4x3/lk.svg new file mode 100644 index 0000000..13b5592 --- /dev/null +++ b/src/static/flags/4x3/lk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/lr.svg b/src/static/flags/4x3/lr.svg new file mode 100644 index 0000000..56fdc62 --- /dev/null +++ b/src/static/flags/4x3/lr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ls.svg b/src/static/flags/4x3/ls.svg new file mode 100644 index 0000000..e7bf1c2 --- /dev/null +++ b/src/static/flags/4x3/ls.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/4x3/lt.svg b/src/static/flags/4x3/lt.svg new file mode 100644 index 0000000..1ca1cd4 --- /dev/null +++ b/src/static/flags/4x3/lt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/lu.svg b/src/static/flags/4x3/lu.svg new file mode 100644 index 0000000..d7f4a7c --- /dev/null +++ b/src/static/flags/4x3/lu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/lv.svg b/src/static/flags/4x3/lv.svg new file mode 100644 index 0000000..338addd --- /dev/null +++ b/src/static/flags/4x3/lv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/ly.svg b/src/static/flags/4x3/ly.svg new file mode 100644 index 0000000..96ab5ad --- /dev/null +++ b/src/static/flags/4x3/ly.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ma.svg b/src/static/flags/4x3/ma.svg new file mode 100644 index 0000000..10447a4 --- /dev/null +++ b/src/static/flags/4x3/ma.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/static/flags/4x3/mc.svg b/src/static/flags/4x3/mc.svg new file mode 100644 index 0000000..8a4e827 --- /dev/null +++ b/src/static/flags/4x3/mc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/md.svg b/src/static/flags/4x3/md.svg new file mode 100644 index 0000000..8d51756 --- /dev/null +++ b/src/static/flags/4x3/md.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/me.svg b/src/static/flags/4x3/me.svg new file mode 100644 index 0000000..ed97b12 --- /dev/null +++ b/src/static/flags/4x3/me.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/mf.svg b/src/static/flags/4x3/mf.svg new file mode 100644 index 0000000..b17c8ad --- /dev/null +++ b/src/static/flags/4x3/mf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/mg.svg b/src/static/flags/4x3/mg.svg new file mode 100644 index 0000000..cce2bf1 --- /dev/null +++ b/src/static/flags/4x3/mg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/mh.svg b/src/static/flags/4x3/mh.svg new file mode 100644 index 0000000..ed16809 --- /dev/null +++ b/src/static/flags/4x3/mh.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/mk.svg b/src/static/flags/4x3/mk.svg new file mode 100644 index 0000000..1bbecc7 --- /dev/null +++ b/src/static/flags/4x3/mk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/ml.svg b/src/static/flags/4x3/ml.svg new file mode 100644 index 0000000..cb24844 --- /dev/null +++ b/src/static/flags/4x3/ml.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/mm.svg b/src/static/flags/4x3/mm.svg new file mode 100644 index 0000000..ce897c9 --- /dev/null +++ b/src/static/flags/4x3/mm.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/mn.svg b/src/static/flags/4x3/mn.svg new file mode 100644 index 0000000..766d2b1 --- /dev/null +++ b/src/static/flags/4x3/mn.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/mo.svg b/src/static/flags/4x3/mo.svg new file mode 100644 index 0000000..074c2e9 --- /dev/null +++ b/src/static/flags/4x3/mo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/mp.svg b/src/static/flags/4x3/mp.svg new file mode 100644 index 0000000..0dd4c3e --- /dev/null +++ b/src/static/flags/4x3/mp.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/mq.svg b/src/static/flags/4x3/mq.svg new file mode 100644 index 0000000..bde2166 --- /dev/null +++ b/src/static/flags/4x3/mq.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/mr.svg b/src/static/flags/4x3/mr.svg new file mode 100644 index 0000000..372e864 --- /dev/null +++ b/src/static/flags/4x3/mr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ms.svg b/src/static/flags/4x3/ms.svg new file mode 100644 index 0000000..2af2479 --- /dev/null +++ b/src/static/flags/4x3/ms.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/mt.svg b/src/static/flags/4x3/mt.svg new file mode 100644 index 0000000..74554ce --- /dev/null +++ b/src/static/flags/4x3/mt.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/mu.svg b/src/static/flags/4x3/mu.svg new file mode 100644 index 0000000..8178810 --- /dev/null +++ b/src/static/flags/4x3/mu.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/4x3/mv.svg b/src/static/flags/4x3/mv.svg new file mode 100644 index 0000000..7ca4f38 --- /dev/null +++ b/src/static/flags/4x3/mv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/mw.svg b/src/static/flags/4x3/mw.svg new file mode 100644 index 0000000..f4475eb --- /dev/null +++ b/src/static/flags/4x3/mw.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/4x3/mx.svg b/src/static/flags/4x3/mx.svg new file mode 100644 index 0000000..1f17ad3 --- /dev/null +++ b/src/static/flags/4x3/mx.svg @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/my.svg b/src/static/flags/4x3/my.svg new file mode 100644 index 0000000..05800ff --- /dev/null +++ b/src/static/flags/4x3/my.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/mz.svg b/src/static/flags/4x3/mz.svg new file mode 100644 index 0000000..e5458d9 --- /dev/null +++ b/src/static/flags/4x3/mz.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/na.svg b/src/static/flags/4x3/na.svg new file mode 100644 index 0000000..215e648 --- /dev/null +++ b/src/static/flags/4x3/na.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/nc.svg b/src/static/flags/4x3/nc.svg new file mode 100644 index 0000000..c9abb97 --- /dev/null +++ b/src/static/flags/4x3/nc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/ne.svg b/src/static/flags/4x3/ne.svg new file mode 100644 index 0000000..5698fde --- /dev/null +++ b/src/static/flags/4x3/ne.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/nf.svg b/src/static/flags/4x3/nf.svg new file mode 100644 index 0000000..30fca25 --- /dev/null +++ b/src/static/flags/4x3/nf.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/ng.svg b/src/static/flags/4x3/ng.svg new file mode 100644 index 0000000..3c4fa97 --- /dev/null +++ b/src/static/flags/4x3/ng.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/ni.svg b/src/static/flags/4x3/ni.svg new file mode 100644 index 0000000..74d2be8 --- /dev/null +++ b/src/static/flags/4x3/ni.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/nl.svg b/src/static/flags/4x3/nl.svg new file mode 100644 index 0000000..c931256 --- /dev/null +++ b/src/static/flags/4x3/nl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/no.svg b/src/static/flags/4x3/no.svg new file mode 100644 index 0000000..6f710de --- /dev/null +++ b/src/static/flags/4x3/no.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/np.svg b/src/static/flags/4x3/np.svg new file mode 100644 index 0000000..c0e3de6 --- /dev/null +++ b/src/static/flags/4x3/np.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/nr.svg b/src/static/flags/4x3/nr.svg new file mode 100644 index 0000000..c473707 --- /dev/null +++ b/src/static/flags/4x3/nr.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/static/flags/4x3/nu.svg b/src/static/flags/4x3/nu.svg new file mode 100644 index 0000000..99859af --- /dev/null +++ b/src/static/flags/4x3/nu.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/nz.svg b/src/static/flags/4x3/nz.svg new file mode 100644 index 0000000..616df15 --- /dev/null +++ b/src/static/flags/4x3/nz.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/om.svg b/src/static/flags/4x3/om.svg new file mode 100644 index 0000000..707e5fc --- /dev/null +++ b/src/static/flags/4x3/om.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/pa.svg b/src/static/flags/4x3/pa.svg new file mode 100644 index 0000000..03e4605 --- /dev/null +++ b/src/static/flags/4x3/pa.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/pe.svg b/src/static/flags/4x3/pe.svg new file mode 100644 index 0000000..3cacbcc --- /dev/null +++ b/src/static/flags/4x3/pe.svg @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/pf.svg b/src/static/flags/4x3/pf.svg new file mode 100644 index 0000000..efc4cbe --- /dev/null +++ b/src/static/flags/4x3/pf.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/pg.svg b/src/static/flags/4x3/pg.svg new file mode 100644 index 0000000..f24f6bd --- /dev/null +++ b/src/static/flags/4x3/pg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/ph.svg b/src/static/flags/4x3/ph.svg new file mode 100644 index 0000000..e8858d6 --- /dev/null +++ b/src/static/flags/4x3/ph.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/pk.svg b/src/static/flags/4x3/pk.svg new file mode 100644 index 0000000..96539e8 --- /dev/null +++ b/src/static/flags/4x3/pk.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/pl.svg b/src/static/flags/4x3/pl.svg new file mode 100644 index 0000000..84a5950 --- /dev/null +++ b/src/static/flags/4x3/pl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/pm.svg b/src/static/flags/4x3/pm.svg new file mode 100644 index 0000000..c9abb97 --- /dev/null +++ b/src/static/flags/4x3/pm.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/pn.svg b/src/static/flags/4x3/pn.svg new file mode 100644 index 0000000..3b80360 --- /dev/null +++ b/src/static/flags/4x3/pn.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/pr.svg b/src/static/flags/4x3/pr.svg new file mode 100644 index 0000000..1e0205d --- /dev/null +++ b/src/static/flags/4x3/pr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ps.svg b/src/static/flags/4x3/ps.svg new file mode 100644 index 0000000..6076ef0 --- /dev/null +++ b/src/static/flags/4x3/ps.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/pt.svg b/src/static/flags/4x3/pt.svg new file mode 100644 index 0000000..3a2f131 --- /dev/null +++ b/src/static/flags/4x3/pt.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/pw.svg b/src/static/flags/4x3/pw.svg new file mode 100644 index 0000000..4385756 --- /dev/null +++ b/src/static/flags/4x3/pw.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/4x3/py.svg b/src/static/flags/4x3/py.svg new file mode 100644 index 0000000..d3ef7fa --- /dev/null +++ b/src/static/flags/4x3/py.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/qa.svg b/src/static/flags/4x3/qa.svg new file mode 100644 index 0000000..c7aab30 --- /dev/null +++ b/src/static/flags/4x3/qa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/static/flags/4x3/re.svg b/src/static/flags/4x3/re.svg new file mode 100644 index 0000000..c9abb97 --- /dev/null +++ b/src/static/flags/4x3/re.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/ro.svg b/src/static/flags/4x3/ro.svg new file mode 100644 index 0000000..c913ff3 --- /dev/null +++ b/src/static/flags/4x3/ro.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/rs.svg b/src/static/flags/4x3/rs.svg new file mode 100644 index 0000000..6a5fac1 --- /dev/null +++ b/src/static/flags/4x3/rs.svg @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ru.svg b/src/static/flags/4x3/ru.svg new file mode 100644 index 0000000..f7bb982 --- /dev/null +++ b/src/static/flags/4x3/ru.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/rw.svg b/src/static/flags/4x3/rw.svg new file mode 100644 index 0000000..872873d --- /dev/null +++ b/src/static/flags/4x3/rw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/sa.svg b/src/static/flags/4x3/sa.svg new file mode 100644 index 0000000..28518e8 --- /dev/null +++ b/src/static/flags/4x3/sa.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/sb.svg b/src/static/flags/4x3/sb.svg new file mode 100644 index 0000000..27a9ed0 --- /dev/null +++ b/src/static/flags/4x3/sb.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/sc.svg b/src/static/flags/4x3/sc.svg new file mode 100644 index 0000000..43b4cdd --- /dev/null +++ b/src/static/flags/4x3/sc.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/sd.svg b/src/static/flags/4x3/sd.svg new file mode 100644 index 0000000..bd2a4b4 --- /dev/null +++ b/src/static/flags/4x3/sd.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/se.svg b/src/static/flags/4x3/se.svg new file mode 100644 index 0000000..c8ed16e --- /dev/null +++ b/src/static/flags/4x3/se.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/sg.svg b/src/static/flags/4x3/sg.svg new file mode 100644 index 0000000..f2284a7 --- /dev/null +++ b/src/static/flags/4x3/sg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/sh.svg b/src/static/flags/4x3/sh.svg new file mode 100644 index 0000000..737a4a3 --- /dev/null +++ b/src/static/flags/4x3/sh.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/si.svg b/src/static/flags/4x3/si.svg new file mode 100644 index 0000000..9845d01 --- /dev/null +++ b/src/static/flags/4x3/si.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/sj.svg b/src/static/flags/4x3/sj.svg new file mode 100644 index 0000000..6f710de --- /dev/null +++ b/src/static/flags/4x3/sj.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/sk.svg b/src/static/flags/4x3/sk.svg new file mode 100644 index 0000000..5d291f7 --- /dev/null +++ b/src/static/flags/4x3/sk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/sl.svg b/src/static/flags/4x3/sl.svg new file mode 100644 index 0000000..4050254 --- /dev/null +++ b/src/static/flags/4x3/sl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/sm.svg b/src/static/flags/4x3/sm.svg new file mode 100644 index 0000000..6ba0116 --- /dev/null +++ b/src/static/flags/4x3/sm.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L + + + I + + + B + + + E + + + R + + + T + + + A + + + S + + + + diff --git a/src/static/flags/4x3/sn.svg b/src/static/flags/4x3/sn.svg new file mode 100644 index 0000000..52b2d36 --- /dev/null +++ b/src/static/flags/4x3/sn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/4x3/so.svg b/src/static/flags/4x3/so.svg new file mode 100644 index 0000000..89e2c08 --- /dev/null +++ b/src/static/flags/4x3/so.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/4x3/sr.svg b/src/static/flags/4x3/sr.svg new file mode 100644 index 0000000..a3ebc23 --- /dev/null +++ b/src/static/flags/4x3/sr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/ss.svg b/src/static/flags/4x3/ss.svg new file mode 100644 index 0000000..fd2875f --- /dev/null +++ b/src/static/flags/4x3/ss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/4x3/st.svg b/src/static/flags/4x3/st.svg new file mode 100644 index 0000000..8891f50 --- /dev/null +++ b/src/static/flags/4x3/st.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/sv.svg b/src/static/flags/4x3/sv.svg new file mode 100644 index 0000000..564d2e2 --- /dev/null +++ b/src/static/flags/4x3/sv.svg @@ -0,0 +1,621 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/sx.svg b/src/static/flags/4x3/sx.svg new file mode 100644 index 0000000..00736d8 --- /dev/null +++ b/src/static/flags/4x3/sx.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/sy.svg b/src/static/flags/4x3/sy.svg new file mode 100644 index 0000000..9003803 --- /dev/null +++ b/src/static/flags/4x3/sy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/sz.svg b/src/static/flags/4x3/sz.svg new file mode 100644 index 0000000..dedaaf5 --- /dev/null +++ b/src/static/flags/4x3/sz.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/tc.svg b/src/static/flags/4x3/tc.svg new file mode 100644 index 0000000..fab2d91 --- /dev/null +++ b/src/static/flags/4x3/tc.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/td.svg b/src/static/flags/4x3/td.svg new file mode 100644 index 0000000..c164532 --- /dev/null +++ b/src/static/flags/4x3/td.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/tf.svg b/src/static/flags/4x3/tf.svg new file mode 100644 index 0000000..d3253ec --- /dev/null +++ b/src/static/flags/4x3/tf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/tg.svg b/src/static/flags/4x3/tg.svg new file mode 100644 index 0000000..85dfe93 --- /dev/null +++ b/src/static/flags/4x3/tg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/th.svg b/src/static/flags/4x3/th.svg new file mode 100644 index 0000000..33d9b64 --- /dev/null +++ b/src/static/flags/4x3/th.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/tj.svg b/src/static/flags/4x3/tj.svg new file mode 100644 index 0000000..d058b89 --- /dev/null +++ b/src/static/flags/4x3/tj.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/tk.svg b/src/static/flags/4x3/tk.svg new file mode 100644 index 0000000..484d854 --- /dev/null +++ b/src/static/flags/4x3/tk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/tl.svg b/src/static/flags/4x3/tl.svg new file mode 100644 index 0000000..47b8491 --- /dev/null +++ b/src/static/flags/4x3/tl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/tm.svg b/src/static/flags/4x3/tm.svg new file mode 100644 index 0000000..e7b858c --- /dev/null +++ b/src/static/flags/4x3/tm.svg @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/tn.svg b/src/static/flags/4x3/tn.svg new file mode 100644 index 0000000..55e4d5b --- /dev/null +++ b/src/static/flags/4x3/tn.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/to.svg b/src/static/flags/4x3/to.svg new file mode 100644 index 0000000..50a6fb9 --- /dev/null +++ b/src/static/flags/4x3/to.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/static/flags/4x3/tr.svg b/src/static/flags/4x3/tr.svg new file mode 100644 index 0000000..5300199 --- /dev/null +++ b/src/static/flags/4x3/tr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/4x3/tt.svg b/src/static/flags/4x3/tt.svg new file mode 100644 index 0000000..4aac679 --- /dev/null +++ b/src/static/flags/4x3/tt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/flags/4x3/tv.svg b/src/static/flags/4x3/tv.svg new file mode 100644 index 0000000..93ae8e5 --- /dev/null +++ b/src/static/flags/4x3/tv.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/tw.svg b/src/static/flags/4x3/tw.svg new file mode 100644 index 0000000..6b7bd11 --- /dev/null +++ b/src/static/flags/4x3/tw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/tz.svg b/src/static/flags/4x3/tz.svg new file mode 100644 index 0000000..1a811af --- /dev/null +++ b/src/static/flags/4x3/tz.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/ua.svg b/src/static/flags/4x3/ua.svg new file mode 100644 index 0000000..2f68876 --- /dev/null +++ b/src/static/flags/4x3/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/static/flags/4x3/ug.svg b/src/static/flags/4x3/ug.svg new file mode 100644 index 0000000..b44b45b --- /dev/null +++ b/src/static/flags/4x3/ug.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/um.svg b/src/static/flags/4x3/um.svg new file mode 100644 index 0000000..7aab3fd --- /dev/null +++ b/src/static/flags/4x3/um.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/un.svg b/src/static/flags/4x3/un.svg new file mode 100644 index 0000000..bc55502 --- /dev/null +++ b/src/static/flags/4x3/un.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/us.svg b/src/static/flags/4x3/us.svg new file mode 100644 index 0000000..95e707b --- /dev/null +++ b/src/static/flags/4x3/us.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/uy.svg b/src/static/flags/4x3/uy.svg new file mode 100644 index 0000000..9fc3e5e --- /dev/null +++ b/src/static/flags/4x3/uy.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/uz.svg b/src/static/flags/4x3/uz.svg new file mode 100644 index 0000000..6e0472b --- /dev/null +++ b/src/static/flags/4x3/uz.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/va.svg b/src/static/flags/4x3/va.svg new file mode 100644 index 0000000..b90ddf1 --- /dev/null +++ b/src/static/flags/4x3/va.svg @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/vc.svg b/src/static/flags/4x3/vc.svg new file mode 100644 index 0000000..ed4c1e4 --- /dev/null +++ b/src/static/flags/4x3/vc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/static/flags/4x3/ve.svg b/src/static/flags/4x3/ve.svg new file mode 100644 index 0000000..b71c77f --- /dev/null +++ b/src/static/flags/4x3/ve.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/vg.svg b/src/static/flags/4x3/vg.svg new file mode 100644 index 0000000..4f103ae --- /dev/null +++ b/src/static/flags/4x3/vg.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/vi.svg b/src/static/flags/4x3/vi.svg new file mode 100644 index 0000000..0c91a25 --- /dev/null +++ b/src/static/flags/4x3/vi.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/vn.svg b/src/static/flags/4x3/vn.svg new file mode 100644 index 0000000..fcfd7d1 --- /dev/null +++ b/src/static/flags/4x3/vn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/flags/4x3/vu.svg b/src/static/flags/4x3/vu.svg new file mode 100644 index 0000000..18dc459 --- /dev/null +++ b/src/static/flags/4x3/vu.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/wf.svg b/src/static/flags/4x3/wf.svg new file mode 100644 index 0000000..1b1e81c --- /dev/null +++ b/src/static/flags/4x3/wf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/ws.svg b/src/static/flags/4x3/ws.svg new file mode 100644 index 0000000..6e5963d --- /dev/null +++ b/src/static/flags/4x3/ws.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/static/flags/4x3/ye.svg b/src/static/flags/4x3/ye.svg new file mode 100644 index 0000000..4a115e5 --- /dev/null +++ b/src/static/flags/4x3/ye.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/yt.svg b/src/static/flags/4x3/yt.svg new file mode 100644 index 0000000..c9abb97 --- /dev/null +++ b/src/static/flags/4x3/yt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/static/flags/4x3/za.svg b/src/static/flags/4x3/za.svg new file mode 100644 index 0000000..e585fc2 --- /dev/null +++ b/src/static/flags/4x3/za.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/zm.svg b/src/static/flags/4x3/zm.svg new file mode 100644 index 0000000..2d4e3e7 --- /dev/null +++ b/src/static/flags/4x3/zm.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/flags/4x3/zw.svg b/src/static/flags/4x3/zw.svg new file mode 100644 index 0000000..903afd3 --- /dev/null +++ b/src/static/flags/4x3/zw.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/templates/bot.html b/src/templates/bot.html new file mode 100644 index 0000000..acdc497 --- /dev/null +++ b/src/templates/bot.html @@ -0,0 +1,49 @@ +{% extends 'layout.html' %} + +{% from "macros/tasks.html" import tasks_table %} +{% from "macros/utils.html" import showtime %} +{% from "macros/status.html" import showstatus %} + +{% block content %} +

Bot {{entity.family}}_{{entity.bot_id}}

+ +
+
+ + + + +
+
+ +
+
tracker
+
{{entity.tracker_id}}
+ +
family
+
{{entity.family}}
+ +
status
+
{{showstatus(entity.status, "/bots")}}
+ +
failing spree
+
{{entity.failing_spree}}
+ +
country
+
{{entity.country}}
+ +
next execution
+
{{showtime(entity.next_execution)}}
+ +
last error
+
{{entity.last_error}}
+
+ +

Tasks

+{{tasks_table(tasks)}} + +{% if last_task_log %} +

Last task log

+
{{last_task_log}}
+{% endif %} +{% endblock %} diff --git a/src/templates/bots.html b/src/templates/bots.html new file mode 100644 index 0000000..c54a795 --- /dev/null +++ b/src/templates/bots.html @@ -0,0 +1,12 @@ +{% extends 'layout.html' %} +{% from "macros/bots.html" import bots_table %} +{% from "macros/pagination.html" import paginate %} +{% from "macros/status.html" import statusfilter, familyfilter %} + +{% block content %} +

Bots

+{{statusfilter()}} +{{familyfilter()}} +{{bots_table(rows)}} +{{paginate("/bots", page, pages)}} +{% endblock %} diff --git a/src/templates/index.html b/src/templates/index.html new file mode 100644 index 0000000..42af6f7 --- /dev/null +++ b/src/templates/index.html @@ -0,0 +1,11 @@ +{% extends 'layout.html' %} +{% from "macros/dashboard_chart.html" import dashboard_chart %} +{% from "macros/tasks.html" import tasks_table %} + +{% block content %} +

Dashboard

+{{dashboard_chart(counters.alive, counters.progress, counters.failing, counters.crashed, counters.archived)}} + +

Recent tasks

+{{tasks_table(tasks)}} +{% endblock %} diff --git a/src/templates/layout.html b/src/templates/layout.html new file mode 100644 index 0000000..948f478 --- /dev/null +++ b/src/templates/layout.html @@ -0,0 +1,33 @@ + + + + mtracker + + + + + + + +
+
+ +
+ {% block content %} + {% endblock %} +
+
+
+ + diff --git a/src/templates/macros/bots.html b/src/templates/macros/bots.html new file mode 100644 index 0000000..83a380c --- /dev/null +++ b/src/templates/macros/bots.html @@ -0,0 +1,43 @@ +{% from "macros/utils.html" import showtime, cap_length, mtracker_url %} +{% from "macros/status.html" import showstatus %} + +{% macro bots_table(rows) %} + + + + + + + + + + {% for entity in rows %} + + + + + + + + + {% endfor %} +
botfamilylast errorstatusnext executionactions
{{entity.family}}_{{entity.bot_id}}{{entity.family}}{{cap_length(entity.last_error, 60)}} + {{showstatus(entity.status)}} + {% if entity.status == 'failing' %}({{entity.failing_spree}}){% endif %} + + {% if entity.status != 'crashed' and entity.status != 'archived' %} + {{showtime(entity.next_execution)}} + {% endif %} + +
+ + {% if entity.status != 'archived' %} + + {% endif %} + {% if entity.status != 'inprogress' %} + + {% endif %} + +
+
+{% endmacro %} diff --git a/src/templates/macros/dashboard_chart.html b/src/templates/macros/dashboard_chart.html new file mode 100644 index 0000000..bea20ba --- /dev/null +++ b/src/templates/macros/dashboard_chart.html @@ -0,0 +1,34 @@ +{% macro dashboard_chart(alive, inprogress, failing, crashed, archived) %} +{% set total = alive + inprogress + failing + crashed %} +{% set width_px = 860 %} +
+ + + {% set left = 0 %} + + {% set left = left + (alive / total * width_px) %} + + {% set left = left + (inprogress / total * width_px) %} + + {% set left = left + (failing / total * width_px) %} + + +
+
+ {{alive}} alive +
+
+ {{inprogress}} inprogress +
+
+ {{failing}} failing +
+
+ {{crashed}} crashed +
+
+ {{archived}} archived +
+
+
+{% endmacro %} diff --git a/src/templates/macros/pagination.html b/src/templates/macros/pagination.html new file mode 100644 index 0000000..09d46bd --- /dev/null +++ b/src/templates/macros/pagination.html @@ -0,0 +1,37 @@ +{# +Some jinja2 programming, sorry. This is not as complicated as it may look like. +The idea is to generate paging that looks like this: + +[<<] [<] [1] ... [1001] [1002] [1003 (active)] [1004] [1005] ... [2000] [>] [>>] + +So two pages before the current page, two pages after, next/pref/first/last buttons. +All the complications here are due to special case handling (the first and last few pages). +#} + +{% macro paginate(baseurl, page, pages) %} +{% set url = baseurl + "?" %} +{% if request.args.get('status') %} +{% set url = url + "status=" + request.args.get('status') + "&" %} +{% endif %} +
+
    +
  • «
  • +
  • +
  • 1
  • + {% if page > 4 %} +
  • + {% endif %} + {% for p in range([2, page - 2]|max, [page + 3, pages]|min) %} +
  • {{p}}
  • + {% endfor %} + {% if page < pages-3 %} +
  • + {% endif %} + {% if pages != 1 %} +
  • {{pages}}
  • + {% endif %} +
  • +
  • »
  • +
+
+{% endmacro %} diff --git a/src/templates/macros/results.html b/src/templates/macros/results.html new file mode 100644 index 0000000..ecf3a73 --- /dev/null +++ b/src/templates/macros/results.html @@ -0,0 +1,22 @@ +{% from "macros/utils.html" import showtime %} + +{% macro results_table(rows) %} + + + + + + + + + {% for entity in rows %} + + + + + + + + {% endfor %} +
tasktyperesultsha256upload time
{{entity.task_id}}{{entity.result_type}}{{entity.name}}{{entity.sha256[:16]}}{{showtime(entity.upload_time)}}
+{% endmacro %} diff --git a/src/templates/macros/status.html b/src/templates/macros/status.html new file mode 100644 index 0000000..e1bf05a --- /dev/null +++ b/src/templates/macros/status.html @@ -0,0 +1,53 @@ +{% set classnames = { + "alive": "text-success", + "new": "text-success", + "working": "text-success", + "inprogress": "text-info", + "failing": "text-warning", + "crashed": "text-danger", + "archived": "text-muted", +} %} + +{% macro statuscolor(statusname, text) %} +{{text}} +{% endmacro %} + +{% macro showstatus(statusname, base='') %} +{{statusname}} +{% endmacro %} + +{% macro showstatusbtn(statusname) %} +{% set active = request.args.get('status') == statusname %} +{% set activeclass = "active nomouse" if active else "" %} +{{statusname}} +{% endmacro %} + +{% macro clearstatusbtn(statusname) %} +{% set active = request.args.get('status') == None %} +{% set activeclass = "active nomouse" if active else "" %} +✖️ +{% endmacro %} + +{% macro statusfilter() %} +
+
+ {{showstatusbtn("working")}} + {{showstatusbtn("inprogress")}} + {{showstatusbtn("failing")}} + {{showstatusbtn("crashed")}} + {{showstatusbtn("archived")}} + {{clearstatusbtn()}} +
+
+{% endmacro %} + +{% macro familyfilter() %} +{% if request.args.get('family') %} + +{% endif %} +{% endmacro %} diff --git a/src/templates/macros/tasks.html b/src/templates/macros/tasks.html new file mode 100644 index 0000000..db596c0 --- /dev/null +++ b/src/templates/macros/tasks.html @@ -0,0 +1,29 @@ +{% from "macros/utils.html" import showtime, cap_length %} +{% from "macros/status.html" import showstatus %} + +{% macro tasks_table(rows) %} + + + + + + + + + {% for entity in rows %} + + + + + + + + {% endfor %} +
task idbotresultreport timestatus
{{entity.task_id}}{{entity.family}}_{{entity.bot_id}} + {% if entity.fail_reason %} + {{cap_length(entity.fail_reason, 60)}} + {% else %} + Fetched {{entity.results_no}} items + {% endif %} + {{showtime(entity.report_time)}}{{showstatus(entity.status, "/tasks")}}
+{% endmacro %} diff --git a/src/templates/macros/trackers.html b/src/templates/macros/trackers.html new file mode 100644 index 0000000..1cafcac --- /dev/null +++ b/src/templates/macros/trackers.html @@ -0,0 +1,26 @@ +{% from "macros/status.html" import showstatus, statuscolor %} + +{% macro trackers_table(rows) %} + + + + + + + + + {% for entity in rows %} + + + + + + + + {% endfor %} +
trackerfamilystatic configbotsstatus
{{entity.tracker_id}}{{entity.family}}{{entity.config_hash[:16]}}... + {% for bot in entity.bots %} + {{statuscolor(bot.status, bot.bot_id)}} + {% endfor %} + {{showstatus(entity.status)}}
+{% endmacro %} diff --git a/src/templates/macros/utils.html b/src/templates/macros/utils.html new file mode 100644 index 0000000..051f1f7 --- /dev/null +++ b/src/templates/macros/utils.html @@ -0,0 +1,13 @@ +{% macro showtime(time) %} +{{time.strftime("%Y-%m-%d %H:%M:%S")}} +{% endmacro %} + +{% macro cap_length(text, maxlen)%} + + {% if text and text|length > maxlen %} + {{text[:maxlen]}}... + {%else%} + {{text}} + {%endif%} + +{% endmacro %} diff --git a/src/templates/proxies.html b/src/templates/proxies.html new file mode 100644 index 0000000..b54c7ad --- /dev/null +++ b/src/templates/proxies.html @@ -0,0 +1,20 @@ +{% extends 'layout.html' %} + +{% block content %} +

Proxies

+ +Update + + + + + + + {% for entity in rows %} + + + + + {% endfor %} +
countryhost
{{entity.country}}{{entity.host}}:{{entity.port}}
+{% endblock %} diff --git a/src/templates/results.html b/src/templates/results.html new file mode 100644 index 0000000..f3c219a --- /dev/null +++ b/src/templates/results.html @@ -0,0 +1,9 @@ +{% extends 'layout.html' %} +{% from "macros/results.html" import results_table %} +{% from "macros/pagination.html" import paginate %} + +{% block content %} +

Results

+{{results_table(rows)}} +{{paginate("/results", page, pages)}} +{% endblock %} diff --git a/src/templates/task.html b/src/templates/task.html new file mode 100644 index 0000000..e9b5068 --- /dev/null +++ b/src/templates/task.html @@ -0,0 +1,25 @@ +{% extends 'layout.html' %} +{% from "macros/results.html" import results_table %} +{% from "macros/utils.html" import showtime %} +{% from "macros/status.html" import showstatus %} + +{% block content %} +

Task {{entity.task_id}}

+ +
+
bot
+
{{entity.bot_id}}
+ +
report time
+
{{showtime(entity.report_time)}}
+ +
status
+
{{showstatus(entity.status, "/tasks")}}
+
+ +

Results

+{{results_table(results)}} + +

Execution log

+
{{log}}
+{% endblock %} diff --git a/src/templates/tasks.html b/src/templates/tasks.html new file mode 100644 index 0000000..101f437 --- /dev/null +++ b/src/templates/tasks.html @@ -0,0 +1,11 @@ +{% extends "layout.html" %} +{% from "macros/tasks.html" import tasks_table %} +{% from "macros/pagination.html" import paginate %} +{% from "macros/status.html" import statusfilter %} + +{% block content %} +

Tasks

+{{statusfilter()}} +{{tasks_table(rows)}} +{{paginate("/tasks", page, pages)}} +{% endblock %} diff --git a/src/templates/tracker.html b/src/templates/tracker.html new file mode 100644 index 0000000..afbca8e --- /dev/null +++ b/src/templates/tracker.html @@ -0,0 +1,30 @@ +{% extends 'layout.html' %} +{% from "macros/bots.html" import bots_table %} +{% from "macros/status.html" import showstatus %} + +{% block content %} +

Tracker {{entity.tracker_id}}

+ +
+
+ + + + +
+
+ +
+
static config
+
{{entity.config_hash}}
+ +
family
+
{{entity.family}}
+ +
status
+
{{showstatus(entity.status, "/trackers")}}
+
+ +

Bots

+{{ bots_table(bots)}} +{% endblock %} diff --git a/src/templates/trackers.html b/src/templates/trackers.html new file mode 100644 index 0000000..be99471 --- /dev/null +++ b/src/templates/trackers.html @@ -0,0 +1,12 @@ +{% extends 'layout.html' %} +{% from "macros/pagination.html" import paginate %} +{% from "macros/trackers.html" import trackers_table %} +{% from "macros/status.html" import statusfilter, familyfilter %} + +{% block content %} +

Trackers

+{{statusfilter()}} +{{familyfilter()}} +{{trackers_table(rows)}} +{{paginate("/trackers", page, pages)}} +{% endblock %} diff --git a/src/track.py b/src/track.py new file mode 100644 index 0000000..228f4ff --- /dev/null +++ b/src/track.py @@ -0,0 +1,73 @@ +import logging +from typing import Any, Dict, Tuple, cast, List + +from .bot import ModuleBase +from .model import Status, Task, TrackerModule +from .loader import ModuleManager + +log = logging.getLogger("rq.worker") +log.setLevel(logging.DEBUG) + + +trackers = ModuleManager.get() + + +def get_available_trackers() -> List[TrackerModule]: + output = [] + for family, tracker in trackers.items(): + output.append(TrackerModule( + family=family, + critical_params=tracker.CRITICAL_PARAMS, + proxy_whitelist=tracker.PROXY_WHITELIST + )) + return output + + +def execute( + static_config: Dict[str, Any], + saved_state: Dict[str, Any], + proxy: str, + task_id: int, + bot_id: int, +) -> Tuple[int, Dict[str, Any], Dict[str, Any]]: + """execute task for a given config and a proxy + + :param static_config: static config + :param saved_state: state from previous executions for this bot + :param proxy: socks proxy to be used for communication + :return: return a tuple of status, fetched results, updated saved_state + """ + family = static_config["type"] + + log_path = Task.get_log_path(task_id) + fh = logging.FileHandler(log_path.as_posix()) + log.addHandler(fh) + log.propagate = False + log.setLevel(logging.DEBUG) + + if family not in trackers: + logging.error("No module for %s family", family) + log.removeHandler(fh) + return Status.CRASHED, {}, saved_state + + cls = trackers[family] + + if cls.CRITICAL_PARAMS: + if any(x not in static_config for x in cls.CRITICAL_PARAMS): + logging.error( + "Insufficient config parameters for %s, archiving bot", family + ) + return Status.ARCHIVED, {}, saved_state + + mod = cls( # type:ignore + config=static_config, used_proxy=proxy, state=saved_state + ) + + if isinstance(mod, ModuleBase): + bot_module = cast(ModuleBase, mod) + ret_val = bot_module.execute_task() + else: + raise Exception("Unknown module base type") + + log.removeHandler(fh) + return ret_val.status, ret_val.results.to_dict_recursive(), ret_val.state diff --git a/src/utils.py b/src/utils.py new file mode 100644 index 0000000..7ba43c1 --- /dev/null +++ b/src/utils.py @@ -0,0 +1,122 @@ +import hashlib +import json + +from base64 import b64decode +from typing import Any, Dict, List, Optional + +from mwdblib import MWDB, MWDBObject + +from requests import get + +from .config import app_config + + +def get_proxies() -> List[Dict[str, Any]]: + if ProxyConfig.METHOD == "url": + # Get a list of proxies from defined URL + return get(ProxyConfig.URL).json() + elif ProxyConfig.METHOD == "file": + # Read a list of proxies from defined file path + with open(ProxyConfig.PATH) as f: + return json.load(f) + raise RuntimeError("Invalid proxy configuration: unknown method") + + +def config_dhash(obj: Any) -> str: + if isinstance(obj, list): + return config_dhash(str(sorted([config_dhash(o) for o in obj]))) + elif isinstance(obj, dict): + return config_dhash([[o, config_dhash(obj[o])] for o in sorted(obj.keys())]) + else: + return hashlib.sha256(bytes(str(obj), "utf-8")).hexdigest() + + +def get_mwdb() -> MWDB: + return MWDB(api_url=app_config.mwdb.api_url, api_key=app_config.mwdb.token) + + +def report_mwdb_tree( + mwdb: MWDB, node: Dict[str, Any], parent: Optional[str], depth: int = 0 +) -> List[Dict[str, Any]]: + """Uploaded the result tree to mwdb + :param mwdb: MWDB object + :param node: tree containing the results to report + :param parent: current parent + :param depth: current reporting depth, defaults to 0 + :return: List of reported hashes grouped by their object types + """ + if depth > 10: + raise Exception( + "Maximum reporting depth reached, are there cycles in the result object?" + ) + results: List[Dict[str, Any]] = [] + + this_obj: Optional[MWDBObject] = None + this_hash = None + if node["object"] == "object": + this_hash = parent + elif node["object"] == "config": + this_obj = mwdb.upload_config( + family=node["config"]["type"], + cfg=node["config"], + config_type=node["config_type"], + attributes=node["attributes"], + parent=parent, + ) + this_hash = this_obj.sha256 + results.append( + { + "type": "config", + "name": node["config_type"], + "tags": node["tags"], + "sha256": this_obj.sha256, + } + ) + elif node["object"] == "binary": + this_obj = mwdb.upload_file( + name=node["name"], + content=b64decode(node["data"]), + attributes=node["attributes"], + parent=parent, + ) + this_hash = this_obj.sha256 + results.append( + { + "type": "binary", + "name": node["name"], + "tags": node["tags"], + "sha256": this_obj.sha256, + } + ) + elif node["object"] == "blob": + this_obj = mwdb.upload_blob( + name=node["name"], + type=node["blob_type"], + content=node["content"], + attributes=node["attributes"], + parent=parent, + ) + results.append( + { + "type": "blob", + "name": node["name"] + "_" + node["blob_type"], + "tags": node["tags"], + "sha256": this_obj.sha256, + } + ) + this_hash = this_obj.sha256 + + if this_hash is None: + raise Exception( + "Something has gone wrong while reporting results, got unknown object in the result object" + ) + if this_obj: + for tag in node["tags"]: + this_obj.add_tag(tag) + for comment in node["comments"]: + this_obj.add_comment(comment) + + for child in node["children"]: + result = report_mwdb_tree(mwdb, child, this_hash, depth + 1) + results += result + return results diff --git a/src/worker.py b/src/worker.py new file mode 100644 index 0000000..fcb6eae --- /dev/null +++ b/src/worker.py @@ -0,0 +1,30 @@ +import sys + +from redis import Redis # type: ignore +from rq import Connection, Worker # type: ignore + +from . import error_handler +from .config import app_config +from .loader import ModuleManager + + +def main(): + if len(sys.argv) != 2: + print("Usage: worker [modules_path]") + exit(1) + + ModuleManager.load(sys.argv[1]) + redis = Redis(host=app_config.redis.host, port=app_config.redis.port) + + with Connection(connection=redis): + queues = ["report", "track"] + w = Worker( + queues, + exception_handlers=[error_handler.report_crashed], + log_job_description=False, + ) + w.work() + + +if __name__ == "__main__": + main()