diff --git a/.github/workflows/distro_test.yml b/.github/workflows/distro_test.yml index b7df76d99..ff5428d91 100644 --- a/.github/workflows/distro_test.yml +++ b/.github/workflows/distro_test.yml @@ -68,7 +68,7 @@ jobs: -v \ --user root \ -e hypervisor_hosts_spec="[{'host':'hypervisor-01','ansible_host':'nyctea','ssh_hostname':$(hostname)}]" \ - -e kubeinit_spec=cdk-libvirt-1-0-1-c \ + -e kubeinit_spec=k8s-libvirt-1-0-1-c \ -e kubeinit_stop_after_task='task-create-network' \ -e kubeinit_libvirt_create_cloud_user=true \ -e kubeinit_hosted_deployment=true \ diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml index 51c9ee46f..e1e81344b 100644 --- a/.github/workflows/docs_build.yml +++ b/.github/workflows/docs_build.yml @@ -153,7 +153,7 @@ jobs: tasktag=task_prepare_cluster taskname=$(echo ${tasktag} | tr '_' '-') - for distro in cdk eks k8s kid rke; do + for distro in k8s kid; do ansible-playbook-grapher -t ${tasktag} --skip-tags omit_from_grapher -e kubeinit_cluster_distro=${distro} -e kubeinit_cluster_distro_role=kubeinit_${distro} kubeinit/playbook.yml --include-role-tasks -o docs/src/static/playbook_${distro}_${tasktag} --save-dot-file sed -e ':again;$!N;$!b again; s/subgraph "Play #[12]:[^"]*"{[^}]*}//g' -e 's/"Play #3: [^"]*"/"'${taskname}'"/g' -e 's/shape=box/shape=octagon/g' -e 's/#[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]/#000000/g' -e 's/ style=filled / /' docs/src/static/playbook_${distro}_${tasktag}.dot | dot -Tsvg > docs/src/static/playbook_${distro}_${tasktag}.svg cat << EOF >> docs/src/playbook_diagrams.rst @@ -198,7 +198,7 @@ jobs: tasktag=task_deploy_cluster taskname=$(echo ${tasktag} | tr '_' '-') - for distro in cdk eks k8s kid rke; do + for distro in k8s kid; do ansible-playbook-grapher -t ${tasktag} --skip-tags omit_from_grapher -e kubeinit_cluster_distro=${distro} -e kubeinit_cluster_distro_role=kubeinit_${distro} kubeinit/playbook.yml --include-role-tasks -o docs/src/static/playbook_${distro}_${tasktag} --save-dot-file sed -e ':again;$!N;$!b again; s/subgraph "Play #[12]:[^"]*"{[^}]*}//g' -e 's/"Play #3: [^"]*"/"'${taskname}'"/g' -e 's/shape=box/shape=octagon/g' -e 's/#[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]/#000000/g' -e 's/ style=filled / /' docs/src/static/playbook_${distro}_${tasktag}.dot | dot -Tsvg > docs/src/static/playbook_${distro}_${tasktag}.svg cat << EOF >> docs/src/playbook_diagrams.rst diff --git a/agent/MANIFEST.in b/agent/MANIFEST.in deleted file mode 100644 index 75e3c6018..000000000 --- a/agent/MANIFEST.in +++ /dev/null @@ -1,7 +0,0 @@ -include *.py -include *.yaml -include requirements.txt -recursive-include kubeinit * -global-exclude *pyc -global-exclude .project -global-exclude .pydevproject diff --git a/agent/kubeinit/__init__.py b/agent/kubeinit/__init__.py deleted file mode 100644 index 2045cccb7..000000000 --- a/agent/kubeinit/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -from pkg_resources import get_distribution - -__version__ = get_distribution('kubeinit').version diff --git a/agent/kubeinit/cli.py b/agent/kubeinit/cli.py deleted file mode 100644 index 4bb23125b..000000000 --- a/agent/kubeinit/cli.py +++ /dev/null @@ -1,147 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.com/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -import logging -import logging.handlers -import os -import threading -from argparse import ArgumentParser - -from kubeinit import __version__ -from kubeinit.const import KUBEINIT_LOG_FILE -from kubeinit.get_banner import get_banner -from kubeinit.lib import connect_to_aas, connect_to_aas2 - - -kubeinit_version = __version__ - -t1_stop = threading.Event() -t2_stop = threading.Event() - -handler = logging.handlers.WatchedFileHandler( - KUBEINIT_LOG_FILE) -formatter = logging.Formatter(logging.BASIC_FORMAT) -handler.setFormatter(formatter) -root = logging.getLogger() -root.setLevel(os.environ.get("LOGLEVEL", "INFO")) -root.addHandler(handler) - - -def main(): - """ - Application's entry point. - - Here, application's settings are read from the command line, - environment variables and CRD. Then, retrieving and processing - of Kubernetes events are initiated. - """ - parser = ArgumentParser( - description='Kubeinit - CLI', - prog='kubeinit' - ) - - parser.add_argument( - '-v', - '--version', - action='version', - version='%(prog)s ' + kubeinit_version - ) - - parser.add_argument( - '-b', - '--banner', - action='store_true', - help='Print Kubeinit.com banner' - ) - - subparsers = parser.add_subparsers(title="Kubeinit subcommands", - dest="command", - help=("These are the options " - "supported: \n" - "The listen option will " - "watch for CRD events. " - "The run option will " - "execute the Kubeinit " - "actions against the cluster.")) - - parser_connect = subparsers.add_parser('connect', help=("CLI options to run the " - "Kubeinit actions.")) - - parser_connect.add_argument( - '-k', - '--key', - default="", - type=str, - help=("The connection key:" - "--extra-vars thisisakey" - "Defaults to: empty")) - - subparsers.add_parser('status', help=("Show the connections status.")) - - parser_show = subparsers.add_parser('show', - help=("Get info from a connection.")) - - parser_show.add_argument( - "connection", - nargs='?', - default='', - type=str, - help=("Specify the connection to fetch details")) - - args = parser.parse_args() - - # print("Kubeinit called with the folowing parameters") - # print(parser.parse_args()) - - if args.banner: - print(get_banner()) - exit() - - try: - if (args.command == 'connect'): - print("We will watch for objects to process") - try: - print(args.key) - t1 = threading.Thread(target=connect_to_aas, - args=(t1_stop,)) - t1.start() - t2 = threading.Thread(target=connect_to_aas2, - args=(t2_stop,)) - t2.start() - except Exception as err: - print("Error: unable to start thread: " + err) - elif (args.command == 'status'): - print(u"\U0001F4DA" + " Listing the deployed actions" - " from the cluster.") - print(u"\U0001F4A1" + " For further information use:" - " kubeinit get [--debug]") - exit() - elif (args.command == 'show'): - print(u"\U0001F4E4" + " Getting the details from" - " an specific action.") - print(args.connection) - exit() - - except KeyboardInterrupt: - pass - except Exception as err: - raise RuntimeError('There is something wrong...' + err) - - while not t2_stop.is_set() or not t1_stop.is_set(): - pass diff --git a/agent/kubeinit/const.py b/agent/kubeinit/const.py deleted file mode 100644 index 2584a9e94..000000000 --- a/agent/kubeinit/const.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -import os -import tempfile - -# Main logging file -KUBEINIT_LOG_FOLDER = tempfile.gettempdir() -KUBEINIT_LOG_FILE = os.path.join(KUBEINIT_LOG_FOLDER, '/tmp/kubeinit.log') - -# Current branch -KUBEINIT_BRANCH = 'master' diff --git a/agent/kubeinit/get_banner.py b/agent/kubeinit/get_banner.py deleted file mode 100644 index c039c6685..000000000 --- a/agent/kubeinit/get_banner.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -from kubeinit import __version__ - -kubeinit_version = __version__ - - -def get_banner(): - """ - Get banner method. - - This method prints - the kubeinit.org banner. - """ - banner = """ -888 d8P 888 8888888 d8b 888 -888 d8P 888 888 Y8P 888 -888 d8P 888 888 888 -888d88K 888 888 88888b. .d88b. 888 88888b. 888 888888 -8888888b 888 888 888 "88b d8P Y8b 888 888 "88b 888 888 -888 Y88b 888 888 888 888 88888888 888 888 888 888 888 -888 Y88b Y88b 888 888 d88P Y8b. 888 888 888 888 Y88b. -888 Y88b "Y88888 88888P" "Y8888 8888888 888 888 888 "Y888 - (kubeinit.org) agent version {} -""".format(kubeinit_version) - return banner diff --git a/agent/kubeinit/lib.py b/agent/kubeinit/lib.py deleted file mode 100644 index 56781a752..000000000 --- a/agent/kubeinit/lib.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -def connect_to_aas(stop, - api_client=None): - """ - Watch for action with timeouts. - - This method will listen for custom objects - that times out. - """ - while True: - return True - - -def connect_to_aas2(stop, - api_client=None): - """ - Watch for action with timeouts. - - This method will listen for custom objects - that times out. - """ - while True: - return True diff --git a/agent/kubeinit/logger.py b/agent/kubeinit/logger.py deleted file mode 100644 index 9bb4e811f..000000000 --- a/agent/kubeinit/logger.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -import logging -import sys -from logging.handlers import TimedRotatingFileHandler - -from kubeinit.const import KUBEINIT_LOG_FILE - -FORMATTER = logging.Formatter("%(asctime)s - %(name)s - " - "%(levelname)s - %(message)s") - - -def get_console_handler(): - """ - Get logger console handler. - - This is a main component of the input for the controller - """ - console_handler = logging.StreamHandler(sys.stdout) - console_handler.setFormatter(FORMATTER) - return console_handler - - -def get_file_handler(): - """ - Get logger file handler. - - This is a main component of the input for the controller - """ - file_handler = TimedRotatingFileHandler( - KUBEINIT_LOG_FILE, when='midnight') - file_handler.setFormatter(FORMATTER) - return file_handler - - -def get_logger(logger_name): - """ - Get logger. - - This is a main component of the input for the controller - """ - logger = logging.getLogger(logger_name) - logger.setLevel(logging.DEBUG) - # We do not want to print in the console - # logger.addHandler(get_console_handler()) - logger.addHandler(get_file_handler()) - logger.propagate = False - return logger diff --git a/agent/requirements.txt b/agent/requirements.txt deleted file mode 100644 index 3f7dfd59a..000000000 --- a/agent/requirements.txt +++ /dev/null @@ -1,14 +0,0 @@ -pyyaml -requests -ansible -j2cli -jinja2 -kubernetes -setuptools -PTable -rich -b2sdk -google-cloud -google-cloud-storage -google-cloud-firestore -yq diff --git a/agent/setup.py b/agent/setup.py deleted file mode 100644 index 5f1fb5aa1..000000000 --- a/agent/setup.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -import os -from sys import version_info - -from setuptools import find_packages, setup - -if version_info < (3, 5): - raise RuntimeError( - 'Python 3.5 or greater is required' - ) - -_NAME = 'kubeinit' -_DESCRIPTION = 'The Kubeinit CLI' -_REVISION = '2.2.2' - -kubeinit_revision = os.environ.get('KUBEINIT_REVISION', "") -if (kubeinit_revision != ""): - _REVISION = _REVISION + "." + kubeinit_revision - -if os.path.isfile('../README.md'): - with open('../README.md') as f: - long_description = f.read() -else: - long_description = _DESCRIPTION - -with open('requirements.txt') as f: - requirements = f.read().splitlines() - -setup( - name=_NAME, - version=_REVISION, - description=_DESCRIPTION, - long_description_content_type='text/markdown', - long_description=long_description, - url='https://www.kubeinit.org', - packages=find_packages(), - classifiers=[ - 'Development Status :: 3 - Alpha', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'License :: OSI Approved :: Apache Software License', - 'Natural Language :: English', - 'Environment :: Console', - 'Environment :: Web Environment', - 'Intended Audience :: Developers', - 'Intended Audience :: System Administrators', - 'Topic :: Scientific/Engineering', - 'Topic :: Software Development :: Testing', - ], - author='Carlos Camacho', - author_email='carloscamachoucv@gmail.com', - include_package_data=True, - install_requires=requirements, - entry_points={ - 'console_scripts': [ - '{0} = {0}.cli:main'.format(_NAME), - ] - } -) diff --git a/agent/tests/test_sample.py b/agent/tests/test_sample.py deleted file mode 100644 index bb6a883ca..000000000 --- a/agent/tests/test_sample.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -def test_file1_method1(): - """Test file 1 method 1.""" - x = 5 - y = 6 - assert x + 1 == y, "test failed" - - -def test_file1_method2(): - """Test file 1 method 2.""" - x = 5 - y = 6 - assert x + 1 == y, "test failed" diff --git a/ci/kubeinit_ci_utils.py b/ci/kubeinit_ci_utils.py index abd1fd255..13da33b27 100755 --- a/ci/kubeinit_ci_utils.py +++ b/ci/kubeinit_ci_utils.py @@ -328,32 +328,17 @@ def get_periodic_jobs_labels(cluster_type='all', distro='all'): cluster_pattern = re.compile(cluster_type_regex) - cdk_configs = ["cdk-libvirt-3-1-2-h", - "cdk-libvirt-3-1-1-h", - "cdk-libvirt-1-1-1-h", - "cdk-libvirt-1-2-1-h"] - okd_configs = ["okd-libvirt-3-1-1-h", "okd-libvirt-3-0-2-h", "okd-libvirt-1-1-1-h", "okd-openstack-1-1-0-h", "okd-libvirt-1-0-1-h"] - rke_configs = ["rke-libvirt-3-1-2-h", - "rke-libvirt-3-0-1-h", - "rke-libvirt-1-1-1-h", - "rke-libvirt-1-0-1-h"] - k8s_configs = ["k8s-libvirt-3-1-1-h", "k8s-libvirt-3-0-2-h", "k8s-libvirt-1-1-1-h", "k8s-libvirt-1-0-1-h"] - eks_configs = ["eks-libvirt-3-1-2-h", - "eks-libvirt-3-0-1-h", - "eks-libvirt-1-1-1-h", - "eks-libvirt-1-0-1-h"] - kid_configs = ["kid-libvirt-3-1-1-h", "kid-libvirt-3-0-2-h", "kid-libvirt-1-1-1-h", @@ -362,7 +347,7 @@ def get_periodic_jobs_labels(cluster_type='all', distro='all'): if re.match(r"([a-z|0-9|\.]+-[a-z]+-[1-9]-[0-9]-[1-9]-[c|h],?)+", distro): print("'kubeinit_ci_utils.py' ==> We are requesting specific job labels") req_labels = set(distro.split(",")) - all_labels = set(okd_configs + kid_configs + eks_configs + rke_configs + cdk_configs + k8s_configs) + all_labels = set(okd_configs + kid_configs + k8s_configs) if (req_labels.issubset(all_labels)): print("'kubeinit_ci_utils.py' ==> The requested labels are defined correctly") # We return the labels filtered by cluster_type, multinode or singlenode @@ -375,7 +360,7 @@ def get_periodic_jobs_labels(cluster_type='all', distro='all'): elif distro == 'random': print("'kubeinit_ci_utils.py' ==> Returning 4 random scenarios to test") # If the distro parameter is random we return 4 random distros to test - all_scenarios = okd_configs + kid_configs + eks_configs + rke_configs + cdk_configs + k8s_configs + all_scenarios = okd_configs + kid_configs + k8s_configs return_labels = random.sample(all_scenarios, 4) # We return the labels filtered by cluster_type, multinode or singlenode filtered_return = [lab for lab in return_labels if cluster_pattern.match(lab)] @@ -383,7 +368,7 @@ def get_periodic_jobs_labels(cluster_type='all', distro='all'): return filtered_return elif distro == "all": print("'kubeinit_ci_utils.py' ==> Appending all configs") - return_labels = okd_configs + kid_configs + eks_configs + rke_configs + cdk_configs + k8s_configs + return_labels = okd_configs + kid_configs + k8s_configs # We return the labels filtered by cluster_type, multinode or singlenode filtered_return = [lab for lab in return_labels if cluster_pattern.match(lab)] print("'kubeinit_ci_utils.py' ==> " + str(filtered_return)) @@ -393,18 +378,9 @@ def get_periodic_jobs_labels(cluster_type='all', distro='all'): if 'okd' in distro and '.' not in distro: print("'kubeinit_ci_utils.py' ==> Appending OKD configs") configs = configs + okd_configs - if 'rke' in distro and '.' not in distro: - print("'kubeinit_ci_utils.py' ==> Appending RKE configs") - configs = configs + rke_configs if 'kid' in distro and '.' not in distro: print("'kubeinit_ci_utils.py' ==> Appending KID configs") configs = configs + kid_configs - if 'eks' in distro and '.' not in distro: - print("'kubeinit_ci_utils.py' ==> Appending EKS configs") - configs = configs + eks_configs - if 'cdk' in distro and '.' not in distro: - print("'kubeinit_ci_utils.py' ==> Appending CDK configs") - configs = configs + cdk_configs if 'k8s' in distro and '.' not in distro: print("'kubeinit_ci_utils.py' ==> Appending K8S configs") configs = configs + k8s_configs diff --git a/ci/render_periodic_jobs_page.py b/ci/render_periodic_jobs_page.py index bd892d872..c407f00fd 100644 --- a/ci/render_periodic_jobs_page.py +++ b/ci/render_periodic_jobs_page.py @@ -50,12 +50,6 @@ def main(): distro = "Origin Distribution of K8s" elif distro == 'kid': distro = "KubeInit distro" - elif distro == 'eks': - distro = "Amazon EKS Distro" - elif distro == 'rke': - distro = "Rancher K8s Engine" - elif distro == 'cdk': - distro = "Canonical Distribution of K8s" elif distro == 'k8s': distro = "Vanilla K8s" elif '.' in distro: diff --git a/docs/src/roles/role-kubeinit_cdk.rst b/docs/src/roles/role-kubeinit_cdk.rst deleted file mode 100644 index 6c635b212..000000000 --- a/docs/src/roles/role-kubeinit_cdk.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================== -Role - kubeinit_cdk -=================== - -.. ansibleautoplugin:: - :role: kubeinit/roles/kubeinit_cdk diff --git a/docs/src/roles/role-kubeinit_eks.rst b/docs/src/roles/role-kubeinit_eks.rst deleted file mode 100644 index 0ebd47df7..000000000 --- a/docs/src/roles/role-kubeinit_eks.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================== -Role - kubeinit_eks -=================== - -.. ansibleautoplugin:: - :role: kubeinit/roles/kubeinit_eks diff --git a/docs/src/roles/role-kubeinit_rke.rst b/docs/src/roles/role-kubeinit_rke.rst deleted file mode 100644 index 3e228af4c..000000000 --- a/docs/src/roles/role-kubeinit_rke.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================== -Role - kubeinit_rke -=================== - -.. ansibleautoplugin:: - :role: kubeinit/roles/kubeinit_rke diff --git a/docs/src/usage.rst b/docs/src/usage.rst index a277ee4f6..2fec08d37 100644 --- a/docs/src/usage.rst +++ b/docs/src/usage.rst @@ -83,7 +83,7 @@ The current supported syntax of this variable is: `----` For example, combinations like okd-libvirt-1-2-1, k8s-libvirt-3-1-1, -eks-libvirt-1-0-1 are all valid. +are all valid. Deployment diff --git a/kubeinit/galaxy.yml b/kubeinit/galaxy.yml index 5c96b45b0..334c2724f 100644 --- a/kubeinit/galaxy.yml +++ b/kubeinit/galaxy.yml @@ -12,16 +12,9 @@ license: - Apache-2.0 tags: - k8s - - okd - - rke - - cdk - - eks - kubernetes - openshift - origin - - canonical - - rancher - - aws dependencies: ansible.netcommon: '==5.1.1' ansible.posix: '==1.5.4' diff --git a/kubeinit/group_vars/kubeinit_defaults.yml b/kubeinit/group_vars/kubeinit_defaults.yml index 7ad9255a9..3f96bb761 100644 --- a/kubeinit/group_vars/kubeinit_defaults.yml +++ b/kubeinit/group_vars/kubeinit_defaults.yml @@ -16,10 +16,6 @@ default_network_name: kimgtnet0 cluster_node_configurations_docsplaceholder: 'we should have a cluster_node_configuration main key' cluster_node_distro: - cdk: - os: ubuntu - eks: - os: centos k8s: os: centos kid: @@ -28,8 +24,6 @@ cluster_node_distro: os: coreos okd: os: coreos - rke: - os: ubuntu cluster_node_os: "{{ hostvars['kubeinit-defaults'].cluster_node_distro[kubeinit_cluster_distro].os }}" diff --git a/kubeinit/group_vars/kubeinit_facts.yml b/kubeinit/group_vars/kubeinit_facts.yml index 103887e74..ba40f2110 100644 --- a/kubeinit/group_vars/kubeinit_facts.yml +++ b/kubeinit/group_vars/kubeinit_facts.yml @@ -7,12 +7,6 @@ # - role: the role that provides the distro specific tasks. # distro_facts: - cdk: - name: 'Canonical Distribution of Kubernetes' - role: kubeinit_cdk - eks: - name: 'Amazon Elastic Kubernetes Service' - role: kubeinit_eks k8s: name: 'Vanilla CNCF Kubernetes' role: kubeinit_k8s @@ -25,6 +19,3 @@ distro_facts: okd: name: 'Origin Distribution of Kubernetes' role: kubeinit_openshift - rke: - name: 'Rancher Kubernetes Engine' - role: kubeinit_rke diff --git a/kubeinit/roles/kubeinit_cdk/README.md b/kubeinit/roles/kubeinit_cdk/README.md deleted file mode 100644 index 7f52c8016..000000000 --- a/kubeinit/roles/kubeinit_cdk/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Please, refer to the kubeinit_cdk role -[official docs](https://kubeinit.github.io/kubeinit/roles/role-kubeinit_cdk.html) -for further information. diff --git a/kubeinit/roles/kubeinit_cdk/defaults/main.yml b/kubeinit/roles/kubeinit_cdk/defaults/main.yml deleted file mode 100644 index 13131097a..000000000 --- a/kubeinit/roles/kubeinit_cdk/defaults/main.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -# All variables intended for modification should be placed in this file. - -# All variables within this role should have a prefix of "kubeinit_cdk_" -kubeinit_cdk_debug: "{{ (ansible_verbosity | int) >= 2 | bool }}" -kubeinit_cdk_hide_sensitive_logs: true - -kubeinit_cdk_series: "jammy" - -kubeinit_cdk_juju_version: "3.1" -kubeinit_cdk_juju_version_full: "3.1.0" - -kubeinit_cdk_juju_file: "juju-{{ kubeinit_cdk_juju_version_full }}-linux-amd64.tar.xz" -kubeinit_cdk_juju_uri: "https://launchpad.net/juju/{{ kubeinit_cdk_juju_version }}/{{ kubeinit_cdk_juju_version_full }}/+download/{{ kubeinit_cdk_juju_file }}" - -kubeinit_cdk_common_dependencies: - - aptitude diff --git a/kubeinit/roles/kubeinit_cdk/files/.gitkeep b/kubeinit/roles/kubeinit_cdk/files/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/kubeinit/roles/kubeinit_cdk/handlers/main.yml b/kubeinit/roles/kubeinit_cdk/handlers/main.yml deleted file mode 100644 index 9490b54cc..000000000 --- a/kubeinit/roles/kubeinit_cdk/handlers/main.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. diff --git a/kubeinit/roles/kubeinit_cdk/meta/main.yml b/kubeinit/roles/kubeinit_cdk/meta/main.yml deleted file mode 100644 index 36eb5868a..000000000 --- a/kubeinit/roles/kubeinit_cdk/meta/main.yml +++ /dev/null @@ -1,44 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -galaxy_info: - author: KubeInit - role_name: kubeinit_cdk - namespace: kubeinit - description: KubeInit Role -- kubeinit_cdk - company: Red Hat - license: Apache-2.0 - min_ansible_version: 2.9 - # - # Provide a list of supported platforms, and for each platform a list of versions. - # If you don't wish to enumerate all versions for a particular platform, use 'all'. - # To view available platforms and versions (or releases), visit: - # https://galaxy.ansible.com/api/v1/platforms/ - # - platforms: - - name: CentOS - versions: - - 7 - - 8 - - galaxy_tags: - - kubeinit - - -# List your role dependencies here, one per line. Be sure to remove the '[]' above, -# if you add dependencies to this list. -dependencies: [] diff --git a/kubeinit/roles/kubeinit_cdk/molecule/default/converge.yml b/kubeinit/roles/kubeinit_cdk/molecule/default/converge.yml deleted file mode 100644 index 4a265a7fe..000000000 --- a/kubeinit/roles/kubeinit_cdk/molecule/default/converge.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -- name: Converge - hosts: all - # roles: - # - role: "kubeinit_cdk" - tasks: - - name: Message for "kubeinit_cdk" - ansible.builtin.debug: - msg: Finishing molecule for "kubeinit_cdk" diff --git a/kubeinit/roles/kubeinit_cdk/molecule/default/molecule.yml b/kubeinit/roles/kubeinit_cdk/molecule/default/molecule.yml deleted file mode 100644 index b5d8023ed..000000000 --- a/kubeinit/roles/kubeinit_cdk/molecule/default/molecule.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -dependency: - name: galaxy -driver: - name: docker -platforms: - - name: instance - image: quay.io/centos/centos:stream8 - pre_build_image: true -provisioner: - name: ansible -verifier: - name: ansible diff --git a/kubeinit/roles/kubeinit_cdk/molecule/default/verify.yml b/kubeinit/roles/kubeinit_cdk/molecule/default/verify.yml deleted file mode 100644 index 86afba4ff..000000000 --- a/kubeinit/roles/kubeinit_cdk/molecule/default/verify.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -# This is an example playbook to execute Ansible tests. - -- name: Verify - hosts: all - tasks: - - name: Example assertion - ansible.builtin.assert: - that: true diff --git a/kubeinit/roles/kubeinit_cdk/tasks/main.yml b/kubeinit/roles/kubeinit_cdk/tasks/main.yml deleted file mode 100644 index e8a22991d..000000000 --- a/kubeinit/roles/kubeinit_cdk/tasks/main.yml +++ /dev/null @@ -1,228 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -- name: Deploy the cluster nodes - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_libvirt - tasks_from: deploy_ubuntu_guest.yml - public: yes - loop: "{{ groups['all_cluster_nodes'] + groups['all_extra_nodes'] }}" - loop_control: - loop_var: kubeinit_deployment_node_name - vars: - kubeinit_deployment_delegate: "{{ hostvars[kubeinit_deployment_node_name].target }}" - when: kubeinit_cluster_nodes_deployed is not defined or not kubeinit_cluster_nodes_deployed - -- name: Render the cluster template - ansible.builtin.template: - src: "cloud.yml.j2" - dest: "~/cloud.yml" - mode: '0644' - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Render the bundle template - ansible.builtin.template: - src: "bundle.yml.j2" - dest: "~/bundle.yml" - mode: '0644' - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Add host keys to known_hosts - ansible.builtin.known_hosts: - name: "{{ hostvars[item].ansible_host }}" - key: "{{ hostvars[item].ansible_host }} {{ hostvars[item].ssh_host_key_ecdsa }}" - state: present - loop: "{{ groups['all_cluster_nodes'] + groups['all_extra_nodes'] }}" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Install the CDK juju installer - ansible.builtin.shell: | - set -eo pipefail - wget {{ kubeinit_cdk_juju_uri }} - xzcat {{ kubeinit_cdk_juju_file }} | (cd /usr/bin; tar xvf - ./juju) - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Add the CDK cluster - ansible.builtin.shell: | - juju add-cloud --client {{ kubeinit_cluster_name }} -f cloud.yml - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Copy juju client key to cluster nodes - ansible.builtin.shell: | - ssh-copy-id -i ~/.local/share/juju/ssh/juju_id_rsa root@{{ hostvars[item].ansible_host }} - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - loop: "{{ groups['all_cluster_nodes'] + groups['all_extra_nodes'] }}" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Bootstrap the CDK controller - ansible.builtin.shell: | - juju bootstrap \ - --debug \ - --bootstrap-series={{ kubeinit_cdk_series }} \ - manual/root@{{ hostvars[groups['all_extra_nodes'][0]].ansible_host }} > juju-bootstrap.log 2>&1 - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Show juju info - ansible.builtin.shell: | - juju controllers --format=yaml - # juju status --format=yaml - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Add model - ansible.builtin.shell: | - juju add-model {{ kubeinit_cluster_name }} - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Add machines - ansible.builtin.shell: | - juju add-machine --debug \ - ssh:root@{{ hostvars[item].ansible_host }} > juju-add-machine-{{ item }}.log 2>&1 - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - loop: "{{ groups['all_cluster_nodes'] }}" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Verify that all cluster nodes are started - ansible.builtin.shell: | - set -o pipefail - juju machines | grep started - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - retries: 60 - delay: 60 - delegate_to: "{{ kubeinit_provision_service_node }}" - until: _result.stdout_lines | list | length == kubeinit_cluster_node_count|int - -- name: Deploy CDK - ansible.builtin.shell: | - juju deploy \ - ./bundle.yml \ - --force \ - --map-machines=existing{% for item in groups['all_cluster_nodes'] -%},{{ loop.index0 }}={{ loop.index0 }}{%- endfor %} - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - retries: 20 - delegate_to: "{{ kubeinit_provision_service_node }}" - until: _result.rc == 0 - -- name: Verify that the etcd cluster is up and healthy - ansible.builtin.shell: | - set -o pipefail - juju status --format=json | \ - sed 's/application-status/application_status/g' | \ - jq -r .applications.etcd.application_status.message - args: - executable: /bin/bash - vars: - all_controllers_healthy_text: "Healthy with {{ kubeinit_controller_count }} known peer{{ 's' if (kubeinit_controller_count|int > 1) }}" - register: _result - changed_when: "_result.rc == 0" - retries: 100 - delay: 60 - delegate_to: "{{ kubeinit_provision_service_node }}" - until: all_controllers_healthy_text == _result.stdout - -- name: Verify that the kubernetes_master application is up and healthy - ansible.builtin.shell: | - set -o pipefail - juju status --format=json | \ - sed 's/application-status/application_status/g' | \ - sed 's/kubernetes-control-plane/kubernetes_control_plane/g' | \ - jq -r .applications.kubernetes_control_plane.application_status.message - args: - executable: /bin/bash - vars: - healthy_text: "Kubernetes control-plane running." - register: _result - changed_when: "_result.rc == 0" - retries: 100 - delay: 60 - delegate_to: "{{ kubeinit_provision_service_node }}" - until: healthy_text == _result.stdout - -- name: Create kube directory - ansible.builtin.file: - path: ~/.kube - state: directory - mode: '0755' - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Get the kubectl binary and kubeconfig from the first controller node - ansible.builtin.shell: | - juju scp kubernetes-control-plane/0:/usr/bin/kubectl /usr/bin/kubectl - juju scp kubernetes-control-plane/0:config ~/.kube/config - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Install kustomize - ansible.builtin.shell: | - curl -sL https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.1.0/kustomize_v5.1.0_linux_amd64.tar.gz > kustomize.tar.gz - tar xzf ./kustomize.tar.gz - mv ./kustomize /bin/ - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Autoload kubeconfig - ansible.builtin.shell: | - echo "export KUBECONFIG=~/.kube/config" >> ~/.bashrc - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Finished deploying cluster - ansible.builtin.shell: | - echo "Finished deploying CDK cluster" - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" diff --git a/kubeinit/roles/kubeinit_cdk/tasks/post_configure_guest.yml b/kubeinit/roles/kubeinit_cdk/tasks/post_configure_guest.yml deleted file mode 100644 index e8d90a343..000000000 --- a/kubeinit/roles/kubeinit_cdk/tasks/post_configure_guest.yml +++ /dev/null @@ -1,44 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -- name: Add the Podman Ubuntu package repository to Apt - ansible.builtin.shell: | - set -eo pipefail - version_id=$(sed -n -e 's/^VERSION_ID="\(.*\)"/\1/p' /etc/os-release) - echo "deb https://download.opensuse.org/repositories/home:/kubeinit/xUbuntu_${version_id}/ /" > /etc/apt/sources.list.d/kubeinit.list - curl -L "https://download.opensuse.org/repositories/home:/kubeinit/xUbuntu_${version_id}/Release.key" | apt-key add - - apt-get update - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - -- name: Prepare podman - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_prepare - tasks_from: prepare_podman.yml - public: true - -- name: Install common requirements - ansible.builtin.package: - name: "{{ kubeinit_cdk_common_dependencies }}" - state: present - when: kubeinit_cdk_common_dependencies is defined - -- name: Install kubectl - ansible.builtin.package: - name: "kubectl" - state: present diff --git a/kubeinit/roles/kubeinit_cdk/tasks/post_deployment_tasks.yml b/kubeinit/roles/kubeinit_cdk/tasks/post_deployment_tasks.yml deleted file mode 100644 index 4cff9a20e..000000000 --- a/kubeinit/roles/kubeinit_cdk/tasks/post_deployment_tasks.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# -# Deploy the apps -# -- name: Deploy the apps - block: - - name: Deploy the apps - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_apps - public: yes - when: "'apps' in kubeinit_cluster_hostvars.services" - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - delegate_to: "{{ kubeinit_deployment_node_name }}" - -# -# Configure NFS -# -- name: Configure NFS - block: - - name: Configure NFS - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_nfs - public: true - when: "'nfs' in kubeinit_cluster_hostvars.services" - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - delegate_to: "{{ kubeinit_deployment_node_name }}" diff --git a/kubeinit/roles/kubeinit_cdk/tasks/prepare_cluster.yml b/kubeinit/roles/kubeinit_cdk/tasks/prepare_cluster.yml deleted file mode 100644 index 684170d55..000000000 --- a/kubeinit/roles/kubeinit_cdk/tasks/prepare_cluster.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -- name: Setup the cluster provision container - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_services - tasks_from: create_provision_container.yml - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - kubeinit_deployment_pod_name: "{{ hostvars[kubeinit_provision_service_node].guest_name }}-pod" - kubeinit_deployment_delegate: "{{ hostvars[kubeinit_provision_service_node].target }}" - kubeinit_deployment_os: "{{ hostvars[kubeinit_provision_service_node].os }}" diff --git a/kubeinit/roles/kubeinit_cdk/templates/bundle.yml.j2 b/kubeinit/roles/kubeinit_cdk/templates/bundle.yml.j2 deleted file mode 100644 index 548fa24a9..000000000 --- a/kubeinit/roles/kubeinit_cdk/templates/bundle.yml.j2 +++ /dev/null @@ -1,139 +0,0 @@ ---- -# -# From: https://jaas.ai/charmed-kubernetes -# git clone https://github.com/charmed-kubernetes/bundle -# cd bundle -# make -# -description: A highly-available, production-grade Kubernetes cluster. -issues: https://bugs.launchpad.net/charmed-kubernetes-bundles -series: jammy -source: https://github.com/charmed-kubernetes/bundle -website: https://ubuntu.com/kubernetes/charmed-k8s -name: cdk-flannel -machines: -{% for item in groups['all_cluster_nodes'] %} - "{{ loop.index0 }}": -{% endfor %} -applications: - containerd: - annotations: - gui-x: '475' - gui-y: '800' - channel: 1.26/stable - charm: containerd - easyrsa: - annotations: - gui-x: '90' - gui-y: '420' - charm: easyrsa - channel: 1.26/stable - constraints: root-disk=8G - num_units: 1 - to: -{% if kubeinit_compute_count|int > 0 %} - # This means that we will deploy the application - # in the first worker node as the numbering starts - # at 0. So, the count of controller nodes index will be - # the first compute node. - - "{{ kubeinit_controller_count }}" -{% else %} - - "0" -{% endif %} - etcd: - annotations: - gui-x: '800' - gui-y: '420' - charm: etcd - channel: 1.26/stable - constraints: root-disk=8G - num_units: {{ kubeinit_controller_count }} - to: -{% for item in groups['all_controller_nodes'] %} - - "{{ loop.index0 }}" -{% endfor %} - flannel: - annotations: - gui-x: '475' - gui-y: '605' - charm: flannel - channel: 1.26/stable - kubeapi-load-balancer: - annotations: - gui-x: '450' - gui-y: '250' - charm: kubeapi-load-balancer - channel: 1.26/stable - constraints: mem=4G root-disk=8G - expose: true - num_units: 1 - to: -{% if kubeinit_compute_count|int > 0 %} - # This means that we will deploy the application - # in the first worker node as the numbering starts - # at 0. So, the count of controller nodes index will be - # the first compute node. - - "{{ kubeinit_controller_count }}" -{% else %} - - "0" -{% endif %} - kubernetes-control-plane: - annotations: - gui-x: '800' - gui-y: '850' - charm: kubernetes-control-plane - channel: 1.26/stable - constraints: cores=2 mem=4G root-disk=16G - num_units: {{ kubeinit_controller_count }} - to: -{% for item in groups['all_controller_nodes'] %} - - "{{ loop.index0 }}" -{% endfor %} -{% if kubeinit_compute_count|int > 0 %} - kubernetes-worker: - annotations: - gui-x: '90' - gui-y: '850' - charm: kubernetes-worker - channel: 1.26/stable - constraints: cores=4 mem=4G root-disk=16G - expose: true - num_units: {{ kubeinit_compute_count }} - to: -{% for item in groups['all_compute_nodes'] | default([]) %} - - "{{ loop.index0 + kubeinit_controller_count|int }}" -{% endfor %} -{% endif %} -relations: -- - kubernetes-control-plane:loadbalancer-external - - kubeapi-load-balancer:lb-consumers -- - kubernetes-control-plane:loadbalancer-internal - - kubeapi-load-balancer:lb-consumers -{% if kubeinit_compute_count|int > 0 %} -- - kubernetes-control-plane:kube-control - - kubernetes-worker:kube-control -{% endif %} -- - kubernetes-control-plane:certificates - - easyrsa:client -- - etcd:certificates - - easyrsa:client -- - kubernetes-control-plane:etcd - - etcd:db -{% if kubeinit_compute_count|int > 0 %} -- - kubernetes-worker:certificates - - easyrsa:client -{% endif %} -- - kubeapi-load-balancer:certificates - - easyrsa:client -- - flannel:etcd - - etcd:db -- - flannel:cni - - kubernetes-control-plane:cni -{% if kubeinit_compute_count|int > 0 %} -- - flannel:cni - - kubernetes-worker:cni -- - containerd:containerd - - kubernetes-worker:container-runtime -{% endif %} -- - containerd:containerd - - kubernetes-control-plane:container-runtime diff --git a/kubeinit/roles/kubeinit_cdk/templates/cloud.yml.j2 b/kubeinit/roles/kubeinit_cdk/templates/cloud.yml.j2 deleted file mode 100644 index a59e15982..000000000 --- a/kubeinit/roles/kubeinit_cdk/templates/cloud.yml.j2 +++ /dev/null @@ -1,3 +0,0 @@ -clouds: - {{ kubeinit_cluster_name }}: - type: manual diff --git a/kubeinit/roles/kubeinit_cdk/vars/main.yml b/kubeinit/roles/kubeinit_cdk/vars/main.yml deleted file mode 100644 index a92a7ae2c..000000000 --- a/kubeinit/roles/kubeinit_cdk/vars/main.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -# While options found within the vars/ path can be overridden using extra -# vars, items within this path are considered part of the role and not -# intended to be modified. - -# All variables within this role should have a prefix of "kubeinit_cdk_" diff --git a/kubeinit/roles/kubeinit_eks/README.md b/kubeinit/roles/kubeinit_eks/README.md deleted file mode 100644 index c0556fc8a..000000000 --- a/kubeinit/roles/kubeinit_eks/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Please, refer to the kubeinit_eks role -[official docs](https://kubeinit.github.io/kubeinit/roles/role-kubeinit_eks.html) -for further information. diff --git a/kubeinit/roles/kubeinit_eks/defaults/main.yml b/kubeinit/roles/kubeinit_eks/defaults/main.yml deleted file mode 100644 index f03fce542..000000000 --- a/kubeinit/roles/kubeinit_eks/defaults/main.yml +++ /dev/null @@ -1,38 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -# All variables intended for modification should be placed in this file. - -# All variables within this role should have a prefix of "kubeinit_eks_" -kubeinit_eks_debug: "{{ (ansible_verbosity | int) >= 2 | bool }}" -kubeinit_eks_hide_sensitive_logs: true - -kubeinit_eks_pod_network: 10.244.0.0 -# This is the cluster CIDR -kubeinit_eks_pod_network_cidr: 10.244.0.0/16 -kubeinit_eks_pod_subnet_len: 16 - -kubeinit_eks_service_network_cidr: 10.96.0.0/12 - -kubeinit_eks_common_dependencies: - - wget - - nano - - python3 - - python3-pip - - which - - jq - - yum-utils diff --git a/kubeinit/roles/kubeinit_eks/files/.gitkeep b/kubeinit/roles/kubeinit_eks/files/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/kubeinit/roles/kubeinit_eks/handlers/main.yml b/kubeinit/roles/kubeinit_eks/handlers/main.yml deleted file mode 100644 index 9490b54cc..000000000 --- a/kubeinit/roles/kubeinit_eks/handlers/main.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. diff --git a/kubeinit/roles/kubeinit_eks/meta/main.yml b/kubeinit/roles/kubeinit_eks/meta/main.yml deleted file mode 100644 index 0e36a6443..000000000 --- a/kubeinit/roles/kubeinit_eks/meta/main.yml +++ /dev/null @@ -1,44 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -galaxy_info: - author: KubeInit - role_name: kubeinit_eks - namespace: kubeinit - description: KubeInit Role -- kubeinit_eks - company: Red Hat - license: Apache-2.0 - min_ansible_version: 2.9 - # - # Provide a list of supported platforms, and for each platform a list of versions. - # If you don't wish to enumerate all versions for a particular platform, use 'all'. - # To view available platforms and versions (or releases), visit: - # https://galaxy.ansible.com/api/v1/platforms/ - # - platforms: - - name: CentOS - versions: - - 7 - - 8 - - galaxy_tags: - - kubeinit - - -# List your role dependencies here, one per line. Be sure to remove the '[]' above, -# if you add dependencies to this list. -dependencies: [] diff --git a/kubeinit/roles/kubeinit_eks/molecule/default/converge.yml b/kubeinit/roles/kubeinit_eks/molecule/default/converge.yml deleted file mode 100644 index af8987bbf..000000000 --- a/kubeinit/roles/kubeinit_eks/molecule/default/converge.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -- name: Converge - hosts: all - # roles: - # - role: "kubeinit_eks" - tasks: - - name: Message for "kubeinit_eks" - ansible.builtin.debug: - msg: Finishing molecule for "kubeinit_eks" diff --git a/kubeinit/roles/kubeinit_eks/molecule/default/molecule.yml b/kubeinit/roles/kubeinit_eks/molecule/default/molecule.yml deleted file mode 100644 index b5d8023ed..000000000 --- a/kubeinit/roles/kubeinit_eks/molecule/default/molecule.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -dependency: - name: galaxy -driver: - name: docker -platforms: - - name: instance - image: quay.io/centos/centos:stream8 - pre_build_image: true -provisioner: - name: ansible -verifier: - name: ansible diff --git a/kubeinit/roles/kubeinit_eks/molecule/default/verify.yml b/kubeinit/roles/kubeinit_eks/molecule/default/verify.yml deleted file mode 100644 index 86afba4ff..000000000 --- a/kubeinit/roles/kubeinit_eks/molecule/default/verify.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -# This is an example playbook to execute Ansible tests. - -- name: Verify - hosts: all - tasks: - - name: Example assertion - ansible.builtin.assert: - that: true diff --git a/kubeinit/roles/kubeinit_eks/tasks/main.yml b/kubeinit/roles/kubeinit_eks/tasks/main.yml deleted file mode 100644 index 2f37d61e0..000000000 --- a/kubeinit/roles/kubeinit_eks/tasks/main.yml +++ /dev/null @@ -1,323 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -- name: Deploy the cluster nodes - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_libvirt - tasks_from: deploy_centos_guest.yml - public: yes - loop: "{{ groups['all_cluster_nodes'] }}" - loop_control: - loop_var: kubeinit_deployment_node_name - vars: - kubeinit_deployment_delegate: "{{ hostvars[kubeinit_deployment_node_name].target }}" - when: kubeinit_cluster_nodes_deployed is not defined or not kubeinit_cluster_nodes_deployed - -- name: Copy cert to pki directory - ansible.builtin.copy: - content: "{{ kubeinit_cluster_hostvars.domain_cert }}" - dest: /etc/pki/ca-trust/source/anchors/domain.crt - mode: 0644 - loop: "{{ groups['all_cluster_nodes'] }}" - loop_control: - loop_var: cluster_node - delegate_to: "{{ cluster_node }}" - -- name: Insert the local registry auth details - ansible.builtin.shell: | - set -eo pipefail - mkdir -p .docker - # cat << EOF > .docker/config.json - # { - # "auths": {{ kubeinit_cluster_hostvars.registry_disconnected_auth }}, - # "HttpHeaders": { - # "User-Agent": "Docker-Client/18.09.7 (linux)" - # } - # } - # EOF - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - loop: "{{ groups['all_cluster_nodes'] }}" - loop_control: - loop_var: cluster_node - delegate_to: "{{ cluster_node }}" - when: "'registry' in kubeinit_cluster_hostvars.services" - -- name: Create registry auth pullsecret file - ansible.builtin.copy: - content: | - {{ kubeinit_registry_pullsecret }} - dest: ".docker/config.json" - group: "{{ kubeinit_service_user }}" - owner: "{{ kubeinit_service_user }}" - mode: '0644' - force: yes - loop: "{{ groups['all_cluster_nodes'] }}" - loop_control: - loop_var: cluster_node - delegate_to: "{{ cluster_node }}" - when: "'registry' in kubeinit_cluster_hostvars.services" - - -- name: Update the CA certs files - ansible.builtin.command: update-ca-trust extract - register: _result - changed_when: "_result.rc == 0" - loop: "{{ groups['all_cluster_nodes'] }}" - loop_control: - loop_var: cluster_node - delegate_to: "{{ cluster_node }}" - when: "'registry' in kubeinit_cluster_hostvars.services" - -- name: Setup the first controller node - block: - - - name: Get etcd tag - ansible.builtin.shell: | - set -eo pipefail - curl -v --silent --user {{ kubeinit_registry_user }}:{{ kubeinit_registry_password }} https://{{ kubeinit_registry_uri }}/v2/etcd/tags/list --stderr - | grep '"name":"etcd"' | jq .tags[0] - args: - executable: /bin/bash - register: _result_etcd_tag - changed_when: "_result_etcd_tag.rc == 0" - - - name: Clean kubeadm - ansible.builtin.shell: | - set -eo pipefail - kubeadm reset -f || true - kubeadm config images list - kubeadm config images list --image-repository {{ kubeinit_registry_uri }} - kubeadm config images list --kubernetes-version latest - args: - executable: /bin/bash - register: _result_kubeadm_init_output - changed_when: "_result_kubeadm_init_output.rc == 0" - - - name: Create the cluster init template - ansible.builtin.copy: - dest: ~/config.yml - mode: '0644' - content: | - apiVersion: kubeadm.k8s.io/v1beta3 - kind: ClusterConfiguration - etcd: - local: - imageRepository: "{{ kubeinit_registry_uri }}" - imageTag: {{ _result_etcd_tag.stdout }} - controlPlaneEndpoint: "api.{{ kubeinit_cluster_fqdn }}:6443" - kubernetesVersion: "stable-{{ kubeinit_eks_kubernetes_version }}" - networking: - serviceSubnet: "{{ kubeinit_eks_service_network_cidr }}" - podSubnet: "{{ kubeinit_eks_pod_network_cidr }}" - - - name: Initialize Kubernetes cluster - ansible.builtin.shell: | - set -eo pipefail - kubeadm init --upload-certs --config=config.yml - args: - executable: /bin/bash - register: _result_kubeadm_init_output - changed_when: "_result_kubeadm_init_output.rc == 0" - - - name: Debug - ansible.builtin.debug: - var: _result_kubeadm_init_output - - - name: Get the controller join key - ansible.builtin.set_fact: - eks_controller_join_key: "{{ item }}" - loop: "{{ _result_kubeadm_init_output.stdout_lines }}" - when: ('--control-plane --certificate-key' in item) - - - name: Debug - ansible.builtin.debug: - var: eks_controller_join_key - - - name: Storing the controller join key to add the other controller nodes. - ansible.builtin.copy: - content: "{{ eks_controller_join_key }}" - dest: ~/eks_controller_join_key - mode: '0644' - when: kubeinit_controller_count|int > 1 - - - name: Create kube directory - ansible.builtin.file: - path: ~/.kube - state: directory - mode: '0644' - - - name: Copying required files - ansible.builtin.shell: | - cp -f /etc/kubernetes/admin.conf ~/.kube/config - chown $(id -u):$(id -g) ~/.kube/config - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - - - name: Get the join command - ansible.builtin.command: kubeadm token create --print-join-command - register: _result_join_command - changed_when: "_result_join_command.rc == 0" - - - name: Storing the join cluster command token. - ansible.builtin.copy: - content: "{{ _result_join_command.stdout }}" - dest: ~/eks_token - mode: '0644' - when: kubeinit_controller_count|int > 1 - - - name: Install Network Add-on - ansible.builtin.command: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml - register: _result - changed_when: "_result.rc == 0" - - delegate_to: "{{ kubeinit_first_controller_node }}" - -## -## Execute to configure all the other controller nodes -## - -- name: Join additional controller nodes using the PK - ansible.builtin.shell: | - kubeadm reset -f || true - echo "{{ _result_join_command.stdout }} {{ eks_controller_join_key }}" > ~/eks_controller_join_command.sh - sh ~/eks_controller_join_command.sh - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - loop: "{{ groups['all_controller_nodes'] }}" - loop_control: - loop_var: controller_node - delegate_to: "{{ controller_node }}" - when: kubeinit_controller_count|int > 1 and controller_node not in kubeinit_first_controller_node - -- name: Create kube directory - ansible.builtin.file: - path: ~/.kube - state: directory - mode: '0777' - loop: "{{ groups['all_controller_nodes'] }}" - loop_control: - loop_var: controller_node - delegate_to: "{{ controller_node }}" - when: kubeinit_controller_count|int > 1 and controller_node not in kubeinit_first_controller_node - -- name: Copying required files - ansible.builtin.shell: | - cp -f /etc/kubernetes/admin.conf ~/.kube/config - chown $(id -u):$(id -g) ~/.kube/config - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - loop: "{{ groups['all_controller_nodes'] }}" - loop_control: - loop_var: controller_node - delegate_to: "{{ controller_node }}" - when: kubeinit_controller_count|int > 1 and controller_node not in kubeinit_first_controller_node - -- name: Join compute nodes with kubernetes control plane - ansible.builtin.shell: | - kubeadm reset -f || true - echo "{{ _result_join_command.stdout }}" > ~/eks_compute_join_command.sh - sh ~/eks_compute_join_command.sh - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - loop: "{{ groups['all_compute_nodes'] | default([]) }}" - loop_control: - loop_var: compute_node - delegate_to: "{{ compute_node }}" - -- name: Fetch the kubeconfig from the first controller node - ansible.builtin.slurp: - src: ~/.kube/config - register: _result_cluster_kubeconfig - delegate_to: "{{ kubeinit_first_controller_node }}" - -- name: Create kube directory - ansible.builtin.file: - path: ~/.kube - state: directory - mode: '0644' - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Store the kubeconfig to the provision services machine. - ansible.builtin.copy: - content: "{{ _result_cluster_kubeconfig.content | default('Empty file') | b64decode }}" - dest: ~/.kube/config - mode: '0644' - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Label compute nodes - ansible.builtin.shell: | - kubectl label node {{ hostvars[item].fqdn }} node-role.kubernetes.io/worker= - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - loop: "{{ groups['all_compute_nodes'] | default([]) }}" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Allow schedule workloads in controller nodes if there are no compute nodes - ansible.builtin.shell: | - set -o pipefail - # Deprecated in 1.24 - for node in $(kubectl get nodes -o json | jq -r '.items[] | select(.spec.taints[]?.key=="node-role.kubernetes.io/master") | .metadata.labels."kubernetes.io/hostname"'); - do - kubectl taint node ${node} node-role.kubernetes.io/master:NoSchedule- - done - # Working starting on 1.24 - for node in $(kubectl get nodes -o json | jq -r '.items[] | select(.spec.taints[]?.key=="node-role.kubernetes.io/control-plane") | .metadata.labels."kubernetes.io/hostname"'); - do - kubectl taint node ${node} node-role.kubernetes.io/control-plane:NoSchedule- - done - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - when: not kubeinit_compute_count|int > 0 - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - delegate_to: "{{ kubeinit_deployment_node_name }}" - -- name: Install kustomize - ansible.builtin.shell: | - curl -sL https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.1.0/kustomize_v5.1.0_linux_amd64.tar.gz > kustomize.tar.gz - tar xzf ./kustomize.tar.gz - mv ./kustomize /bin/ - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Deploy EKS manifests - ansible.builtin.shell: | - kubectl apply -f https://distro.eks.amazonaws.com/crds/releases.distro.eks.amazonaws.com-v1alpha1.yaml - kubectl apply -f https://distro.eks.amazonaws.com/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}-eks-{{ kubeinit_eks_revision }}.yaml - kubectl get release kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}-eks-{{ kubeinit_eks_revision }} - kubectl get release kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}-eks-{{ kubeinit_eks_revision }} -o yaml - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" diff --git a/kubeinit/roles/kubeinit_eks/tasks/post_configure_guest.yml b/kubeinit/roles/kubeinit_eks/tasks/post_configure_guest.yml deleted file mode 100644 index 621627140..000000000 --- a/kubeinit/roles/kubeinit_eks/tasks/post_configure_guest.yml +++ /dev/null @@ -1,201 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# -# Install additional packages -# - -- name: Install common requirements - ansible.builtin.package: - name: "{{ kubeinit_eks_common_dependencies }}" - state: present - when: kubeinit_eks_common_dependencies is defined - -# -# cri-o repos -# - -- name: Download cri-o (kubeinit) repos - ansible.builtin.shell: | - curl -L -o /etc/yum.repos.d/home:kubeinit.repo https://download.opensuse.org/repositories/home:/kubeinit/CentOS_9_Stream/home:kubeinit.repo - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - -# -# cri-o config -# - -- name: Install the latest version of cri-o - ansible.builtin.package: - name: cri-o - state: present - -- name: Install the latest version of crun - ansible.builtin.package: - name: crun - state: present - -- name: Make sure cri-o binary is reachable and the configuration is correct - ansible.builtin.shell: | - yum install -y jq - # Make sure crio binary is reachable - ln -s /usr/bin/crio /usr/local/bin/crio - tmp=$(mktemp) - crioconf=$(ls /etc/cni/net.d/87-crio-bridge* | xargs realpath) - jq '.plugins[0].ipam.ranges[0][0].subnet = "{{ kubeinit_eks_pod_network }}/{{ kubeinit_eks_pod_subnet_len }}"' "$crioconf" > "$tmp" && mv -f "$tmp" "$crioconf" - # jq '.type = "flannel"' /etc/cni/net.d/87-crio-bridge.conf > "$tmp" && mv -f "$tmp" /etc/cni/net.d/87-crio-bridge.conf - # rm -rf /etc/cni/net.d/87-crio-bridge.conf - # echo '{"name": "crio","type": "flannel"}' > /etc/cni/net.d/10-crio.conf - cp /etc/crio/crio.conf /etc/crio/crio.conf.backup - sed -i s/^.*default_runtime\ =\ .*$/default_runtime\ =\ \"crun\"/g /etc/crio/crio.conf - - # There is no example config for crun anymore - #sed -i "s/^\#\[crio\.runtime\.runtimes\.crun.*\]/[crio.runtime.runtimes.crun]/g" /etc/crio/crio.conf - cat << EOF >> /etc/crio/crio.conf - [crio.runtime.runtimes.crun] - runtime_path = "/usr/bin/crun" - runtime_type = "oci" - runtime_root = "/run/crun" - EOF - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - -- name: Add insecure registry - ansible.builtin.blockinfile: - path: /etc/containers/registries.conf - block: | - [[registry]] - location = "{{ kubeinit_registry_uri }}" - insecure = true - when: "'registry' in kubeinit_cluster_hostvars.services" - -- name: Enable/start/status cri-o - ansible.builtin.shell: | - systemctl enable crio - systemctl start crio - systemctl status crio - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - -# -# kubernetes repos -# - -- name: Remove repo before adding it - ansible.builtin.file: - path: /etc/yum.repos.d/kubernetes.repo - state: absent - -- name: Creating a repository file for Kubernetes - ansible.builtin.file: - path: /etc/yum.repos.d/kubernetes.repo - state: touch - mode: '0644' - -- name: Adding repository details in Kubernetes repo file. - ansible.builtin.blockinfile: - path: /etc/yum.repos.d/kubernetes.repo - block: | - [kubernetes] - name=Kubernetes - baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 - enabled=1 - gpgcheck=1 - repo_gpgcheck=1 - gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg - exclude=kubelet kubeadm kubectl - -# -# Kubernetes config -# - -- name: Install requirements - ansible.builtin.package: - name: - - device-mapper-persistent-data - - lvm2 - state: present - -- name: Install requirements - ansible.builtin.command: dnf install -y kubelet-{{ kubeinit_eks_kubernetes_version_full }} kubeadm-{{ kubeinit_eks_kubernetes_version_full }} kubectl-{{ kubeinit_eks_kubernetes_version_full }} --disableexcludes=kubernetes - register: _result - changed_when: "_result.rc == 0" - -- name: Install YQ - ansible.builtin.shell: | - set -eo pipefail - python3 -m pip install yq - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - -- name: Install (replace) kubectl - ansible.builtin.shell: | - set -eo pipefail - - # kubectl - kubectl_bin=$( curl -s https://distro.eks.amazonaws.com/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}-eks-{{ kubeinit_eks_revision }}.yaml | \ - yq '.status.components | map(select(.name == "kubernetes")) | .[0].assets | map(select(.name == "bin/linux/amd64/kubectl")) | .[0].archive.uri' | tr -d '"') - wget -q $kubectl_bin - chmod +x kubectl - mv ./kubectl $(which kubectl) - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - -- name: Install (replace) kubeadm - ansible.builtin.shell: | - set -eo pipefail - - # kubeadm - kubeadm_bin=$( curl -s https://distro.eks.amazonaws.com/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}-eks-{{ kubeinit_eks_revision }}.yaml | \ - yq '.status.components | map(select(.name == "kubernetes")) | .[0].assets | map(select(.name == "bin/linux/amd64/kubeadm")) | .[0].archive.uri' | tr -d '"') - wget -q $kubeadm_bin - chmod +x kubeadm - mv ./kubeadm $(which kubeadm) - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - -- name: Install (replace) kubelet - ansible.builtin.shell: | - set -eo pipefail - - # kubelet - kubelet_bin=$( curl -s https://distro.eks.amazonaws.com/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}-eks-{{ kubeinit_eks_revision }}.yaml | \ - yq '.status.components | map(select(.name == "kubernetes")) | .[0].assets | map(select(.name == "bin/linux/amd64/kubelet")) | .[0].archive.uri' | tr -d '"') - wget -q $kubelet_bin - chmod +x kubelet - mv ./kubelet $(which kubelet) - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - -- name: Enable kubelet - ansible.builtin.systemd: - state: restarted - name: kubelet - enabled: yes diff --git a/kubeinit/roles/kubeinit_eks/tasks/post_deployment_tasks.yml b/kubeinit/roles/kubeinit_eks/tasks/post_deployment_tasks.yml deleted file mode 100644 index 4cff9a20e..000000000 --- a/kubeinit/roles/kubeinit_eks/tasks/post_deployment_tasks.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# -# Deploy the apps -# -- name: Deploy the apps - block: - - name: Deploy the apps - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_apps - public: yes - when: "'apps' in kubeinit_cluster_hostvars.services" - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - delegate_to: "{{ kubeinit_deployment_node_name }}" - -# -# Configure NFS -# -- name: Configure NFS - block: - - name: Configure NFS - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_nfs - public: true - when: "'nfs' in kubeinit_cluster_hostvars.services" - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - delegate_to: "{{ kubeinit_deployment_node_name }}" diff --git a/kubeinit/roles/kubeinit_eks/tasks/prepare_cluster.yml b/kubeinit/roles/kubeinit_eks/tasks/prepare_cluster.yml deleted file mode 100644 index 9774e8ff3..000000000 --- a/kubeinit/roles/kubeinit_eks/tasks/prepare_cluster.yml +++ /dev/null @@ -1,192 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -- name: Setup the cluster provision container - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_services - tasks_from: create_provision_container.yml - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - kubeinit_deployment_pod_name: "{{ hostvars[kubeinit_provision_service_node].guest_name }}-pod" - kubeinit_deployment_delegate: "{{ hostvars[kubeinit_provision_service_node].target }}" - kubeinit_deployment_os: "{{ hostvars[kubeinit_provision_service_node].os }}" - -- name: Configure the service node - block: - - - name: Install common requirements - ansible.builtin.package: - name: "{{ kubeinit_eks_common_dependencies }}" - state: present - when: kubeinit_eks_common_dependencies is defined - - - name: Remove repo before adding it - ansible.builtin.file: - path: /etc/yum.repos.d/kubernetes.repo - state: absent - - - name: Creating a repository file for Kubernetes - ansible.builtin.file: - path: /etc/yum.repos.d/kubernetes.repo - state: touch - mode: '0644' - - - name: Adding repository details in Kubernetes repo file. - ansible.builtin.blockinfile: - path: /etc/yum.repos.d/kubernetes.repo - block: | - [kubernetes] - name=Kubernetes - baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch - enabled=1 - gpgcheck=1 - repo_gpgcheck=1 - gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg - exclude=kubelet kubeadm kubectl - - # - # Kubernetes config - # - - - name: Fetch EKS kubernetes release - ansible.builtin.command: curl -s https://raw.githubusercontent.com/aws/eks-distro/main/release/DEFAULT_RELEASE_BRANCH - register: _result_release - changed_when: "_result_release.rc == 0" - - - name: Set EKS kubernetes major-minor fact - ansible.builtin.set_fact: - kubeinit_eks_kubernetes_major_minor: "{{ _result_release.stdout | trim }}" - - - name: Discover the revision number for eks - ansible.builtin.command: curl -s https://raw.githubusercontent.com/aws/eks-distro/main/release/{{ kubeinit_eks_kubernetes_major_minor }}/production/RELEASE - register: _result_revision - changed_when: "_result_revision.rc == 0" - - - name: Set EKS release number fact - ansible.builtin.set_fact: - kubeinit_eks_revision: "{{ _result_revision.stdout | trim }}" - - - name: Discover the git tag for eks - ansible.builtin.command: curl -s https://raw.githubusercontent.com/aws/eks-distro/main/projects/kubernetes/release/{{ kubeinit_eks_kubernetes_major_minor }}/GIT_TAG - register: _result_gittag - changed_when: "_result_gittag.rc == 0" - - - name: Set EKS string facts - ansible.builtin.set_fact: - kubeinit_eks_kubernetes_dirname: "kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}" - kubeinit_eks_kubernetes_filename: "kubernetes-{{ kubeinit_eks_kubernetes_major_minor + '-eks-' + kubeinit_eks_revision }}.yaml" - kubeinit_eks_kubernetes_gittag: "{{ (_result_gittag.stdout | trim) + '-eks-' + kubeinit_eks_kubernetes_major_minor + '-' + kubeinit_eks_revision }}" - - - name: Set complete EKS kubernetes version - ansible.builtin.set_fact: - kubeinit_eks_kubernetes_version: "{{ kubeinit_eks_kubernetes_major_minor.replace('-','.') }}" - - - name: Install YQ - ansible.builtin.shell: | - set -eo pipefail - python3 -m pip install yq - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - - - name: Discover full version of Kubernetes that will be deployed - ansible.builtin.shell: | - set -o pipefail - set -e - curl -s https://distro.eks.amazonaws.com/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}-eks-{{ kubeinit_eks_revision }}.yaml | \ - yq '.status.components | map(select(.name == "kubernetes")) | .[0].gitTag' | tr -d '"' | tr -d 'v' - args: - executable: /bin/bash - register: _result_kubernetes_version_full - changed_when: "_result_kubernetes_version_full.rc == 0" - - - name: Set EKS release number fact - ansible.builtin.set_fact: - kubeinit_eks_kubernetes_version_full: "{{ _result_kubernetes_version_full.stdout | trim }}" - - - name: Install requirements - ansible.builtin.command: dnf install -y kubectl-{{ kubeinit_eks_kubernetes_version_full }} --disableexcludes=kubernetes - register: _result - changed_when: "_result.rc == 0" - - - name: Install (replace) requirements - ansible.builtin.shell: | - set -eo pipefail - kubectl_bin=$( curl -s https://distro.eks.amazonaws.com/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}/kubernetes-{{ kubeinit_eks_kubernetes_major_minor }}-eks-{{ kubeinit_eks_revision }}.yaml | \ - yq '.status.components | map(select(.name == "kubernetes")) | .[0].assets | map(select(.name == "bin/linux/amd64/kubectl")) | .[0].archive.uri' | tr -d '"') - wget -q $kubectl_bin - chmod +x kubectl - mv ./kubectl $(which kubectl) - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - - - name: Install services requirements - ansible.builtin.package: - name: skopeo - state: present - - # - # Configure local registry - # - - - name: Get the required container images - ansible.builtin.shell: | - set -eo pipefail - curl -s https://distro.eks.amazonaws.com/{{ kubeinit_eks_kubernetes_dirname }}/{{ kubeinit_eks_kubernetes_filename }} | \ - sed -n -e "s|^.*uri: \(public.ecr.aws/eks-distro\)|\1|p" > ~/kubeinit_deployment_images.txt - echo public.ecr.aws/eks-distro/kubernetes/kube-proxy-base:{{ kubeinit_eks_kubernetes_gittag }} >> ~/kubeinit_deployment_images.txt - echo public.ecr.aws/eks-distro/kubernetes/go-runner:{{ kubeinit_eks_kubernetes_gittag }} >> ~/kubeinit_deployment_images.txt - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - - - name: Mirror EKS remote registry to local - ansible.builtin.shell: | - set -o pipefail - set -e - mkdir -p /etc/containers/ - cat << EOF > /etc/containers/policy.json - { - "default": [ - { - "type": "insecureAcceptAnything" - } - ], - "transports": - { - "docker-daemon": - { - "": [{"type":"insecureAcceptAnything"}] - } - } - } - EOF - echo "function skopeo_copy {" > skopeo_copy.bash - echo " skopeo copy docker://\$1 docker://{{ kubeinit_registry_uri }}/\$2 --dest-creds {{ kubeinit_registry_user }}:{{ kubeinit_registry_password }}" >> ~/skopeo_copy.bash - echo "}" >> ~/skopeo_copy.bash - sed -e 's;^\(public.ecr.aws/\)\(.*/\)\(.*\);skopeo_copy "\1\2\3" "\2\3"\nskopeo_copy "\1\2\3" "\3";' ~/kubeinit_deployment_images.txt >> ~/skopeo_copy.bash - bash ~/skopeo_copy.bash - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - when: "'registry' in kubeinit_cluster_hostvars.services" - - delegate_to: "{{ kubeinit_provision_service_node }}" diff --git a/kubeinit/roles/kubeinit_eks/vars/main.yml b/kubeinit/roles/kubeinit_eks/vars/main.yml deleted file mode 100644 index f4cc1f146..000000000 --- a/kubeinit/roles/kubeinit_eks/vars/main.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -# While options found within the vars/ path can be overridden using extra -# vars, items within this path are considered part of the role and not -# intended to be modified. - -# All variables within this role should have a prefix of "kubeinit_eks_" diff --git a/kubeinit/roles/kubeinit_rke/README.md b/kubeinit/roles/kubeinit_rke/README.md deleted file mode 100644 index f40611720..000000000 --- a/kubeinit/roles/kubeinit_rke/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Please, refer to the kubeinit_rke role -[official docs](https://kubeinit.github.io/kubeinit/roles/role-kubeinit_rke.html) -for further information. diff --git a/kubeinit/roles/kubeinit_rke/defaults/main.yml b/kubeinit/roles/kubeinit_rke/defaults/main.yml deleted file mode 100644 index 90ab3e44d..000000000 --- a/kubeinit/roles/kubeinit_rke/defaults/main.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -# All variables intended for modification should be placed in this file. - -# All variables within this role should have a prefix of "kubeinit_rke_" -kubeinit_rke_debug: "{{ (ansible_verbosity | int) >= 2 | bool }}" -kubeinit_rke_hide_sensitive_logs: true - -kubeinit_rke_pod_cidr: 10.42.0.0/16 -kubeinit_rke_service_cidr: 10.43.0.0/16 - -kubeinit_rke_registry_release_tag: v1.4.3 diff --git a/kubeinit/roles/kubeinit_rke/files/.gitkeep b/kubeinit/roles/kubeinit_rke/files/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/kubeinit/roles/kubeinit_rke/handlers/main.yml b/kubeinit/roles/kubeinit_rke/handlers/main.yml deleted file mode 100644 index 9490b54cc..000000000 --- a/kubeinit/roles/kubeinit_rke/handlers/main.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. diff --git a/kubeinit/roles/kubeinit_rke/meta/main.yml b/kubeinit/roles/kubeinit_rke/meta/main.yml deleted file mode 100644 index ae7387a73..000000000 --- a/kubeinit/roles/kubeinit_rke/meta/main.yml +++ /dev/null @@ -1,44 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -galaxy_info: - author: KubeInit - role_name: kubeinit_rke - namespace: kubeinit - description: KubeInit Role -- kubeinit_rke - company: Red Hat - license: Apache-2.0 - min_ansible_version: 2.9 - # - # Provide a list of supported platforms, and for each platform a list of versions. - # If you don't wish to enumerate all versions for a particular platform, use 'all'. - # To view available platforms and versions (or releases), visit: - # https://galaxy.ansible.com/api/v1/platforms/ - # - platforms: - - name: CentOS - versions: - - 7 - - 8 - - galaxy_tags: - - kubeinit - - -# List your role dependencies here, one per line. Be sure to remove the '[]' above, -# if you add dependencies to this list. -dependencies: [] diff --git a/kubeinit/roles/kubeinit_rke/molecule/default/converge.yml b/kubeinit/roles/kubeinit_rke/molecule/default/converge.yml deleted file mode 100644 index 3c81ea76f..000000000 --- a/kubeinit/roles/kubeinit_rke/molecule/default/converge.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -- name: Converge - hosts: all - # roles: - # - role: "kubeinit_rke" - tasks: - - name: Message for "kubeinit_rke" - ansible.builtin.debug: - msg: Finishing molecule for "kubeinit_rke" diff --git a/kubeinit/roles/kubeinit_rke/molecule/default/molecule.yml b/kubeinit/roles/kubeinit_rke/molecule/default/molecule.yml deleted file mode 100644 index b5d8023ed..000000000 --- a/kubeinit/roles/kubeinit_rke/molecule/default/molecule.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -dependency: - name: galaxy -driver: - name: docker -platforms: - - name: instance - image: quay.io/centos/centos:stream8 - pre_build_image: true -provisioner: - name: ansible -verifier: - name: ansible diff --git a/kubeinit/roles/kubeinit_rke/molecule/default/verify.yml b/kubeinit/roles/kubeinit_rke/molecule/default/verify.yml deleted file mode 100644 index 86afba4ff..000000000 --- a/kubeinit/roles/kubeinit_rke/molecule/default/verify.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -# This is an example playbook to execute Ansible tests. - -- name: Verify - hosts: all - tasks: - - name: Example assertion - ansible.builtin.assert: - that: true diff --git a/kubeinit/roles/kubeinit_rke/tasks/main.yml b/kubeinit/roles/kubeinit_rke/tasks/main.yml deleted file mode 100644 index fb11b1e0c..000000000 --- a/kubeinit/roles/kubeinit_rke/tasks/main.yml +++ /dev/null @@ -1,116 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -- name: Deploy the cluster nodes - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_libvirt - tasks_from: deploy_ubuntu_guest.yml - public: yes - loop: "{{ groups['all_cluster_nodes'] }}" - loop_control: - loop_var: cluster_node - vars: - kubeinit_deployment_node_name: "{{ cluster_node }}" - kubeinit_deployment_delegate: "{{ hostvars[cluster_node].target }}" - when: kubeinit_cluster_nodes_deployed is not defined or not kubeinit_cluster_nodes_deployed - -- name: Enable insecure registry in Docker - ansible.builtin.shell: | - # This is mandatory so the cluster nodes can fetch the - # images from the local (insecure) registry - sed -i '/^ExecStart=/ s/$/ --insecure-registry {{ kubeinit_registry_uri }}/' /lib/systemd/system/docker.service - systemctl daemon-reload - systemctl restart docker - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - loop: "{{ groups['all_cluster_nodes'] }}" - loop_control: - loop_var: cluster_node - delegate_to: "{{ cluster_node }}" - when: "'registry' in kubeinit_cluster_hostvars.services" - -- name: "Install RKE" - ansible.builtin.shell: | - ~/rke --version - ~/rke up --ignore-docker-version -disable-port-check - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Autoload kubeconfig - ansible.builtin.shell: | - echo "export KUBECONFIG=~/kube_config_cluster.yml" >> ~/.bashrc - args: - executable: /bin/bash - ignore_errors: yes - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Create kube directory - ansible.builtin.file: - path: ~/.kube - state: directory - mode: '0644' - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Copy the kubeconfig - ansible.builtin.shell: | - cp ~/kube_config_cluster.yml ~/.kube/config - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Touch a file - ansible.builtin.command: | - touch ~/.kube/config - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Install kustomize - ansible.builtin.shell: | - curl -sL https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.1.0/kustomize_v5.1.0_linux_amd64.tar.gz > kustomize.tar.gz - tar xzf ./kustomize.tar.gz - mv ./kustomize /bin/ - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - delegate_to: "{{ kubeinit_provision_service_node }}" - -- name: Allow schedule workloads in controller nodes if there are no compute nodes - ansible.builtin.shell: | - set -o pipefail - for node in $(kubectl get nodes -o json | jq -r '.items[] | select(.spec.taints[]?.key=="node-role.kubernetes.io/controlplane") | .metadata.labels."kubernetes.io/hostname"'); - do - kubectl taint node ${node} node-role.kubernetes.io/controlplane:NoSchedule- - kubectl taint node ${node} node-role.kubernetes.io/etcd:NoExecute- - done - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - when: not kubeinit_compute_count|int > 0 - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - delegate_to: "{{ kubeinit_deployment_node_name }}" diff --git a/kubeinit/roles/kubeinit_rke/tasks/post_configure_guest.yml b/kubeinit/roles/kubeinit_rke/tasks/post_configure_guest.yml deleted file mode 100644 index 88f8f6518..000000000 --- a/kubeinit/roles/kubeinit_rke/tasks/post_configure_guest.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -- name: Prepare podman - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_prepare - tasks_from: prepare_podman.yml - public: true - -- name: Install docker.io packages - ansible.builtin.package: - name: "docker.io" - state: present - -- name: Install kubectl - ansible.builtin.package: - name: "kubectl" - state: present diff --git a/kubeinit/roles/kubeinit_rke/tasks/post_deployment_tasks.yml b/kubeinit/roles/kubeinit_rke/tasks/post_deployment_tasks.yml deleted file mode 100644 index 4cff9a20e..000000000 --- a/kubeinit/roles/kubeinit_rke/tasks/post_deployment_tasks.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# -# Deploy the apps -# -- name: Deploy the apps - block: - - name: Deploy the apps - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_apps - public: yes - when: "'apps' in kubeinit_cluster_hostvars.services" - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - delegate_to: "{{ kubeinit_deployment_node_name }}" - -# -# Configure NFS -# -- name: Configure NFS - block: - - name: Configure NFS - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_nfs - public: true - when: "'nfs' in kubeinit_cluster_hostvars.services" - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - delegate_to: "{{ kubeinit_deployment_node_name }}" diff --git a/kubeinit/roles/kubeinit_rke/tasks/prepare_cluster.yml b/kubeinit/roles/kubeinit_rke/tasks/prepare_cluster.yml deleted file mode 100644 index 7ca29dbc5..000000000 --- a/kubeinit/roles/kubeinit_rke/tasks/prepare_cluster.yml +++ /dev/null @@ -1,120 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -- name: Setup the cluster provision container - ansible.builtin.include_role: - name: kubeinit.kubeinit.kubeinit_services - tasks_from: create_provision_container.yml - vars: - kubeinit_deployment_node_name: "{{ kubeinit_provision_service_node }}" - kubeinit_deployment_pod_name: "{{ hostvars[kubeinit_provision_service_node].guest_name }}-pod" - kubeinit_deployment_delegate: "{{ hostvars[kubeinit_provision_service_node].target }}" - kubeinit_deployment_os: "{{ hostvars[kubeinit_provision_service_node].os }}" - -- name: Configure the provision service node - block: - - - name: Add kubernetes repo for latest kubectl (Ubuntu) - ansible.builtin.shell: | - set -eo pipefail - apt-get install -y apt-transport-https ca-certificates curl - curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg - echo "deb [trusted=yes signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list - apt-get update --allow-insecure-repositories - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - - - name: Install services requirements - ansible.builtin.package: - name: "kubectl,skopeo" - state: present - - - name: "Render net info" - ansible.builtin.shell: | - set -o pipefail - echo "{{ kubeinit_rke_pod_cidr }}" > ~/pod_cidr - echo "{{ kubeinit_rke_service_cidr }}" > ~/service_cidr - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - - - name: Render the cluster template - ansible.builtin.template: - src: "cluster.yml.j2" - dest: "~/cluster.yml" - mode: '0644' - - - name: Download rancher - ansible.builtin.get_url: - url: "https://github.com/rancher/rke/releases/download/{{ kubeinit_rke_registry_release_tag }}/rke_linux-amd64" - dest: ~/ - mode: '0755' - - - name: "Adjust installer" - ansible.builtin.copy: - src: ~/rke_linux-amd64 - dest: ~/rke - remote_src: yes - group: "{{ kubeinit_service_user }}" - owner: "{{ kubeinit_service_user }}" - mode: '0755' - force: yes - - - name: "Render the required container images" - ansible.builtin.shell: | - set -o pipefail - ~/rke config --system-images | grep -v 'INFO' | grep -v 'level=info' > ~/kubeinit_deployment_images.txt - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - - - name: Mirror RKE remote registry to local - ansible.builtin.shell: | - set -o pipefail - set -e - mkdir -p /etc/containers/ - cat << EOF > /etc/containers/policy.json - { - "default": [ - { - "type": "insecureAcceptAnything" - } - ], - "transports": - { - "docker-daemon": - { - "": [{"type":"insecureAcceptAnything"}] - } - } - } - EOF - echo "function skopeo_sync {" > skopeo_sync.bash - echo " skopeo sync --src docker --dest docker docker.io/\$1 --dest-creds {{ kubeinit_registry_user }}:{{ kubeinit_registry_password }} {{ kubeinit_registry_uri }}/\$2" >> ~/skopeo_sync.bash - echo "}" >> ~/skopeo_sync.bash - sed -e 's;^\(.*\)/\(.*\);skopeo_sync "\1/\2" "\1";' ~/kubeinit_deployment_images.txt >> ~/skopeo_sync.bash - bash ~/skopeo_sync.bash - args: - executable: /bin/bash - register: _result - changed_when: "_result.rc == 0" - when: "'registry' in kubeinit_cluster_hostvars.services" - - delegate_to: "{{ kubeinit_provision_service_node }}" diff --git a/kubeinit/roles/kubeinit_rke/templates/cluster.yml.j2 b/kubeinit/roles/kubeinit_rke/templates/cluster.yml.j2 deleted file mode 100644 index 74c8d3c87..000000000 --- a/kubeinit/roles/kubeinit_rke/templates/cluster.yml.j2 +++ /dev/null @@ -1,205 +0,0 @@ -# https://rancher.com/docs/rke/latest/en/example-yamls/ -nodes: -{% for host in groups['all_controller_nodes'] | list %} - - address: {{ host }}.{{ kubeinit_cluster_fqdn }} - hostname_override: {{ host }} - user: root - port: "22" - role: - - controlplane - - etcd - docker_socket: /var/run/docker.sock - ssh_key: "" - ssh_key_path: ~/.ssh/id_{{ kubeinit_ssh_keytype }} - ssh_cert: "" - ssh_cert_path: "" - labels: {} - taints: [] -{% endfor %} -{% for host in groups['all_compute_nodes'] | default([]) | list %} - - address: {{ host }}.{{ kubeinit_cluster_fqdn }} - hostname_override: {{ host }} - user: root - port: "22" - role: - - worker - docker_socket: /var/run/docker.sock - ssh_key: "" - ssh_key_path: ~/.ssh/id_{{ kubeinit_ssh_keytype }} - ssh_cert: "" - ssh_cert_path: "" - labels: {} - taints: [] -{% endfor %} -services: - etcd: - image: "" - extra_args: {} - extra_binds: [] - extra_env: [] - win_extra_args: {} - win_extra_binds: [] - win_extra_env: [] - external_urls: [] - ca_cert: "" - cert: "" - key: "" - path: "" - uid: 0 - gid: 0 - snapshot: null - retention: "" - creation: "" - backup_config: null - kube-api: - image: "" - extra_args: {} - extra_binds: [] - extra_env: [] - win_extra_args: {} - win_extra_binds: [] - win_extra_env: [] - service_cluster_ip_range: {{ kubeinit_rke_service_cidr }} - cluster_cidr: {{ kubeinit_rke_pod_cidr }} - service_node_port_range: "" - pod_security_policy: false - always_pull_images: false - secrets_encryption_config: null - audit_log: null - admission_configuration: null - event_rate_limit: null - kube-controller: - image: "" - extra_args: {} - extra_binds: [] - extra_env: [] - win_extra_args: {} - win_extra_binds: [] - win_extra_env: [] - service_cluster_ip_range: {{ kubeinit_rke_service_cidr }} - cluster_cidr: {{ kubeinit_rke_pod_cidr }} - scheduler: - image: "" - extra_args: {} - extra_binds: [] - extra_env: [] - win_extra_args: {} - win_extra_binds: [] - win_extra_env: [] - kubelet: - image: "" - extra_args: {} - extra_binds: [] - extra_env: [] - win_extra_args: {} - win_extra_binds: [] - win_extra_env: [] - cluster_domain: cluster.local - infra_container_image: "" - # TODO:FIXME: Hardwired IP - cluster_dns_server: 10.43.0.10 - fail_swap_on: false - generate_serving_certificate: false - kubeproxy: - image: "" - extra_args: {} - extra_binds: [] - extra_env: [] - win_extra_args: {} - win_extra_binds: [] - win_extra_env: [] -network: - plugin: canal - options: {} - mtu: 0 - node_selector: {} - update_strategy: null -authentication: - strategy: x509 - sans: [] - webhook: null -addons: "" -addons_include: [] -#system_images: -# etcd: rancher/coreos-etcd:v3.4.3-rancher1 -# alpine: rancher/rke-tools:v0.1.65 -# nginx_proxy: rancher/rke-tools:v0.1.65 -# cert_downloader: rancher/rke-tools:v0.1.65 -# kubernetes_services_sidecar: rancher/rke-tools:v0.1.65 -# kubedns: rancher/k8s-dns-kube-dns:1.15.2 -# dnsmasq: rancher/k8s-dns-dnsmasq-nanny:1.15.2 -# kubedns_sidecar: rancher/k8s-dns-sidecar:1.15.2 -# kubedns_autoscaler: rancher/cluster-proportional-autoscaler:1.7.1 -# coredns: rancher/coredns-coredns:1.6.9 -# coredns_autoscaler: rancher/cluster-proportional-autoscaler:1.7.1 -# nodelocal: rancher/k8s-dns-node-cache:1.15.7 -# kubernetes: rancher/hyperkube:v1.18.9-rancher1 -# flannel: rancher/coreos-flannel:v0.12.0 -# flannel_cni: rancher/flannel-cni:v0.3.0-rancher6 -# calico_node: rancher/calico-node:v3.13.4 -# calico_cni: rancher/calico-cni:v3.13.4 -# calico_controllers: rancher/calico-kube-controllers:v3.13.4 -# calico_ctl: rancher/calico-ctl:v3.13.4 -# calico_flexvol: rancher/calico-pod2daemon-flexvol:v3.13.4 -# canal_node: rancher/calico-node:v3.13.4 -# canal_cni: rancher/calico-cni:v3.13.4 -# canal_flannel: rancher/coreos-flannel:v0.12.0 -# canal_flexvol: rancher/calico-pod2daemon-flexvol:v3.13.4 -# weave_node: weaveworks/weave-kube:2.6.4 -# weave_cni: weaveworks/weave-npc:2.6.4 -# pod_infra_container: rancher/pause:3.1 -# ingress: rancher/nginx-ingress-controller:nginx-0.35.0-rancher1 -# ingress_backend: rancher/nginx-ingress-controller-defaultbackend:1.5-rancher1 -# metrics_server: rancher/metrics-server:v0.3.6 -# windows_pod_infra_container: rancher/kubelet-pause:v0.1.4 -ssh_key_path: ~/.ssh/id_{{ kubeinit_ssh_keytype }} -ssh_cert_path: "" -ssh_agent_auth: false -authorization: - mode: rbac - options: {} -ignore_docker_version: false -kubernetes_version: "" -{% if 'registry' in kubeinit_cluster_hostvars.services %} -private_registries: - - url: {{ kubeinit_registry_uri }} - user: {{ kubeinit_registry_user }} - password: {{ kubeinit_registry_password }} - is_default: true -{% else %} -private_registries: [] -{% endif %} -ingress: - provider: "" - options: {} - node_selector: {} - extra_args: {} - dns_policy: "" - extra_envs: [] - extra_volumes: [] - extra_volume_mounts: [] - update_strategy: null -cluster_name: {{ kubeinit_cluster_name }} -cloud_provider: - name: "" -prefix_path: "" -win_prefix_path: "" -addon_job_timeout: 0 -bastion_host: - address: "" - port: "" - user: "" - ssh_key: "" - ssh_key_path: "" - ssh_cert: "" - ssh_cert_path: "" -monitoring: - provider: "" - options: {} - node_selector: {} - update_strategy: null - replicas: null -restore: - restore: false - snapshot_name: "" -dns: null diff --git a/kubeinit/roles/kubeinit_rke/vars/main.yml b/kubeinit/roles/kubeinit_rke/vars/main.yml deleted file mode 100644 index 0c50391a2..000000000 --- a/kubeinit/roles/kubeinit_rke/vars/main.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -# Copyright kubeinit contributors -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -# While options found within the vars/ path can be overridden using extra -# vars, items within this path are considered part of the role and not -# intended to be modified. - -# All variables within this role should have a prefix of "kubeinit_rke_" diff --git a/ui/.dockerignore b/ui/.dockerignore deleted file mode 100755 index 72e294c8e..000000000 --- a/ui/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -.git -__pycache__ -*.pyc -*.pyo -*.pyd \ No newline at end of file diff --git a/ui/.eslintignore b/ui/.eslintignore deleted file mode 100755 index 32014aa85..000000000 --- a/ui/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -app/base/static/vendors -app/base/static/build/js/custom.js -app/base/static/build/js/custom.min.js \ No newline at end of file diff --git a/ui/.eslintrc b/ui/.eslintrc deleted file mode 100755 index bca7e9909..000000000 --- a/ui/.eslintrc +++ /dev/null @@ -1,18 +0,0 @@ -{ - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module", - "ecmaFeatures": { - "jsx": true - } - }, - "env": { - "browser": true, - "jquery": true - }, - "rules": { - "no-invalid-this": 0, - "linebreak-style": 0 - }, - "extends": ["eslint:recommended", "google"] -} \ No newline at end of file diff --git a/ui/.gitignore b/ui/.gitignore deleted file mode 100755 index 214232828..000000000 --- a/ui/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -# byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] - -# tests and coverage -*.pytest_cache -.coverage - -# database & logs -*.db -*.log - -# venv -env -venv - -# other -.DS_Store - -# sphinx docs -_build -_static -_templates - -# javascript -package-lock.json \ No newline at end of file diff --git a/ui/README.md b/ui/README.md deleted file mode 100755 index 6b5bbc9e1..000000000 --- a/ui/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# The official Kubeinit web dashboard - -This is the web interface to monitor the cluster's deployments. - -It allows to: - -* Check the cluster state -* Check the default available Kubeinit actions. -* Check the executed Kubeinit actions. -* Run Kubeinit actions. - -## How to contribute - -This dashboard is located at [github.com/kubeinit/kubeinit](github.com/kubeinit/kubeinit). -Any pull request of issue report is welcomed. - -## Running the Kubeinit Web interface as standalone. - -The Kubeinit web interface can be used as a Kubernetes dashboard -to display the current state of your deployment. - -**The Kubeinit UI is currently under heavy development** - -In the case you are not using Kubeinit as your fault -injection platform you can still use this web UI -following the next steps. - -```bash -git clone git@github.com:kubeinit/kubeinit.git -cd kubeinit/ui -python3 -m pip install -r requirements.txt -export FLASK_APP=run.py -# Set up the DEBUG environment -#export FLASK_ENV=development -flask run --host=0.0.0.0 --port=3000 -``` - -This will start the web interface and -show the Kubernetes cluster status. - -You need to run the Flask server from -a machine with access to the cluster. diff --git a/ui/app/__init__.py b/ui/app/__init__.py deleted file mode 100755 index 4cc54f3c7..000000000 --- a/ui/app/__init__.py +++ /dev/null @@ -1,157 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -import os -import re -from importlib import import_module -from logging import ERROR, basicConfig, getLogger -from os import path - -from flask import Flask, url_for - -from models import db - -# from flask_login import LoginManager - -app = Flask(__name__, static_folder='base/static') - - -def register_blueprints(app): - """ - Register the blueprints. - - This method will register the blueprints - """ - pattern = re.compile("^([a-z]+)+$") - - to_register = [] - for module_name in next(os.walk('./app'))[1]: - if (pattern.match(module_name)): - to_register.append(module_name) - - for module_name in to_register: - print("Registering: %s" % (module_name)) - module = import_module('app.{}.routes'.format(module_name)) - app.register_blueprint(module.blueprint) - if module_name == "run": - print("asdf") - print(dir(module.blueprint)) - - -def configure_logs(app): - """ - Configure logs. - - This method will return the logger - """ - # soft logging - try: - # TODO:FIXME:CCAMACHO - # Having the logger in the console will make it explode - basicConfig(filename='error.log', level=ERROR) - logger = getLogger() - logger.disabled = True - # logger.addHandler(StreamHandler()) - except Exception: - pass - - -def apply_themes(app): - """ - Add support for themes. - - If DEFAULT_THEME is set then all calls to - url_for('static', filename='') - will modfify the url to include the theme name - - The theme parameter can be set directly in url_for as well: - ex. url_for('static', filename='', theme='') - - If the file cannot be found in the /static// location then - the url will not be modified and the file is expected to be - in the default /static/ location - """ - @app.context_processor - def override_url_for(): - """ - Override the URL. - - This method will override the URLs - """ - return dict(url_for=_generate_url_for_theme) - - def _generate_url_for_theme(endpoint, **values): - """ - Generate the URLs. - - This method will generate the URLs - """ - if endpoint.endswith('static'): - themename = values.get('theme', None) or \ - app.config.get('DEFAULT_THEME', None) - if themename: - theme_file = "{}/{}".format(themename, - values.get('filename', '')) - if path.isfile(path.join(app.static_folder, theme_file)): - values['filename'] = theme_file - return url_for(endpoint, **values) - - -def render_menu(): - """Render the menu.""" - # We only support tree main categories - pattern = re.compile("^([a-z]+)+$") - to_render = [] - for module_name in next(os.walk('./app'))[1]: - if (pattern.match(module_name) and module_name != 'home' and module_name != 'base'): - to_render.append(module_name) - menu = [[], [], []] - for module_name in to_render: - module = import_module('app.{}'.format(module_name)) - item = {'position': module.get_position(), - 'category': module.get_category(), - 'name': module.get_name(), - 'icon': module.get_icon(), - 'endpoint': module.get_endpoint(), - } - menu[item['category']].append(item) - - cat0 = sorted(menu[0], key=lambda k: k['position'], reverse=False) - cat1 = sorted(menu[1], key=lambda k: k['position'], reverse=False) - cat2 = sorted(menu[2], key=lambda k: k['position'], reverse=False) - - return [cat0, cat1, cat2] - - -def create_app(config, selenium=False): - """ - Create the app. - - This method will create the app - """ - # app = Flask(__name__, static_folder='base/static') - app.config.from_object(config) - if selenium: - app.config['LOGIN_DISABLED'] = True - configure_logs(app) - apply_themes(app) - register_blueprints(app) - app.jinja_env.globals.update(render_menu=render_menu) - db.init_app(app) - - return app diff --git a/ui/app/available/__init__.py b/ui/app/available/__init__.py deleted file mode 100755 index ce3bbb658..000000000 --- a/ui/app/available/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask import Blueprint - -blueprint = Blueprint( - 'available_blueprint', - __name__, - url_prefix='/available', - template_folder='templates', - static_folder='static' -) - - -def get_position(): - """Get the position.""" - return 1 - - -def get_category(): - """Get the category.""" - return 1 - - -def get_name(): - """Get the name.""" - return "Available" - - -def get_icon(): - """Get the icon.""" - return "fa-check-square" - - -def get_endpoint(): - """Get the endpoint.""" - return "available_blueprint.available" diff --git a/ui/app/available/routes.py b/ui/app/available/routes.py deleted file mode 100755 index 45de1e4ac..000000000 --- a/ui/app/available/routes.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -# import os - -import app -from app import version as kubeinit_ui_version -from app.available import blueprint -from app.base.allocated import compute_allocated_resources -# from app.base.hexa import hexagons_data -from app.base.k8sclient import (cluster_name_configured) -# state_namespaces, -# state_nodes, -# state_pods) - -from flask import current_app, redirect, render_template, request, url_for - -from google.cloud import firestore - -from jinja2 import TemplateNotFound - -from pystol.lister import show_actions - -# from flask_login import (current_user, -# login_required, -# login_user, -# logout_user) - -KUBEINIT_VERSION = kubeinit_ui_version.__version__ - -# -# Begin authentication -# -try: - from app.auth.routes import get_session_data - from app.auth.util import remote_cluster -except ImportError: - print("Module not available") - -try: - fdb = firestore.Client() - transaction = fdb.transaction() -except Exception as e: - print("Cant connect to firestore: %s" % (e)) -# -# End authentication -# - - -@blueprint.route('/') -def available(): - """ - Render all the templates not from base. - - This is a main method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, - session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - if 'kubeconfig' not in session or session['kubeconfig'] is None or session['kubeconfig'] == '': - kubeconfig = None - api_client = None - else: - kubeconfig = session['kubeconfig'] - api_client = remote_cluster(kubeconfig=kubeconfig) - - if ('username' not in session or - session['username'] is None or - session['username'] == '' or - 'email' not in session or - session['email'] is None or - session['email'] == ''): - - username = None - email = None - else: - username = session['username'] - email = session['email'] - - try: - return render_template('available.html', - username=username, email=email, - show_actions=show_actions(), - compute_allocated_resources=compute_allocated_resources( - api_client=api_client), - cluster_name_configured=cluster_name_configured( - api_client=api_client), - kubeinit_version=KUBEINIT_VERSION,) - - except TemplateNotFound: - return render_template('page-404.html'), 404 - except Exception as e: - print("Exception found in %s: %s" % (blueprint.name, e)) - if current_app.config['DEBUG']: - raise e - return render_template('page-500.html'), 500 diff --git a/ui/app/available/templates/available.html b/ui/app/available/templates/available.html deleted file mode 100755 index 0f5cf07fb..000000000 --- a/ui/app/available/templates/available.html +++ /dev/null @@ -1,68 +0,0 @@ -{% extends "base-site.html" %} - -{% block title %} Available {% endblock %} - -{% block content %} - -
-
-
- -
-
-
Pystol's available actions
-
- - - - - - - - - - {% for action in show_actions %} - - - - - - {% endfor %} - -
NameDescriptionDocumentation
{{ action.name }}{{ action.description }}{{ action.documentation }}
- -
-
-
License
-
{{ show_actions[0].license }}
-
Version
-
{{ show_actions[0].version }}
-
Repository
-
{{ show_actions[0].repository }}
-
-
-
-
-
- -
- -
-
- -{% endblock content %} - -{% block javascripts %} - - - - - - - - -{% endblock javascripts %} diff --git a/ui/app/base/__init__.py b/ui/app/base/__init__.py deleted file mode 100755 index 3c10f711e..000000000 --- a/ui/app/base/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask import Blueprint - -blueprint = Blueprint( - 'base_blueprint', - __name__, - url_prefix='', - template_folder='templates', - static_folder='static' -) diff --git a/ui/app/base/allocated.py b/ui/app/base/allocated.py deleted file mode 100755 index 245fda45c..000000000 --- a/ui/app/base/allocated.py +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -from collections import defaultdict -# from types import SimpleNamespace - -# from app import app - -# from flask import Flask, redirect, render_template, request, url_for - -import kubernetes - -from pint import UnitRegistry - -from pystol.operator import load_kubernetes_config - - -ureg = UnitRegistry() -# Pod -ureg.define("pods = 1 = [pods]") - -# Mem -ureg.define("kmemunits = 1 = [kmemunits]") -ureg.define("Ki = 1024 * kmemunits") -ureg.define("Mi = Ki^2") -ureg.define("Gi = Ki^3") -ureg.define("Ti = Ki^4") -ureg.define("Pi = Ki^5") -ureg.define("Ei = Ki^6") -# CPU -ureg.define("kcpuunits = 1 = [kcpuunits]") -ureg.define("m = 1/1000 * kcpuunits") -ureg.define("k = 1000 * kcpuunits") -ureg.define("M = k^2") -ureg.define("G = k^3") -ureg.define("T = k^4") -ureg.define("P = k^5") -ureg.define("E = k^6") - -Q_ = ureg.Quantity - - -def compute_allocated_resources(api_client=None): - """ - Get the allocated resources. - - This will get the cluster resources usage - """ - load_kubernetes_config() - core_v1 = kubernetes.client.CoreV1Api(api_client=api_client) - - s_i = {'pods': {'allocatable': Q_('0 pods'), - 'allocated': Q_('0 pods'), - 'percentage': 0}, - 'cpu': {'allocatable': Q_('0 m'), - 'allocated': Q_('0 m'), - 'percentage': 0}, - 'mem': {'allocatable': Q_('0 Ki'), - 'allocated': Q_('0 Ki'), - 'percentage': 0}, - 'storage': {'allocatable': Q_('0 Ki'), - 'allocated': Q_('0 Ki'), - 'percentage': 0}} - - try: - nodes_list = core_v1.list_node().items - except Exception as e: - print("Something bad happened: %s" % (e)) - return {'pods': {'allocatable': Q_('0 pods'), - 'allocated': Q_('0 pods'), - 'percentage': 0}, - 'cpu': {'allocatable': Q_('0 m'), - 'allocated': Q_('0 m'), - 'percentage': 0}, - 'mem': {'allocatable': Q_('0 Ki'), - 'allocated': Q_('0 Ki'), - 'percentage': 0}, - 'storage': {'allocatable': Q_('0 Ki'), - 'allocated': Q_('0 Ki'), - 'percentage': 0}} - - for node in nodes_list: - node_name = node.metadata.name - node_stats = compute_node_resources( - node_name=node_name, api_client=api_client) - - s_i['pods']['allocatable'] = (s_i['pods']['allocatable'] + - node_stats['pods']['allocatable']) - - s_i['pods']['allocated'] = (s_i['pods']['allocated'] + - node_stats['pods']['allocated']) - - s_i['cpu']['allocatable'] = (s_i['cpu']['allocatable'] + - node_stats['cpu']['allocatable']) - - s_i['cpu']['allocated'] = (s_i['cpu']['allocated'] + - node_stats['cpu']['allocated']) - - s_i['mem']['allocatable'] = (s_i['mem']['allocatable'] + - node_stats['mem']['allocatable']) - - s_i['mem']['allocated'] = (s_i['mem']['allocated'] + - node_stats['mem']['allocated']) - - s_i['storage']['allocatable'] = (s_i['storage']['allocatable'] + - node_stats['storage']['allocatable']) - - s_i['storage']['allocated'] = (s_i['storage']['allocated'] + - node_stats['storage']['allocated']) - - if int(s_i['pods']['allocatable'].magnitude) == 0: - s_i['pods']['percentage'] = 0 - else: - s_i['pods']['percentage'] = ( - (int(s_i['pods']['allocated'].magnitude) * 100) // - (int(s_i['pods']['allocatable'].magnitude))) - - if int(s_i['cpu']['allocatable'].magnitude) == 0: - s_i['cpu']['percentage'] = 0 - else: - s_i['cpu']['percentage'] = ( - (int(s_i['cpu']['allocated'].magnitude) * 100) // - (int(s_i['cpu']['allocatable'].magnitude))) - - if int(s_i['mem']['allocatable'].magnitude) == 0: - s_i['mem']['percentage'] = 0 - else: - s_i['mem']['percentage'] = ( - (int(s_i['mem']['allocated'].magnitude) * 100) // - (int(s_i['mem']['allocatable'].magnitude))) - - if int(s_i['storage']['allocatable'].magnitude) == 0: - s_i['storage']['percentage'] = 0 - else: - s_i['storage']['percentage'] = ( - (int(s_i['storage']['allocated'].magnitude) * 100) // - (int(s_i['storage']['allocatable'].magnitude))) - - return s_i - - -def compute_node_resources(node_name=None, api_client=None): - """ - Get the node allocated resources. - - This will get the node resources usage - """ - load_kubernetes_config() - core_v1 = kubernetes.client.CoreV1Api(api_client=api_client) - - s_i = {'pods': {'allocatable': Q_('0 pods'), - 'allocated': Q_('0 pods'), - 'percentage': 0}, - 'cpu': {'allocatable': Q_('0 m'), - 'allocated': Q_('0 m'), - 'percentage': 0}, - 'mem': {'allocatable': Q_('0 Ki'), - 'allocated': Q_('0 Ki'), - 'percentage': 0}, - 'storage': {'allocatable': Q_('0 Ki'), - 'allocated': Q_('0 Ki'), - 'percentage': 0}} - - field_selector = ("metadata.name=" + node_name) - - try: - node = core_v1.list_node( - field_selector=field_selector).items[0] - except Exception as e: - print("Something bad happened: %s" % (e)) - - node_name = node.metadata.name - allocatable = node.status.allocatable - max_pods = int(int(allocatable["pods"]) * 1.5) - - field_selector = ("status.phase!=Succeeded,status.phase!=Failed," + - "spec.nodeName=" + node_name) - - if 'cpu' in allocatable: - cpu_allocatable = Q_(allocatable["cpu"]) - cpu_allocatable.ito(ureg.m) - s_i["cpu"]["allocatable"] = cpu_allocatable - - if 'memory' in allocatable: - mem_allocatable = Q_(allocatable["memory"]) - mem_allocatable.ito(ureg.Mi) - s_i["mem"]["allocatable"] = mem_allocatable - - if 'ephemeral-storage' in allocatable: - storage_allocatable = Q_(allocatable["ephemeral-storage"]) - storage_allocatable.ito(ureg.Mi) - s_i["storage"]["allocatable"] = storage_allocatable - - s_i["pods"]["allocatable"] = max_pods * ureg.pods - - pods = core_v1.list_pod_for_all_namespaces(limit=max_pods, - field_selector=field_selector).items - - s_i["pods"]["allocated"] = len(pods) * ureg.pods - - # compute the allocated resources - cpureqs, memreqs, storagereqs = [], [], [] - # cpulmts, memlmts, storagelmts = [], [], [] - - for pod in pods: - for container in pod.spec.containers: - res = container.resources - reqs = defaultdict(lambda: 0, res.requests or {}) - # lmts = defaultdict(lambda: 0, res.limits or {}) - - cpureqs.append(Q_(reqs["cpu"])) - memreqs.append(Q_(reqs["memory"])) - storagereqs.append(Q_(reqs["ephemeral-storage"])) - - # cpulmts.append(Q_(lmts["cpu"])) - # memlmts.append(Q_(lmts["memory"])) - # storagelmts.append(Q_(lmts["ephemeral-storage"])) - - cpu_allocated = sum(cpureqs) - cpu_allocated.ito(ureg.m) - s_i["cpu"]["allocated"] = cpu_allocated - - mem_allocated = sum(memreqs) - mem_allocated.ito(ureg.Mi) - s_i["mem"]["allocated"] = mem_allocated - - storage_allocated = sum(storagereqs) - storage_allocated.ito(ureg.Mi) - s_i["storage"]["allocated"] = storage_allocated - - if int(s_i['pods']['allocatable'].magnitude) == 0: - s_i['pods']['percentage'] = 0 - else: - s_i['pods']['percentage'] = ( - (int(s_i['pods']['allocated'].magnitude) * 100) // - (int(s_i['pods']['allocatable'].magnitude))) - - if int(s_i['cpu']['allocatable'].magnitude) == 0: - s_i['cpu']['percentage'] = 0 - else: - s_i['cpu']['percentage'] = ( - (int(s_i['cpu']['allocated'].magnitude) * 100) // - (int(s_i['cpu']['allocatable'].magnitude))) - - if int(s_i['mem']['allocatable'].magnitude) == 0: - s_i['mem']['percentage'] = 0 - else: - s_i['mem']['percentage'] = ( - (int(s_i['mem']['allocated'].magnitude) * 100) // - (int(s_i['mem']['allocatable'].magnitude))) - - if int(s_i['storage']['allocatable'].magnitude) == 0: - s_i['storage']['percentage'] = 0 - else: - s_i['storage']['percentage'] = ( - (int(s_i['storage']['allocated'].magnitude) * 100) // - (int(s_i['storage']['allocatable'].magnitude))) - - return s_i diff --git a/ui/app/base/hexa.py b/ui/app/base/hexa.py deleted file mode 100755 index 037102762..000000000 --- a/ui/app/base/hexa.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -from app.base.allocated import compute_node_resources - -# from flask import redirect, render_template, request, url_for, session - -import kubernetes - -from pystol.operator import load_kubernetes_config - - -def hexagons_data(api_client=None): - """ - Get the hexagons data for the index. - - This method fetch the data for the index - """ - hexa_data = [] - - load_kubernetes_config() - - core_v1 = kubernetes.client.CoreV1Api(api_client=api_client) - try: - nodes_list = core_v1.list_node().items - except Exception: - print("Error listing nodes") - nodes_list = [] - - for node in nodes_list: - node_name = node.metadata.name - node_labels = node.metadata.labels - if "node-role.kubernetes.io/master" in node_labels: - if node_labels['node-role.kubernetes.io/master'] == 'true': - node_role = "Master" - else: - node_role = "Non master" - else: - node_role = "Non master" - - allocatable = node.status.allocatable - node_info = node.status.node_info - - hdata = {} - hdata['name'] = node_name - hdata['role'] = node_role - hdata['cpu'] = allocatable["cpu"] - if 'ephemeral-storage' in allocatable: - hdata['ephstorage'] = allocatable["ephemeral-storage"] - else: - hdata['ephstorage'] = 0 - hdata['mem'] = allocatable["memory"] - hdata['maxpods'] = allocatable["pods"] - - hdata['arch'] = node_info.architecture - hdata['crver'] = node_info.container_runtime_version - hdata['kernelver'] = node_info.kernel_version - hdata['kubeproxyver'] = node_info.kube_proxy_version - hdata['kubeletver'] = node_info.kubelet_version - hdata['os'] = node_info.operating_system - - state_info = compute_node_resources( - node_name=node_name, api_client=api_client) - hdata['state_info'] = state_info - max_pods = int(int(allocatable["pods"]) * 1.5) - field_selector = ("spec.nodeName=" + node_name) - pods = core_v1.list_pod_for_all_namespaces(limit=max_pods, - field_selector=field_selector).items - hdata['pods'] = [] - for pod in pods: - hdata['pods'].append({'name': pod.metadata.name, - 'namespace': pod.metadata.namespace, - 'host_ip': pod.status.host_ip, - 'pod_ip': pod.status.pod_ip, - 'phase': pod.status.phase}) - hexa_data.append(hdata) - return hexa_data diff --git a/ui/app/base/k8s.py b/ui/app/base/k8s.py deleted file mode 100755 index 50328cf60..000000000 --- a/ui/app/base/k8s.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" -# import tempfile -# import json -# import os -# import sys -# import urllib -# import yaml - -# from flask import Flask, redirect, render_template, request, url_for - -import kubernetes -# from kubernetes import client -# from kubernetes.client import Configuration -# from kubernetes.config import kube_config - -from pystol.operator import load_kubernetes_config - -PYSTOL_BRANCH = "master" - -# -# We load the Kubernetes cluster config depending -# where we execute the operator from. -# - - -def state_cluster(api_client=None): - """ - List component of cluster. - - This is a main component of the input for the controller - """ - load_kubernetes_config() - api = kubernetes.client.CustomObjectsApi(api_client=api_client) - - group = "kubeinit.org" - version = "v1alpha1" - namespace = "pystol" - plural = "pystolactions" - pretty = 'true' - - ret = [] - try: - resp = api.list_namespaced_custom_object(group=group, - version=version, - namespace=namespace, - plural=plural, - pretty=pretty) - for action in resp['items']: - ret.append({'name': - action['metadata']['name'], - 'creationTimestamp': - action['metadata']['creationTimestamp'], - 'action_state': - action['spec']['action_state'], - 'workflow_state': - action['spec']['workflow_state']}) - except Exception: - print("No objects found...") - return ret diff --git a/ui/app/base/k8sclient.py b/ui/app/base/k8sclient.py deleted file mode 100755 index 90b758fa2..000000000 --- a/ui/app/base/k8sclient.py +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -import subprocess -# from flask import redirect, render_template, request, url_for -from urllib.parse import urlparse - -import kubernetes - -from pystol.operator import load_kubernetes_config - -import yaml - - -def state_cluster(): - """ - Return useless code. - - This returns useless code - """ - ret = [] - return ret - - -def state_nodes(api_client=None): - """ - Return nodes. - - This returns the nodes names - """ - datanodes = [] - - try: - - load_kubernetes_config() - - core_v1 = kubernetes.client.CoreV1Api(api_client=api_client) - nodes = core_v1.list_node().items - except Exception as e: - print("Cant connect to the cluster: %s" % (e)) - return [] - - for node in nodes: - datanodes.append({'name': node.metadata.name, - 'status': node.status.phase}) - return datanodes - - -def state_namespaces(api_client=None): - """ - Return namespaces. - - This returns some namespace data - """ - datanamespaces = [] - - try: - load_kubernetes_config() - core_v1 = kubernetes.client.CoreV1Api(api_client=api_client) - namespaces = core_v1.list_namespace().items - except Exception as e: - print("Cant connect to the cluster: %s" % (e)) - return [] - - for namespace in namespaces: - datanamespaces.append({'name': namespace.metadata.name, - 'status': namespace.status.phase}) - return datanamespaces - - -def state_pods(api_client=None): - """ - Return pods. - - This returns some pod data - """ - data_pods = [] - - try: - - load_kubernetes_config() - core_v1 = kubernetes.client.CoreV1Api(api_client=api_client) - pods = core_v1.list_pod_for_all_namespaces().items - except Exception as e: - print("Cant connect to the cluster: %s" % (e)) - return [] - - for pod in pods: - data_pods.append({'name': pod.metadata.name, - 'namespace': pod.metadata.namespace, - 'host_ip': pod.status.host_ip, - 'pod_ip': pod.status.pod_ip, - 'phase': pod.status.phase}) - - return data_pods - - -def web_terminal(): - """ - Get pods. - - This is useless code - """ - ret = [] - command = 'kubectl get po --all-namespaces' - output = subprocess.check_output(command, - stderr=subprocess.STDOUT, - shell=True) - ret.append(output.decode('utf-8')) - return ret - - -def cluster_name_configured(api_client=None): - """ - Get the current cluster name. - - This method should return the cluster name - """ - cluster_name = "Not found" - - load_kubernetes_config() - core_v1 = kubernetes.client.CoreV1Api(api_client=api_client) - - try: - # OpenShift case - cd = core_v1.read_namespaced_config_map(name='cluster-config-v1', - namespace='kube-system', - pretty='true') - if cd: - # This will have a big yaml file - # we need to convert to a dict - raw = cd.data["install-config"] - # We get the YAML from the data field of the configmap - # And fetch the value we need - cluster_name = yaml.safe_load(raw)["metadata"]["name"] - print("Cluster name computed from OpenShift case") - return cluster_name - except Exception: - print("Cant find clustername for OpenShift case") - - try: - if api_client.configuration.host is not None: - return urlparse(api_client.configuration.host).hostname - except Exception: - print("Cant find the clustername in the config object") - - # If we dont manage to find it we fall back to the CLI as a last resource - try: - command = 'kubectl config view -o jsonpath="{.clusters[].name}"' - output = subprocess.check_output(command, - stderr=subprocess.STDOUT, - shell=True) - print(output) - return output.decode('utf-8') - except Exception: - print("Cant find the clustername at all") - return cluster_name diff --git a/ui/app/base/routes.py b/ui/app/base/routes.py deleted file mode 100755 index a3da2b9d3..000000000 --- a/ui/app/base/routes.py +++ /dev/null @@ -1,437 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -from datetime import date - -import app -from app import version as kubeinit_ui_version -from app.base import blueprint -from app.base.k8sclient import (cluster_name_configured, - state_namespaces, - state_nodes, - state_pods, - web_terminal) - -from flask import jsonify, redirect, render_template, request, url_for - -from google.cloud import firestore - -# , session - -# from flask_login import (current_user, -# login_required, -# login_user, -# logout_user) - -from models import DataCenter, db - -from pystol.lister import list_actions, show_actions - -KUBEINIT_VERSION = kubeinit_ui_version.__version__ - -# -# Begin authentication -# -try: - from app.auth.routes import get_session_data -# from app.auth.util import remote_cluster -except ImportError: - print("Module not available") - -try: - fdb = firestore.Client() - transaction = fdb.transaction() -except Exception as e: - print("Cant connect to firestore: %s" % (e)) -# -# End authentication -# - - -@blueprint.route('/error-') -def route_errors(error): - """ - Define a route. - - This is a main routing method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - return render_template('errors/{}.html'.format(error)) - - -# API endpoints -@blueprint.route('/api/v1/ListActions', methods=['GET']) -def api_list_actions(): - """ - Define a route. - - This is a main routing method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - return jsonify(list_actions()) - - -@blueprint.route('/api/v1/ShowActions', methods=['GET']) -def api_show_actions(): - """ - Define a route. - - This is a main routing method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - return jsonify(show_actions()) - - -@blueprint.route('/api/v1/StateNamespaces', methods=['GET']) -def api_state_namespaces(): - """ - Define a route. - - This is a main routing method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - return jsonify(state_namespaces()) - - -@blueprint.route('/api/v1/StateNodes', methods=['GET']) -def api_state_nodes(): - """ - Define a route. - - This is a main routing method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - return jsonify(state_nodes()) - - -@blueprint.route('/api/v1/StatePods', methods=['GET']) -def api_state_pods(): - """ - Define a route. - - This is a main routing method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - return jsonify(state_pods()) - - -@blueprint.route('/api/v1/Terminal', methods=['GET']) -def api_web_terminal(): - """ - Define a route. - - This is a main routing method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - return jsonify(web_terminal()) - - -@blueprint.route('/api/v1/ClusterName', methods=['GET']) -def api_cluster_name_configured(): - """ - Define a route. - - This is a main routing method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - return jsonify(cluster_name_configured()) - - -@blueprint.route('/shutdown') -def shutdown(): - """ - Define a route. - - This is a main routing method - """ - func = request.environ.get('werkzeug.server.shutdown') - if func is None: - raise RuntimeError('Not running with the Werkzeug Server') - func() - return 'Server shutting down...' - - -@blueprint.errorhandler(404) -def not_found_error(error): - """ - Define a route. - - This is a main routing method - """ - return render_template('page-404.html', - template_folder="../home/templates/"), 404 - - -@blueprint.errorhandler(404) -def internal_error(error): - """ - Define a route. - - This is a main routing method - """ - return render_template('page-500.html', - template_folder="../home/templates/"), 500 - - -@blueprint.route('/api/v1/DataCenters', methods=['GET']) -def get_datacenters(): - """ - Define a route. - - This is a main routing method for getting the datacenters - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - print("------ Get DataCenters ------") - return jsonify(DataCenter.query.all()) - # return jsonify({'hola':'mundo'}) - - -@blueprint.route('/api/v1/AddDataCenter', methods=['GET']) -def add_datacenters(): - """ - Define a route. - - This is a main routing method for getting the datacenters - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - cluster_1 = DataCenter(availability_zone='john', - airport_name='john', - name='john', - created=date.today(), - location='john') - - db.session.add(cluster_1) - db.session.commit() - - print("------ Get DataCenters ------") - dc = DataCenter.query.all() - print(dc) - # return jsonify(DataCenter.query.all()) - return jsonify({'hola': 'mundo'}) - - -# Errors -# @login_manager.unauthorized_handler -# def unauthorized_handler(): -# """ -# Define a route. -# -# This is a main routing method -# """ -# return render_template('page-403.html', -# template_folder="../home/templates/"), 403 - - -# @blueprint.errorhandler(403) -# def access_forbidden(error): -# """ -# Define a route. -# -# This is a main routing method -# """ -# return render_template('page-403.html', -# template_folder="../home/templates/"), 403 diff --git a/ui/app/base/static/assets/brand/bg.jpg b/ui/app/base/static/assets/brand/bg.jpg deleted file mode 100755 index 1b9283212..000000000 Binary files a/ui/app/base/static/assets/brand/bg.jpg and /dev/null differ diff --git a/ui/app/base/static/assets/brand/pystol-base.svg b/ui/app/base/static/assets/brand/pystol-base.svg deleted file mode 100755 index 608dc4e48..000000000 --- a/ui/app/base/static/assets/brand/pystol-base.svg +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/brand/pystol_compact.svg b/ui/app/base/static/assets/brand/pystol_compact.svg deleted file mode 100755 index d2faf9217..000000000 --- a/ui/app/base/static/assets/brand/pystol_compact.svg +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/brand/pystol_full.svg b/ui/app/base/static/assets/brand/pystol_full.svg deleted file mode 100755 index 7b57a96f9..000000000 --- a/ui/app/base/static/assets/brand/pystol_full.svg +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/brand/pystol_full_big.svg b/ui/app/base/static/assets/brand/pystol_full_big.svg deleted file mode 100755 index d15701624..000000000 --- a/ui/app/base/static/assets/brand/pystol_full_big.svg +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/brand/pystol_icon.svg b/ui/app/base/static/assets/brand/pystol_icon.svg deleted file mode 100755 index 2f145f147..000000000 --- a/ui/app/base/static/assets/brand/pystol_icon.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/ui/app/base/static/assets/css/honeycombs.css b/ui/app/base/static/assets/css/honeycombs.css deleted file mode 100755 index 018e93eb0..000000000 --- a/ui/app/base/static/assets/css/honeycombs.css +++ /dev/null @@ -1,178 +0,0 @@ -.honeycombs{ - position: relative; - overflow: hidden; - width: 100%; - text-align: center; - -} - -.honeycombs * { - box-sizing: border-box; -} - -.honeycombs .honeycombs-inner-wrapper{ - display: inline-block; - overflow: hidden; - width: 700px; - position: relative; - height: 1200px; -} - -.honeycombs .comb{ - position: absolute; - display: inline-block; - cursor: pointer; -} - -.comb .icon-hex-lg { - color: #FF9000; -} - -.comb.pending .icon-hex-lg { - color: #0066FF; -} - -.comb.running .icon-hex-lg { - color: #009966; -} - -.comb.succeeded .icon-hex-lg { - color: #FF9000; -} - -.comb.failed .icon-hex-lg { - color: #FF3333; -} - -.comb.unknown .icon-hex-lg { - color: #C0C0C0; -} - -.comb.placeholder{ - cursor: default; -} - -.comb span.firefox { - left: 0; - position: absolute; - top: 20px; - z-index: -1; -} - - -.comb.placeholder span { - color: #FFF !important; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; - filter: alpha(opacity= 0); - -moz-opacity: 0; - -khtml-opacity: 0; - opacity: 0; -} - -.comb .inner { - height: 100%; - width: 100%; - position: absolute; - display: -webkit-box; - -webkit-box-align: center; - display: flex; - display: -webkit-flex; - -webkit-transition: all 0.3s; - -moz-transition: all 0.3s; - transition: all 0.3s; - -webkit-transform: translateZ(0); - -moz-transform: translateZ(0); - transform: translateZ(0); - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -webkit-perspective: 1000; - backface-visibility: hidden; - -moz-perspective: 1000; - perspective: 1000; -} - -.comb .inner .wrapper { - margin: auto; -} - -.comb .inner.back { - padding: 3.5em; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; - filter: alpha(opacity= 0); - -moz-opacity: 0; - -khtml-opacity: 0; - opacity: 0; - -} - - -.comb:hover > .inner.back{ - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; - filter: alpha(opacity= 100); - -moz-opacity: 1; - -khtml-opacity: 1; - opacity: 1; -} - -.comb:hover > .inner.front { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; - filter: alpha(opacity= 0); - -moz-opacity: 0; - -khtml-opacity: 0; - opacity: 0; -} - -.comb:hover > span { - color: #00AFAE !important; - -} - -.comb.placeholder:hover > span { - color: #fff !important; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; - filter: alpha(opacity= 0); - -moz-opacity: 0; - -khtml-opacity: 0; - opacity: 0; - -} - -.comb .inner p { - font-size: 14px; - line-height: 1.2; - color: white; -} - -.comb .inner.back .wrapper { - width: inherit; - overflow: hidden; -} - -@font-face { - font-family: 'icomoon'; - src:url('https://raw.githubusercontent.com/pystol/pystol-docs/master/assets/fonts/icomoon/icomoon.eot?3d1mhj'); - src:url('https://raw.githubusercontent.com/pystol/pystol-docs/master/assets/fonts/icomoon/icomoon.eot?#iefix3d1mhj') format('embedded-opentype'), - url('https://raw.githubusercontent.com/pystol/pystol-docs/master/assets/fonts/icomoon/icomoon.woff?3d1mhj') format('woff'), - url('https://raw.githubusercontent.com/pystol/pystol-docs/master/assets/fonts/icomoon/icomoon.ttf?3d1mhj') format('truetype'), - url('https://raw.githubusercontent.com/pystol/pystol-docs/master/assets/fonts/icomoon/icomoon.svg?3d1mhj#icomoon') format('svg'); - font-weight: normal; - font-style: normal; -} - -[class^="icon-"], [class*=" icon-"] { - font-family: 'icomoon'; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.icon-hex-lg:before { - content: "\e604"; -} diff --git a/ui/app/base/static/assets/favicon/android-icon-144x144.png b/ui/app/base/static/assets/favicon/android-icon-144x144.png deleted file mode 100755 index ac3ea1b1b..000000000 Binary files a/ui/app/base/static/assets/favicon/android-icon-144x144.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/android-icon-192x192.png b/ui/app/base/static/assets/favicon/android-icon-192x192.png deleted file mode 100755 index dc56ee72c..000000000 Binary files a/ui/app/base/static/assets/favicon/android-icon-192x192.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/android-icon-36x36.png b/ui/app/base/static/assets/favicon/android-icon-36x36.png deleted file mode 100755 index 523637f45..000000000 Binary files a/ui/app/base/static/assets/favicon/android-icon-36x36.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/android-icon-48x48.png b/ui/app/base/static/assets/favicon/android-icon-48x48.png deleted file mode 100755 index 4d7af7f4c..000000000 Binary files a/ui/app/base/static/assets/favicon/android-icon-48x48.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/android-icon-72x72.png b/ui/app/base/static/assets/favicon/android-icon-72x72.png deleted file mode 100755 index ce6beeac2..000000000 Binary files a/ui/app/base/static/assets/favicon/android-icon-72x72.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/android-icon-96x96.png b/ui/app/base/static/assets/favicon/android-icon-96x96.png deleted file mode 100755 index c9db3528c..000000000 Binary files a/ui/app/base/static/assets/favicon/android-icon-96x96.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon-114x114.png b/ui/app/base/static/assets/favicon/apple-icon-114x114.png deleted file mode 100755 index 4a955398a..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon-114x114.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon-120x120.png b/ui/app/base/static/assets/favicon/apple-icon-120x120.png deleted file mode 100755 index 443a90ed2..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon-120x120.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon-144x144.png b/ui/app/base/static/assets/favicon/apple-icon-144x144.png deleted file mode 100755 index ac3ea1b1b..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon-144x144.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon-152x152.png b/ui/app/base/static/assets/favicon/apple-icon-152x152.png deleted file mode 100755 index f5f085723..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon-152x152.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon-180x180.png b/ui/app/base/static/assets/favicon/apple-icon-180x180.png deleted file mode 100755 index 19dd6539d..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon-180x180.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon-57x57.png b/ui/app/base/static/assets/favicon/apple-icon-57x57.png deleted file mode 100755 index 8172868b1..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon-57x57.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon-60x60.png b/ui/app/base/static/assets/favicon/apple-icon-60x60.png deleted file mode 100755 index 6ea43299c..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon-60x60.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon-72x72.png b/ui/app/base/static/assets/favicon/apple-icon-72x72.png deleted file mode 100755 index ce6beeac2..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon-72x72.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon-76x76.png b/ui/app/base/static/assets/favicon/apple-icon-76x76.png deleted file mode 100755 index 3ff407afb..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon-76x76.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon-precomposed.png b/ui/app/base/static/assets/favicon/apple-icon-precomposed.png deleted file mode 100755 index 37f85ab91..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon-precomposed.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/apple-icon.png b/ui/app/base/static/assets/favicon/apple-icon.png deleted file mode 100755 index 37f85ab91..000000000 Binary files a/ui/app/base/static/assets/favicon/apple-icon.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/favicon-16x16.png b/ui/app/base/static/assets/favicon/favicon-16x16.png deleted file mode 100755 index 8a8af2176..000000000 Binary files a/ui/app/base/static/assets/favicon/favicon-16x16.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/favicon-32x32.png b/ui/app/base/static/assets/favicon/favicon-32x32.png deleted file mode 100755 index 4ea7c04e1..000000000 Binary files a/ui/app/base/static/assets/favicon/favicon-32x32.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/favicon-96x96.png b/ui/app/base/static/assets/favicon/favicon-96x96.png deleted file mode 100755 index c9db3528c..000000000 Binary files a/ui/app/base/static/assets/favicon/favicon-96x96.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/ms-icon-144x144.png b/ui/app/base/static/assets/favicon/ms-icon-144x144.png deleted file mode 100755 index ac3ea1b1b..000000000 Binary files a/ui/app/base/static/assets/favicon/ms-icon-144x144.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/ms-icon-150x150.png b/ui/app/base/static/assets/favicon/ms-icon-150x150.png deleted file mode 100755 index 5b55e6af7..000000000 Binary files a/ui/app/base/static/assets/favicon/ms-icon-150x150.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/ms-icon-310x310.png b/ui/app/base/static/assets/favicon/ms-icon-310x310.png deleted file mode 100755 index 3bc0a953b..000000000 Binary files a/ui/app/base/static/assets/favicon/ms-icon-310x310.png and /dev/null differ diff --git a/ui/app/base/static/assets/favicon/ms-icon-70x70.png b/ui/app/base/static/assets/favicon/ms-icon-70x70.png deleted file mode 100755 index b292a89b1..000000000 Binary files a/ui/app/base/static/assets/favicon/ms-icon-70x70.png and /dev/null differ diff --git a/ui/app/base/static/assets/fonts/icomoon.eot b/ui/app/base/static/assets/fonts/icomoon.eot deleted file mode 100755 index 871657a6b..000000000 Binary files a/ui/app/base/static/assets/fonts/icomoon.eot and /dev/null differ diff --git a/ui/app/base/static/assets/fonts/icomoon.svg b/ui/app/base/static/assets/fonts/icomoon.svg deleted file mode 100755 index 4929f6d8c..000000000 --- a/ui/app/base/static/assets/fonts/icomoon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - \ No newline at end of file diff --git a/ui/app/base/static/assets/fonts/icomoon.ttf b/ui/app/base/static/assets/fonts/icomoon.ttf deleted file mode 100755 index 122ce809f..000000000 Binary files a/ui/app/base/static/assets/fonts/icomoon.ttf and /dev/null differ diff --git a/ui/app/base/static/assets/fonts/icomoon.woff b/ui/app/base/static/assets/fonts/icomoon.woff deleted file mode 100755 index f0f1fe8ff..000000000 Binary files a/ui/app/base/static/assets/fonts/icomoon.woff and /dev/null differ diff --git a/ui/app/base/static/assets/graph/cloud.svg b/ui/app/base/static/assets/graph/cloud.svg deleted file mode 100755 index bcdf9c042..000000000 --- a/ui/app/base/static/assets/graph/cloud.svg +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/graph/container.svg b/ui/app/base/static/assets/graph/container.svg deleted file mode 100755 index f88d2dbca..000000000 --- a/ui/app/base/static/assets/graph/container.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/graph/deploy.svg b/ui/app/base/static/assets/graph/deploy.svg deleted file mode 100755 index b11d2085f..000000000 --- a/ui/app/base/static/assets/graph/deploy.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/graph/ing.svg b/ui/app/base/static/assets/graph/ing.svg deleted file mode 100755 index 0dde27514..000000000 --- a/ui/app/base/static/assets/graph/ing.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/graph/master.svg b/ui/app/base/static/assets/graph/master.svg deleted file mode 100755 index 94233bf96..000000000 --- a/ui/app/base/static/assets/graph/master.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/graph/node.svg b/ui/app/base/static/assets/graph/node.svg deleted file mode 100755 index c0f2b8e13..000000000 --- a/ui/app/base/static/assets/graph/node.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/graph/pod.svg b/ui/app/base/static/assets/graph/pod.svg deleted file mode 100755 index bb6147588..000000000 --- a/ui/app/base/static/assets/graph/pod.svg +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/graph/svc.svg b/ui/app/base/static/assets/graph/svc.svg deleted file mode 100755 index 779b61405..000000000 --- a/ui/app/base/static/assets/graph/svc.svg +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/app/base/static/assets/js/jquery.honeycombs.js b/ui/app/base/static/assets/js/jquery.honeycombs.js deleted file mode 100755 index 14a04b1a8..000000000 --- a/ui/app/base/static/assets/js/jquery.honeycombs.js +++ /dev/null @@ -1,175 +0,0 @@ -(function($) { - - $.fn.honeycombs = function(options) { - - // Establish our default settings - var settings = $.extend({ - combWidth: 250, - margin: 0, - threshold: 3 - }, options); - - function initialise(element) { - - $(element).addClass('honeycombs-wrapper'); - - var width = 0; - var combWidth = 0; - var combHeight = 0; - var num = 0; - var $wrapper = null; - - /** - * Build the dom - */ - function buildHtml(){ - // add the 2 other boxes - $(element).find('.comb').wrapAll('
'); - $wrapper = $(element).find('.honeycombs-inner-wrapper'); - - $(element).find('.comb').append('
'); - $(element).find('.comb').append('
'); - $(element).find('.inner').append('
'); - $(element).find('.comb').append(''); - - num = 0; - - $(element).find('.comb').each(function(){ - num = num + 1; - - if($(this).find('.inner').length > 0){ - $(this).find('.inner.front .wrapper').html($(this).find('.front-content').html()); - $(this).find('.inner.back .wrapper').html($(this).find('.back-content').html()); - $(this).find('.front-content').remove(); - $(this).find('.back-content').remove(); - }else{ - $(this).find('.inner').remove(); - }; - }); - - // Fix Firefox padding error - /*ccamacho: FIXME: adding the firefox class breaks the hexagon render*/ - /* - if (navigator.userAgent.search("Firefox") > -1) { - $('.comb span').addClass('firefox'); - } - */ - } - - /** - * Update all scale values - */ - function updateScales(){ - combWidth = settings.combWidth; - combHeight = combWidth; - $(element).find('.comb').width(combWidth).height(combHeight); - $(element).find('.icon-hex-lg').css('font-size', combWidth) - } - - /** - * update css classes - */ - function reorder(animate){ - - updateScales(); - width = $(element).width(); - - newWidth = $('.honeycombs').parent().width(); - - - if(newWidth < width){ - width = newWidth; - } - - $wrapper.width(newWidth); - - var maxLeft = 0; - var row = 0; // current row - var offset = 0; // 1 is down - var left = 1; // pos left - var top = 0; // pos top - var cols = 0; - - var noOffset = function(offset){ - return offset - }; - - var withOffset = function(offset){ - return (offset + 1) % 2; - } - - var halfTop = function(top){ - return ( row * ( 0.5 * combHeight * Math.sqrt(3) + settings.margin) ) - } - - var fullTop = function(top){ - return ( row * (combHeight + settings.margin + combHeight * 0.1)) - } - - function orderCombs(leftHandler, topHandler){ - - $(element).find('.comb').filter(':not(.placeholder.hide)').each(function(index){ - - top = topHandler(top); - - if(animate == true){ - $(this).stop(true, false); - $(this).animate({'left': left, 'top': top}); - }else{ - $(this).css('left', left).css('top', top); - } - - left = left + ( combWidth + settings.margin ); - - if(left > maxLeft) { - maxLeft = left; - } - - - if(row == 0){ - cols = cols + 1; - } - - if(left + combWidth > width){ - row = row + 1; - offset = leftHandler(offset); - left = offset / 2 * ( combWidth + settings.margin ) ; - } - - }); - } - - - if (newWidth < 1.5 * (combWidth + settings.margin)) { - $('.comb.placeholder').addClass('hide'); - - orderCombs(noOffset, fullTop); - } else if (newWidth < settings.threshold * (combWidth + settings.margin)) { - $('.comb.placeholder').addClass('hide'); - orderCombs(withOffset, halfTop); - } else { - $('.comb.placeholder').removeClass('hide'); - orderCombs(withOffset, halfTop); - } - - - $wrapper - .height(top + combHeight) - .width(maxLeft - settings.margin) - } - - $(window).resize(function(){ - reorder(true); - }); - - buildHtml(); - reorder(false); - } - - return this.each(function() { - initialise(this); - }); - - } - -}(jQuery)); diff --git a/ui/app/base/static/assets/vendors/@coreui/css/coreui.min.css b/ui/app/base/static/assets/vendors/@coreui/css/coreui.min.css deleted file mode 100755 index 479c9d15e..000000000 --- a/ui/app/base/static/assets/vendors/@coreui/css/coreui.min.css +++ /dev/null @@ -1,8 +0,0 @@ -@charset "UTF-8";/*! - * CoreUI - HTML, CSS, and JavaScript UI Components Library - * @version v3.2.2 - * @link https://coreui.io/ - * Copyright (c) 2020 creativeLabs Łukasz Holeczek - * License MIT (https://coreui.io/license/) - */:root{--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.c-app,:root{--primary:#321fdb;--secondary:#ced2d8;--success:#2eb85c;--info:#39f;--warning:#f9b115;--danger:#e55353;--light:#ebedef;--dark:#636f83}.c-app{color:#3c4b64;background-color:#ebedef;--color:#3c4b64;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;min-height:100vh}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,21,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;overflow-x:hidden;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:.875rem;font-weight:400;line-height:1.5;text-align:left;color:#3c4b64;background-color:#ebedef;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible;margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,21,.2)}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem}html:not([dir=rtl]) dd{margin-left:0}[dir=rtl] dd{margin-right:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{text-decoration:none;background-color:transparent;color:#321fdb}@media (hover:hover),(-ms-high-contrast:none){a:hover{text-decoration:underline;color:#321fdb}}a:not([href]){color:inherit;text-decoration:none}@media (hover:hover),(-ms-high-contrast:none){a:not([href]):hover{color:inherit;text-decoration:none}}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar;display:block;font-size:87.5%;color:#4f5d73}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#768192;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.ps{overflow:hidden!important;-ms-touch-action:auto;touch-action:auto;-ms-overflow-style:none;overflow-anchor:none}.ps__rail-x{bottom:0;height:15px}.ps__rail-x,.ps__rail-y{position:absolute;display:none;opacity:0;transition:background-color .2s linear,opacity .2s linear}.ps__rail-y{width:15px}html:not([dir=rtl]) .ps__rail-y{right:0}[dir=rtl] .ps__rail-y{left:0}.ps--active-x>.ps__rail-x,.ps--active-y>.ps__rail-y{display:block;background-color:transparent}.ps--focus>.ps__rail-x,.ps--focus>.ps__rail-y,.ps--scrolling-x>.ps__rail-x,.ps--scrolling-y>.ps__rail-y,.ps:hover>.ps__rail-x,.ps:hover>.ps__rail-y{opacity:.6}.ps__rail-x:focus,.ps__rail-x:hover,.ps__rail-y:focus,.ps__rail-y:hover{background-color:#eee;opacity:.9}.ps__thumb-x{bottom:2px;height:6px;transition:background-color .2s linear,height .2s ease-in-out}.ps__thumb-x,.ps__thumb-y{position:absolute;background-color:#aaa;border-radius:6px}.ps__thumb-y{width:6px;transition:background-color .2s linear,width .2s ease-in-out}html:not([dir=rtl]) .ps__thumb-y{right:2px}[dir=rtl] .ps__thumb-y{left:2px}.ps__rail-x:focus>.ps__thumb-x,.ps__rail-x:hover>.ps__thumb-x{height:11px;background-color:#999}.ps__rail-y:focus>.ps__thumb-y,.ps__rail-y:hover>.ps__thumb-y{width:11px;background-color:#999}@supports (-ms-overflow-style:none){.ps{overflow:auto!important}}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.ps{overflow:auto!important}}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}.tippy-box[data-theme~=cpopover]{z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.765625rem;word-wrap:break-word;background-clip:padding-box;border:1px solid;border-radius:.3rem;background-color:#fff;border-color:rgba(0,0,21,.2)}.tippy-box[data-theme~=cpopover]>.tippy-content{max-width:auto;padding:0;color:initial;text-align:initial;background-color:initial;border-radius:initial}.tippy-box[data-theme~=cpopover]>.tippy-arrow{position:absolute;display:block;color:transparent}.tippy-box[data-theme~=cpopover]>.tippy-arrow::after,.tippy-box[data-theme~=cpopover]>.tippy-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.tippy-box[data-theme~=cpopover][data-placement^=bottom]>.tippy-arrow,.tippy-box[data-theme~=cpopover][data-placement^=top]>.tippy-arrow{width:1.6rem;height:.5rem;padding:0 .3rem}.tippy-box[data-theme~=cpopover][data-placement^=bottom]>.tippy-arrow::before,.tippy-box[data-theme~=cpopover][data-placement^=top]>.tippy-arrow::before{left:auto}.tippy-box[data-theme~=cpopover][data-placement^=left]>.tippy-arrow,.tippy-box[data-theme~=cpopover][data-placement^=right]>.tippy-arrow{width:.5rem;height:1.6rem;padding:.3rem 0;margin:0}.tippy-box[data-theme~=cpopover][data-placement^=top]>.tippy-arrow{bottom:calc(-.5rem - 1px)}.tippy-box[data-theme~=cpopover][data-placement^=top]>.tippy-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,21,.25)}.tippy-box[data-theme~=cpopover][data-placement^=top]>.tippy-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.tippy-box[data-theme~=cpopover][data-placement^=bottom]>.tippy-arrow{top:calc(-.5rem - 1px)}.tippy-box[data-theme~=cpopover][data-placement^=bottom]>.tippy-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,21,.25)}.tippy-box[data-theme~=cpopover][data-placement^=bottom]>.tippy-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.tippy-box[data-theme~=cpopover][data-placement^=left]>.tippy-arrow{right:calc(-.5rem - 1px)}.tippy-box[data-theme~=cpopover][data-placement^=left]>.tippy-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,21,.25)}.tippy-box[data-theme~=cpopover][data-placement^=left]>.tippy-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.tippy-box[data-theme~=cpopover][data-placement^=right]>.tippy-arrow{left:calc(-.5rem - 1px)}.tippy-box[data-theme~=cpopover][data-placement^=right]>.tippy-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,21,.25)}.tippy-box[data-theme~=cpopover][data-placement^=right]>.tippy-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.tippy-iOS{cursor:pointer!important;-webkit-tap-highlight-color:transparent}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.765625rem;word-wrap:break-word;outline:0;transition-property:visibility,opacity,-webkit-transform;transition-property:transform,visibility,opacity;transition-property:transform,visibility,opacity,-webkit-transform}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow::before{bottom:-.4rem;left:0;border-width:.4rem .4rem 0;border-top-color:initial}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow::before{top:-.4rem;left:0;border-width:0 .4rem .4rem;border-bottom-color:initial}.tippy-box[data-placement^=left]>.tippy-arrow{right:0;width:.4rem;height:.8rem}.tippy-box[data-placement^=left]>.tippy-arrow::before{right:-.4rem;border-width:.4rem 0 .4rem .4rem;border-left-color:initial}.tippy-box[data-placement^=right]>.tippy-arrow{left:0;width:.4rem;height:.8rem}.tippy-box[data-placement^=right]>.tippy-arrow::before{left:-.4rem;border-width:.4rem .4rem .4rem 0;border-right-color:initial}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:.8rem;height:.4rem;color:#000015}.tippy-arrow,.tippy-arrow::before{position:absolute;display:block}.tippy-arrow::before{content:"";border-color:transparent;border-style:solid}.tippy-content{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000015;border-radius:.25rem}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}html:not([dir=rtl]) .alert-dismissible{padding-right:3.8125rem}[dir=rtl] .alert-dismissible{padding-left:3.8125rem}.alert-dismissible .close{position:absolute;top:0;padding:.75rem 1.25rem;color:inherit}html:not([dir=rtl]) .alert-dismissible .close{right:0}[dir=rtl] .alert-dismissible .close{left:0}.alert-primary{color:#1a107c;background-color:#d6d2f8;border-color:#c6c0f5}.alert-primary hr{border-top-color:#b2aaf2}.alert-primary .alert-link{color:#110a4f}.alert-secondary{color:#6b6d7a;background-color:#f5f6f7;border-color:#f1f2f4}.alert-secondary hr{border-top-color:#e3e5e9}.alert-secondary .alert-link{color:#53555f}.alert-success{color:#18603a;background-color:#d5f1de;border-color:#c4ebd1}.alert-success hr{border-top-color:#b1e5c2}.alert-success .alert-link{color:#0e3721}.alert-info{color:#1b508f;background-color:#d6ebff;border-color:#c6e2ff}.alert-info hr{border-top-color:#add5ff}.alert-info .alert-link{color:#133864}.alert-warning{color:#815c15;background-color:#feefd0;border-color:#fde9bd}.alert-warning hr{border-top-color:#fce1a4}.alert-warning .alert-link{color:#553d0e}.alert-danger{color:#772b35;background-color:#fadddd;border-color:#f8cfcf}.alert-danger hr{border-top-color:#f5b9b9}.alert-danger .alert-link{color:#521d24}.alert-light{color:#7a7b86;background-color:#fbfbfc;border-color:#f9fafb}.alert-light hr{border-top-color:#eaedf1}.alert-light .alert-link{color:#62626b}.alert-dark{color:#333a4e;background-color:#e0e2e6;border-color:#d3d7dc}.alert-dark hr{border-top-color:#c5cad1}.alert-dark .alert-link{color:#1f232f}.c-avatar{position:relative;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;border-radius:50em;width:36px;height:36px;font-size:14.4px}.c-avatar .c-avatar-status{width:10px;height:10px}.c-avatar-img{width:100%;height:auto;border-radius:50em}.c-avatar-status{position:absolute;bottom:0;display:block;border:1px solid #fff;border-radius:50em}html:not([dir=rtl]) .c-avatar-status{right:0}[dir=rtl] .c-avatar-status{left:0}.c-avatar-sm{width:24px;height:24px;font-size:9.6px}.c-avatar-sm .c-avatar-status{width:8px;height:8px}.c-avatar-lg{width:48px;height:48px;font-size:19.2px}.c-avatar-lg .c-avatar-status{width:12px;height:12px}.c-avatar-xl{width:64px;height:64px;font-size:25.6px}.c-avatar-xl .c-avatar-status{width:14px;height:14px}.c-avatars-stack{display:-ms-flexbox;display:flex}.c-avatars-stack .c-avatar{margin-right:-18px;transition:margin-right .3s}.c-avatars-stack .c-avatar:hover{margin-right:0}.c-avatars-stack .c-avatar-sm{margin-right:-12px}.c-avatars-stack .c-avatar-lg{margin-right:-24px}.c-avatars-stack .c-avatar-xl{margin-right:-32px}.c-avatar-rounded{border-radius:.25rem}.c-avatar-square{border-radius:0}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#321fdb}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#2819ae}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(50,31,219,.5)}.badge-secondary{color:#4f5d73;background-color:#ced2d8}a.badge-secondary:focus,a.badge-secondary:hover{color:#4f5d73;background-color:#b2b8c1}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(206,210,216,.5)}.badge-success{color:#fff;background-color:#2eb85c}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#248f48}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(46,184,92,.5)}.badge-info{color:#fff;background-color:#39f}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#0080ff}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(51,153,255,.5)}.badge-warning{color:#4f5d73;background-color:#f9b115}a.badge-warning:focus,a.badge-warning:hover{color:#4f5d73;background-color:#d69405}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(249,177,21,.5)}.badge-danger{color:#fff;background-color:#e55353}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#de2727}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(229,83,83,.5)}.badge-light{color:#4f5d73;background-color:#ebedef}a.badge-light:focus,a.badge-light:hover{color:#4f5d73;background-color:#cfd4d8}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(235,237,239,.5)}.badge-dark{color:#fff;background-color:#636f83}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#4d5666}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(99,111,131,.5)}html:not([dir=rtl]) .breadcrumb-menu{margin-left:auto;margin-right:auto}.breadcrumb-menu::before{display:none}.breadcrumb-menu .btn,.breadcrumb-menu .btn-group{vertical-align:top}.breadcrumb-menu .btn{padding:0 .75rem;color:#768192;border:0}.breadcrumb-menu .btn.active,.breadcrumb-menu .btn:hover,.breadcrumb-menu .show .btn{color:#4f5d73;background:0 0}.breadcrumb-menu .dropdown-menu{min-width:180px;line-height:1.5}.breadcrumb{-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1.5rem;list-style:none;border-radius:0;border-bottom:1px solid;background-color:transparent;border-color:#d8dbe0}.breadcrumb,.breadcrumb-item{display:-ms-flexbox;display:flex}html:not([dir=rtl]) .breadcrumb-item+.breadcrumb-item{padding-left:.5rem}[dir=rtl] .breadcrumb-item+.breadcrumb-item{padding-right:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;color:#8a93a2;content:"/"}html:not([dir=rtl]) .breadcrumb-item+.breadcrumb-item::before{padding-right:.5rem}[dir=rtl] .breadcrumb-item+.breadcrumb-item::before{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#8a93a2}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}@media (hover:hover),(-ms-high-contrast:none){.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}html:not([dir=rtl]) .btn-group>.btn-group:not(:first-child),html:not([dir=rtl]) .btn-group>.btn:not(:first-child){margin-left:-1px}[dir=rtl] .btn-group>.btn-group:not(:first-child),[dir=rtl] .btn-group>.btn:not(:first-child){margin-right:-1px}html:not([dir=rtl]) .btn-group>.btn-group:not(:last-child)>.btn,html:not([dir=rtl]) .btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .btn-group>.btn-group:not(:last-child)>.btn,[dir=rtl] .btn-group>.btn:not(:last-child):not(.dropdown-toggle),html:not([dir=rtl]) .btn-group>.btn-group:not(:first-child)>.btn,html:not([dir=rtl]) .btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .btn-group>.btn-group:not(:first-child)>.btn,[dir=rtl] .btn-group>.btn:not(:first-child){border-top-right-radius:0;border-bottom-right-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}html:not([dir=rtl]) .dropdown-toggle-split::after,html:not([dir=rtl]) .dropright .dropdown-toggle-split::after,html:not([dir=rtl]) .dropup .dropdown-toggle-split::after{margin-left:0}[dir=rtl] .dropdown-toggle-split::after,[dir=rtl] .dropright .dropdown-toggle-split::after,[dir=rtl] .dropup .dropdown-toggle-split::after,html:not([dir=rtl]) .dropleft .dropdown-toggle-split::before{margin-right:0}[dir=rtl] .dropleft .dropdown-toggle-split::before{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn{display:inline-block;font-weight:400;color:#4f5d73;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:.875rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn .c-icon,.btn i{width:.875rem;height:.875rem;margin:.21875rem 0;height:.875rem;margin:.21875rem 0}@media (prefers-reduced-motion:reduce){.btn{transition:none}}@media (hover:hover),(-ms-high-contrast:none){.btn:hover{color:#4f5d73;text-decoration:none}}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(50,31,219,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#321fdb;border-color:#321fdb}@media (hover:hover),(-ms-high-contrast:none){.btn-primary:hover{color:#fff;background-color:#2a1ab9;border-color:#2819ae}}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#2a1ab9;border-color:#2819ae;box-shadow:0 0 0 .2rem rgba(81,65,224,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#321fdb;border-color:#321fdb}.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#2819ae;border-color:#2517a3}.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(81,65,224,.5)}.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#2819ae;border-color:#2517a3}.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(81,65,224,.5)}.btn-secondary{color:#4f5d73;background-color:#ced2d8;border-color:#ced2d8}@media (hover:hover),(-ms-high-contrast:none){.btn-secondary:hover{color:#4f5d73;background-color:#b9bec7;border-color:#b2b8c1}}.btn-secondary.focus,.btn-secondary:focus{color:#4f5d73;background-color:#b9bec7;border-color:#b2b8c1;box-shadow:0 0 0 .2rem rgba(187,192,201,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#4f5d73;background-color:#ced2d8;border-color:#ced2d8}.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#4f5d73;background-color:#b2b8c1;border-color:#abb1bc}.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(187,192,201,.5)}.show>.btn-secondary.dropdown-toggle{color:#4f5d73;background-color:#b2b8c1;border-color:#abb1bc}.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(187,192,201,.5)}.btn-success{color:#fff;background-color:#2eb85c;border-color:#2eb85c}@media (hover:hover),(-ms-high-contrast:none){.btn-success:hover{color:#fff;background-color:#26994d;border-color:#248f48}}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#26994d;border-color:#248f48;box-shadow:0 0 0 .2rem rgba(77,195,116,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#2eb85c;border-color:#2eb85c}.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#248f48;border-color:#218543}.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(77,195,116,.5)}.show>.btn-success.dropdown-toggle{color:#fff;background-color:#248f48;border-color:#218543}.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(77,195,116,.5)}.btn-info{color:#fff;background-color:#39f;border-color:#39f}@media (hover:hover),(-ms-high-contrast:none){.btn-info:hover{color:#fff;background-color:#0d86ff;border-color:#0080ff}}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#0d86ff;border-color:#0080ff;box-shadow:0 0 0 .2rem rgba(82,168,255,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#39f;border-color:#39f}.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#0080ff;border-color:#0079f2}.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,168,255,.5)}.show>.btn-info.dropdown-toggle{color:#fff;background-color:#0080ff;border-color:#0079f2}.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,168,255,.5)}.btn-warning{color:#4f5d73;background-color:#f9b115;border-color:#f9b115}@media (hover:hover),(-ms-high-contrast:none){.btn-warning:hover{color:#4f5d73;background-color:#e29c06;border-color:#d69405}}.btn-warning.focus,.btn-warning:focus{color:#4f5d73;background-color:#e29c06;border-color:#d69405;box-shadow:0 0 0 .2rem rgba(224,164,35,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#4f5d73;background-color:#f9b115;border-color:#f9b115}.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#4f5d73;background-color:#d69405;border-color:#c98b05}.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(224,164,35,.5)}.show>.btn-warning.dropdown-toggle{color:#4f5d73;background-color:#d69405;border-color:#c98b05}.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(224,164,35,.5)}.btn-danger{color:#fff;background-color:#e55353;border-color:#e55353}@media (hover:hover),(-ms-high-contrast:none){.btn-danger:hover{color:#fff;background-color:#e03232;border-color:#de2727}}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#e03232;border-color:#de2727;box-shadow:0 0 0 .2rem rgba(233,109,109,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#e55353;border-color:#e55353}.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#de2727;border-color:#d82121}.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(233,109,109,.5)}.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#de2727;border-color:#d82121}.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(233,109,109,.5)}.btn-light{color:#4f5d73;background-color:#ebedef;border-color:#ebedef}@media (hover:hover),(-ms-high-contrast:none){.btn-light:hover{color:#4f5d73;background-color:#d6dade;border-color:#cfd4d8}}.btn-light.focus,.btn-light:focus{color:#4f5d73;background-color:#d6dade;border-color:#cfd4d8;box-shadow:0 0 0 .2rem rgba(212,215,220,.5)}.btn-light.disabled,.btn-light:disabled{color:#4f5d73;background-color:#ebedef;border-color:#ebedef}.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#4f5d73;background-color:#cfd4d8;border-color:#c8cdd3}.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(212,215,220,.5)}.show>.btn-light.dropdown-toggle{color:#4f5d73;background-color:#cfd4d8;border-color:#c8cdd3}.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(212,215,220,.5)}.btn-dark{color:#fff;background-color:#636f83;border-color:#636f83}@media (hover:hover),(-ms-high-contrast:none){.btn-dark:hover{color:#fff;background-color:#535d6d;border-color:#4d5666}}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#535d6d;border-color:#4d5666;box-shadow:0 0 0 .2rem rgba(122,133,150,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#636f83;border-color:#636f83}.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#4d5666;border-color:#48505f}.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(122,133,150,.5)}.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#4d5666;border-color:#48505f}.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(122,133,150,.5)}.btn-transparent{color:rgba(255,255,255,.8)}.btn-transparent:hover{color:#fff}.btn-outline-primary{color:#321fdb;border-color:#321fdb}@media (hover:hover),(-ms-high-contrast:none){.btn-outline-primary:hover{color:#fff;background-color:#321fdb;border-color:#321fdb}}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(50,31,219,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#321fdb;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active{color:#fff;background-color:#321fdb;border-color:#321fdb}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(50,31,219,.5)}.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#321fdb;border-color:#321fdb}.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(50,31,219,.5)}.btn-outline-secondary{color:#ced2d8;border-color:#ced2d8}@media (hover:hover),(-ms-high-contrast:none){.btn-outline-secondary:hover{color:#4f5d73;background-color:#ced2d8;border-color:#ced2d8}}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(206,210,216,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#ced2d8;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active{color:#4f5d73;background-color:#ced2d8;border-color:#ced2d8}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(206,210,216,.5)}.show>.btn-outline-secondary.dropdown-toggle{color:#4f5d73;background-color:#ced2d8;border-color:#ced2d8}.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(206,210,216,.5)}.btn-outline-success{color:#2eb85c;border-color:#2eb85c}@media (hover:hover),(-ms-high-contrast:none){.btn-outline-success:hover{color:#fff;background-color:#2eb85c;border-color:#2eb85c}}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(46,184,92,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#2eb85c;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active{color:#fff;background-color:#2eb85c;border-color:#2eb85c}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(46,184,92,.5)}.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#2eb85c;border-color:#2eb85c}.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(46,184,92,.5)}.btn-outline-info{color:#39f;border-color:#39f}@media (hover:hover),(-ms-high-contrast:none){.btn-outline-info:hover{color:#fff;background-color:#39f;border-color:#39f}}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(51,153,255,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#39f;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active{color:#fff;background-color:#39f;border-color:#39f}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(51,153,255,.5)}.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#39f;border-color:#39f}.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(51,153,255,.5)}.btn-outline-warning{color:#f9b115;border-color:#f9b115}@media (hover:hover),(-ms-high-contrast:none){.btn-outline-warning:hover{color:#4f5d73;background-color:#f9b115;border-color:#f9b115}}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(249,177,21,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f9b115;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active{color:#4f5d73;background-color:#f9b115;border-color:#f9b115}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(249,177,21,.5)}.show>.btn-outline-warning.dropdown-toggle{color:#4f5d73;background-color:#f9b115;border-color:#f9b115}.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(249,177,21,.5)}.btn-outline-danger{color:#e55353;border-color:#e55353}@media (hover:hover),(-ms-high-contrast:none){.btn-outline-danger:hover{color:#fff;background-color:#e55353;border-color:#e55353}}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(229,83,83,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#e55353;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active{color:#fff;background-color:#e55353;border-color:#e55353}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(229,83,83,.5)}.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#e55353;border-color:#e55353}.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(229,83,83,.5)}.btn-outline-light{color:#ebedef;border-color:#ebedef}@media (hover:hover),(-ms-high-contrast:none){.btn-outline-light:hover{color:#4f5d73;background-color:#ebedef;border-color:#ebedef}}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(235,237,239,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#ebedef;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active{color:#4f5d73;background-color:#ebedef;border-color:#ebedef}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(235,237,239,.5)}.show>.btn-outline-light.dropdown-toggle{color:#4f5d73;background-color:#ebedef;border-color:#ebedef}.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(235,237,239,.5)}.btn-outline-dark{color:#636f83;border-color:#636f83}@media (hover:hover),(-ms-high-contrast:none){.btn-outline-dark:hover{color:#fff;background-color:#636f83;border-color:#636f83}}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(99,111,131,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#636f83;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active{color:#fff;background-color:#636f83;border-color:#636f83}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(99,111,131,.5)}.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#636f83;border-color:#636f83}.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(99,111,131,.5)}.btn-link{font-weight:400;color:#321fdb;text-decoration:none}@media (hover:hover),(-ms-high-contrast:none){.btn-link:hover{color:#231698;text-decoration:underline}}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#8a93a2;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.09375rem;line-height:1.5;border-radius:.3rem}.btn-group-lg>.btn .c-icon,.btn-group-lg>.btn i,.btn-lg .c-icon,.btn-lg i{width:1.09375rem;height:1.09375rem;margin:.2734375rem 0}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.765625rem;line-height:1.5;border-radius:.2rem}.btn-group-sm>.btn .c-icon,.btn-group-sm>.btn i,.btn-sm .c-icon,.btn-sm i{width:.765625rem;height:.765625rem;margin:.19140625rem 0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-pill{border-radius:50em}.btn-square{border-radius:0}.btn-ghost-primary{color:#321fdb;background-color:transparent;background-image:none;border-color:transparent}.btn-ghost-primary:hover{color:#fff;background-color:#321fdb;border-color:#321fdb}.btn-ghost-primary.focus,.btn-ghost-primary:focus{box-shadow:0 0 0 .2rem rgba(50,31,219,.5)}.btn-ghost-primary.disabled,.btn-ghost-primary:disabled{color:#321fdb;background-color:transparent;border-color:transparent}.btn-ghost-primary:not(:disabled):not(.disabled).active,.btn-ghost-primary:not(:disabled):not(.disabled):active{color:#fff;background-color:#321fdb;border-color:#321fdb}.btn-ghost-primary:not(:disabled):not(.disabled).active:focus,.btn-ghost-primary:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(50,31,219,.5)}.show>.btn-ghost-primary.dropdown-toggle{color:#fff;background-color:#321fdb;border-color:#321fdb}.show>.btn-ghost-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(50,31,219,.5)}.btn-ghost-secondary{color:#ced2d8;background-color:transparent;background-image:none;border-color:transparent}.btn-ghost-secondary:hover{color:#4f5d73;background-color:#ced2d8;border-color:#ced2d8}.btn-ghost-secondary.focus,.btn-ghost-secondary:focus{box-shadow:0 0 0 .2rem rgba(206,210,216,.5)}.btn-ghost-secondary.disabled,.btn-ghost-secondary:disabled{color:#ced2d8;background-color:transparent;border-color:transparent}.btn-ghost-secondary:not(:disabled):not(.disabled).active,.btn-ghost-secondary:not(:disabled):not(.disabled):active{color:#4f5d73;background-color:#ced2d8;border-color:#ced2d8}.btn-ghost-secondary:not(:disabled):not(.disabled).active:focus,.btn-ghost-secondary:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(206,210,216,.5)}.show>.btn-ghost-secondary.dropdown-toggle{color:#4f5d73;background-color:#ced2d8;border-color:#ced2d8}.show>.btn-ghost-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(206,210,216,.5)}.btn-ghost-success{color:#2eb85c;background-color:transparent;background-image:none;border-color:transparent}.btn-ghost-success:hover{color:#fff;background-color:#2eb85c;border-color:#2eb85c}.btn-ghost-success.focus,.btn-ghost-success:focus{box-shadow:0 0 0 .2rem rgba(46,184,92,.5)}.btn-ghost-success.disabled,.btn-ghost-success:disabled{color:#2eb85c;background-color:transparent;border-color:transparent}.btn-ghost-success:not(:disabled):not(.disabled).active,.btn-ghost-success:not(:disabled):not(.disabled):active{color:#fff;background-color:#2eb85c;border-color:#2eb85c}.btn-ghost-success:not(:disabled):not(.disabled).active:focus,.btn-ghost-success:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(46,184,92,.5)}.show>.btn-ghost-success.dropdown-toggle{color:#fff;background-color:#2eb85c;border-color:#2eb85c}.show>.btn-ghost-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(46,184,92,.5)}.btn-ghost-info{color:#39f;background-color:transparent;background-image:none;border-color:transparent}.btn-ghost-info:hover{color:#fff;background-color:#39f;border-color:#39f}.btn-ghost-info.focus,.btn-ghost-info:focus{box-shadow:0 0 0 .2rem rgba(51,153,255,.5)}.btn-ghost-info.disabled,.btn-ghost-info:disabled{color:#39f;background-color:transparent;border-color:transparent}.btn-ghost-info:not(:disabled):not(.disabled).active,.btn-ghost-info:not(:disabled):not(.disabled):active{color:#fff;background-color:#39f;border-color:#39f}.btn-ghost-info:not(:disabled):not(.disabled).active:focus,.btn-ghost-info:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(51,153,255,.5)}.show>.btn-ghost-info.dropdown-toggle{color:#fff;background-color:#39f;border-color:#39f}.show>.btn-ghost-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(51,153,255,.5)}.btn-ghost-warning{color:#f9b115;background-color:transparent;background-image:none;border-color:transparent}.btn-ghost-warning:hover{color:#4f5d73;background-color:#f9b115;border-color:#f9b115}.btn-ghost-warning.focus,.btn-ghost-warning:focus{box-shadow:0 0 0 .2rem rgba(249,177,21,.5)}.btn-ghost-warning.disabled,.btn-ghost-warning:disabled{color:#f9b115;background-color:transparent;border-color:transparent}.btn-ghost-warning:not(:disabled):not(.disabled).active,.btn-ghost-warning:not(:disabled):not(.disabled):active{color:#4f5d73;background-color:#f9b115;border-color:#f9b115}.btn-ghost-warning:not(:disabled):not(.disabled).active:focus,.btn-ghost-warning:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(249,177,21,.5)}.show>.btn-ghost-warning.dropdown-toggle{color:#4f5d73;background-color:#f9b115;border-color:#f9b115}.show>.btn-ghost-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(249,177,21,.5)}.btn-ghost-danger{color:#e55353;background-color:transparent;background-image:none;border-color:transparent}.btn-ghost-danger:hover{color:#fff;background-color:#e55353;border-color:#e55353}.btn-ghost-danger.focus,.btn-ghost-danger:focus{box-shadow:0 0 0 .2rem rgba(229,83,83,.5)}.btn-ghost-danger.disabled,.btn-ghost-danger:disabled{color:#e55353;background-color:transparent;border-color:transparent}.btn-ghost-danger:not(:disabled):not(.disabled).active,.btn-ghost-danger:not(:disabled):not(.disabled):active{color:#fff;background-color:#e55353;border-color:#e55353}.btn-ghost-danger:not(:disabled):not(.disabled).active:focus,.btn-ghost-danger:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(229,83,83,.5)}.show>.btn-ghost-danger.dropdown-toggle{color:#fff;background-color:#e55353;border-color:#e55353}.show>.btn-ghost-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(229,83,83,.5)}.btn-ghost-light{color:#ebedef;background-color:transparent;background-image:none;border-color:transparent}.btn-ghost-light:hover{color:#4f5d73;background-color:#ebedef;border-color:#ebedef}.btn-ghost-light.focus,.btn-ghost-light:focus{box-shadow:0 0 0 .2rem rgba(235,237,239,.5)}.btn-ghost-light.disabled,.btn-ghost-light:disabled{color:#ebedef;background-color:transparent;border-color:transparent}.btn-ghost-light:not(:disabled):not(.disabled).active,.btn-ghost-light:not(:disabled):not(.disabled):active{color:#4f5d73;background-color:#ebedef;border-color:#ebedef}.btn-ghost-light:not(:disabled):not(.disabled).active:focus,.btn-ghost-light:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(235,237,239,.5)}.show>.btn-ghost-light.dropdown-toggle{color:#4f5d73;background-color:#ebedef;border-color:#ebedef}.show>.btn-ghost-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(235,237,239,.5)}.btn-ghost-dark{color:#636f83;background-color:transparent;background-image:none;border-color:transparent}.btn-ghost-dark:hover{color:#fff;background-color:#636f83;border-color:#636f83}.btn-ghost-dark.focus,.btn-ghost-dark:focus{box-shadow:0 0 0 .2rem rgba(99,111,131,.5)}.btn-ghost-dark.disabled,.btn-ghost-dark:disabled{color:#636f83;background-color:transparent;border-color:transparent}.btn-ghost-dark:not(:disabled):not(.disabled).active,.btn-ghost-dark:not(:disabled):not(.disabled):active{color:#fff;background-color:#636f83;border-color:#636f83}.btn-ghost-dark:not(:disabled):not(.disabled).active:focus,.btn-ghost-dark:not(:disabled):not(.disabled):active:focus{box-shadow:0 0 0 .2rem rgba(99,111,131,.5)}.show>.btn-ghost-dark.dropdown-toggle{color:#fff;background-color:#636f83;border-color:#636f83}.show>.btn-ghost-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(99,111,131,.5)}.btn-facebook{color:#fff;background-color:#3b5998;border-color:#3b5998}@media (hover:hover),(-ms-high-contrast:none){.btn-facebook:hover{color:#fff;background-color:#30497c;border-color:#2d4373}}.btn-facebook.focus,.btn-facebook:focus{color:#fff;background-color:#30497c;border-color:#2d4373;box-shadow:0 0 0 .2rem rgba(88,114,167,.5)}.btn-facebook.disabled,.btn-facebook:disabled{color:#fff;background-color:#3b5998;border-color:#3b5998}.btn-facebook:not(:disabled):not(.disabled):active,.show>.btn-facebook.dropdown-toggle{color:#fff;background-color:#2d4373;border-color:#293e6a}.btn-facebook:not(:disabled):not(.disabled):active:focus,.show>.btn-facebook.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(88,114,167,.5)}.show>.btn-facebook.dropdown-toggle{color:#fff;background-color:#2d4373;border-color:#293e6a}.show>.btn-facebook.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(88,114,167,.5)}.btn-twitter{color:#fff;background-color:#00aced;border-color:#00aced}@media (hover:hover),(-ms-high-contrast:none){.btn-twitter:hover{color:#fff;background-color:#0090c7;border-color:#0087ba}}.btn-twitter.focus,.btn-twitter:focus{color:#fff;background-color:#0090c7;border-color:#0087ba;box-shadow:0 0 0 .2rem rgba(38,184,240,.5)}.btn-twitter.disabled,.btn-twitter:disabled{color:#fff;background-color:#00aced;border-color:#00aced}.btn-twitter:not(:disabled):not(.disabled):active,.show>.btn-twitter.dropdown-toggle{color:#fff;background-color:#0087ba;border-color:#007ead}.btn-twitter:not(:disabled):not(.disabled):active:focus,.show>.btn-twitter.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,184,240,.5)}.show>.btn-twitter.dropdown-toggle{color:#fff;background-color:#0087ba;border-color:#007ead}.show>.btn-twitter.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,184,240,.5)}.btn-linkedin{color:#fff;background-color:#4875b4;border-color:#4875b4}@media (hover:hover),(-ms-high-contrast:none){.btn-linkedin:hover{color:#fff;background-color:#3d6399;border-color:#395d90}}.btn-linkedin.focus,.btn-linkedin:focus{color:#fff;background-color:#3d6399;border-color:#395d90;box-shadow:0 0 0 .2rem rgba(99,138,191,.5)}.btn-linkedin.disabled,.btn-linkedin:disabled{color:#fff;background-color:#4875b4;border-color:#4875b4}.btn-linkedin:not(:disabled):not(.disabled):active,.show>.btn-linkedin.dropdown-toggle{color:#fff;background-color:#395d90;border-color:#365786}.btn-linkedin:not(:disabled):not(.disabled):active:focus,.show>.btn-linkedin.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(99,138,191,.5)}.show>.btn-linkedin.dropdown-toggle{color:#fff;background-color:#395d90;border-color:#365786}.show>.btn-linkedin.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(99,138,191,.5)}.btn-flickr{color:#fff;background-color:#ff0084;border-color:#ff0084}@media (hover:hover),(-ms-high-contrast:none){.btn-flickr:hover{color:#fff;background-color:#d90070;border-color:#cc006a}}.btn-flickr.focus,.btn-flickr:focus{color:#fff;background-color:#d90070;border-color:#cc006a;box-shadow:0 0 0 .2rem rgba(255,38,150,.5)}.btn-flickr.disabled,.btn-flickr:disabled{color:#fff;background-color:#ff0084;border-color:#ff0084}.btn-flickr:not(:disabled):not(.disabled):active,.show>.btn-flickr.dropdown-toggle{color:#fff;background-color:#cc006a;border-color:#bf0063}.btn-flickr:not(:disabled):not(.disabled):active:focus,.show>.btn-flickr.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,38,150,.5)}.show>.btn-flickr.dropdown-toggle{color:#fff;background-color:#cc006a;border-color:#bf0063}.show>.btn-flickr.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,38,150,.5)}.btn-tumblr{color:#fff;background-color:#32506d;border-color:#32506d}@media (hover:hover),(-ms-high-contrast:none){.btn-tumblr:hover{color:#fff;background-color:#263d53;border-color:#22364a}}.btn-tumblr.focus,.btn-tumblr:focus{color:#fff;background-color:#263d53;border-color:#22364a;box-shadow:0 0 0 .2rem rgba(81,106,131,.5)}.btn-tumblr.disabled,.btn-tumblr:disabled{color:#fff;background-color:#32506d;border-color:#32506d}.btn-tumblr:not(:disabled):not(.disabled):active,.show>.btn-tumblr.dropdown-toggle{color:#fff;background-color:#22364a;border-color:#1e3041}.btn-tumblr:not(:disabled):not(.disabled):active:focus,.show>.btn-tumblr.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(81,106,131,.5)}.show>.btn-tumblr.dropdown-toggle{color:#fff;background-color:#22364a;border-color:#1e3041}.show>.btn-tumblr.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(81,106,131,.5)}.btn-xing{color:#fff;background-color:#026466;border-color:#026466}@media (hover:hover),(-ms-high-contrast:none){.btn-xing:hover{color:#fff;background-color:#013f40;border-color:#013334}}.btn-xing.focus,.btn-xing:focus{color:#fff;background-color:#013f40;border-color:#013334;box-shadow:0 0 0 .2rem rgba(40,123,125,.5)}.btn-xing.disabled,.btn-xing:disabled{color:#fff;background-color:#026466;border-color:#026466}.btn-xing:not(:disabled):not(.disabled):active,.show>.btn-xing.dropdown-toggle{color:#fff;background-color:#013334;border-color:#012727}.btn-xing:not(:disabled):not(.disabled):active:focus,.show>.btn-xing.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,123,125,.5)}.show>.btn-xing.dropdown-toggle{color:#fff;background-color:#013334;border-color:#012727}.show>.btn-xing.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,123,125,.5)}.btn-github{color:#fff;background-color:#4183c4;border-color:#4183c4}@media (hover:hover),(-ms-high-contrast:none){.btn-github:hover{color:#fff;background-color:#3570aa;border-color:#3269a0}}.btn-github.focus,.btn-github:focus{color:#fff;background-color:#3570aa;border-color:#3269a0;box-shadow:0 0 0 .2rem rgba(94,150,205,.5)}.btn-github.disabled,.btn-github:disabled{color:#fff;background-color:#4183c4;border-color:#4183c4}.btn-github:not(:disabled):not(.disabled):active,.show>.btn-github.dropdown-toggle{color:#fff;background-color:#3269a0;border-color:#2f6397}.btn-github:not(:disabled):not(.disabled):active:focus,.show>.btn-github.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(94,150,205,.5)}.show>.btn-github.dropdown-toggle{color:#fff;background-color:#3269a0;border-color:#2f6397}.show>.btn-github.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(94,150,205,.5)}.btn-stack-overflow{color:#fff;background-color:#fe7a15;border-color:#fe7a15}@media (hover:hover),(-ms-high-contrast:none){.btn-stack-overflow:hover{color:#fff;background-color:#ec6701;border-color:#df6101}}.btn-stack-overflow.focus,.btn-stack-overflow:focus{color:#fff;background-color:#ec6701;border-color:#df6101;box-shadow:0 0 0 .2rem rgba(254,142,56,.5)}.btn-stack-overflow.disabled,.btn-stack-overflow:disabled{color:#fff;background-color:#fe7a15;border-color:#fe7a15}.btn-stack-overflow:not(:disabled):not(.disabled):active,.show>.btn-stack-overflow.dropdown-toggle{color:#fff;background-color:#df6101;border-color:#d25c01}.btn-stack-overflow:not(:disabled):not(.disabled):active:focus,.show>.btn-stack-overflow.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(254,142,56,.5)}.show>.btn-stack-overflow.dropdown-toggle{color:#fff;background-color:#df6101;border-color:#d25c01}.show>.btn-stack-overflow.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(254,142,56,.5)}.btn-youtube{color:#fff;background-color:#b00;border-color:#b00}@media (hover:hover),(-ms-high-contrast:none){.btn-youtube:hover{color:#fff;background-color:#950000;border-color:#800}}.btn-youtube.focus,.btn-youtube:focus{color:#fff;background-color:#950000;border-color:#800;box-shadow:0 0 0 .2rem rgba(197,38,38,.5)}.btn-youtube.disabled,.btn-youtube:disabled{color:#fff;background-color:#b00;border-color:#b00}.btn-youtube:not(:disabled):not(.disabled):active,.show>.btn-youtube.dropdown-toggle{color:#fff;background-color:#800;border-color:#7b0000}.btn-youtube:not(:disabled):not(.disabled):active:focus,.show>.btn-youtube.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(197,38,38,.5)}.show>.btn-youtube.dropdown-toggle{color:#fff;background-color:#800;border-color:#7b0000}.show>.btn-youtube.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(197,38,38,.5)}.btn-dribbble{color:#fff;background-color:#ea4c89;border-color:#ea4c89}@media (hover:hover),(-ms-high-contrast:none){.btn-dribbble:hover{color:#fff;background-color:#e62a72;border-color:#e51e6b}}.btn-dribbble.focus,.btn-dribbble:focus{color:#fff;background-color:#e62a72;border-color:#e51e6b;box-shadow:0 0 0 .2rem rgba(237,103,155,.5)}.btn-dribbble.disabled,.btn-dribbble:disabled{color:#fff;background-color:#ea4c89;border-color:#ea4c89}.btn-dribbble:not(:disabled):not(.disabled):active,.show>.btn-dribbble.dropdown-toggle{color:#fff;background-color:#e51e6b;border-color:#dc1a65}.btn-dribbble:not(:disabled):not(.disabled):active:focus,.show>.btn-dribbble.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(237,103,155,.5)}.show>.btn-dribbble.dropdown-toggle{color:#fff;background-color:#e51e6b;border-color:#dc1a65}.show>.btn-dribbble.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(237,103,155,.5)}.btn-instagram{color:#fff;background-color:#517fa4;border-color:#517fa4}@media (hover:hover),(-ms-high-contrast:none){.btn-instagram:hover{color:#fff;background-color:#446b8a;border-color:#406582}}.btn-instagram.focus,.btn-instagram:focus{color:#fff;background-color:#446b8a;border-color:#406582;box-shadow:0 0 0 .2rem rgba(107,146,178,.5)}.btn-instagram.disabled,.btn-instagram:disabled{color:#fff;background-color:#517fa4;border-color:#517fa4}.btn-instagram:not(:disabled):not(.disabled):active,.show>.btn-instagram.dropdown-toggle{color:#fff;background-color:#406582;border-color:#3c5e79}.btn-instagram:not(:disabled):not(.disabled):active:focus,.show>.btn-instagram.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(107,146,178,.5)}.show>.btn-instagram.dropdown-toggle{color:#fff;background-color:#406582;border-color:#3c5e79}.show>.btn-instagram.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(107,146,178,.5)}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:#cb2027}@media (hover:hover),(-ms-high-contrast:none){.btn-pinterest:hover{color:#fff;background-color:#aa1b21;border-color:#9f191f}}.btn-pinterest.focus,.btn-pinterest:focus{color:#fff;background-color:#aa1b21;border-color:#9f191f;box-shadow:0 0 0 .2rem rgba(211,65,71,.5)}.btn-pinterest.disabled,.btn-pinterest:disabled{color:#fff;background-color:#cb2027;border-color:#cb2027}.btn-pinterest:not(:disabled):not(.disabled):active,.show>.btn-pinterest.dropdown-toggle{color:#fff;background-color:#9f191f;border-color:#94171c}.btn-pinterest:not(:disabled):not(.disabled):active:focus,.show>.btn-pinterest.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(211,65,71,.5)}.show>.btn-pinterest.dropdown-toggle{color:#fff;background-color:#9f191f;border-color:#94171c}.show>.btn-pinterest.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(211,65,71,.5)}.btn-vk{color:#fff;background-color:#45668e;border-color:#45668e}@media (hover:hover),(-ms-high-contrast:none){.btn-vk:hover{color:#fff;background-color:#385474;border-color:#344d6c}}.btn-vk.focus,.btn-vk:focus{color:#fff;background-color:#385474;border-color:#344d6c;box-shadow:0 0 0 .2rem rgba(97,125,159,.5)}.btn-vk.disabled,.btn-vk:disabled{color:#fff;background-color:#45668e;border-color:#45668e}.btn-vk:not(:disabled):not(.disabled):active,.show>.btn-vk.dropdown-toggle{color:#fff;background-color:#344d6c;border-color:#304763}.btn-vk:not(:disabled):not(.disabled):active:focus,.show>.btn-vk.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(97,125,159,.5)}.show>.btn-vk.dropdown-toggle{color:#fff;background-color:#344d6c;border-color:#304763}.show>.btn-vk.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(97,125,159,.5)}.btn-yahoo{color:#fff;background-color:#400191;border-color:#400191}@media (hover:hover),(-ms-high-contrast:none){.btn-yahoo:hover{color:#fff;background-color:#2f016b;border-color:#2a015e}}.btn-yahoo.focus,.btn-yahoo:focus{color:#fff;background-color:#2f016b;border-color:#2a015e;box-shadow:0 0 0 .2rem rgba(93,39,162,.5)}.btn-yahoo.disabled,.btn-yahoo:disabled{color:#fff;background-color:#400191;border-color:#400191}.btn-yahoo:not(:disabled):not(.disabled):active,.show>.btn-yahoo.dropdown-toggle{color:#fff;background-color:#2a015e;border-color:#240152}.btn-yahoo:not(:disabled):not(.disabled):active:focus,.show>.btn-yahoo.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(93,39,162,.5)}.show>.btn-yahoo.dropdown-toggle{color:#fff;background-color:#2a015e;border-color:#240152}.show>.btn-yahoo.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(93,39,162,.5)}.btn-behance{color:#fff;background-color:#1769ff;border-color:#1769ff}@media (hover:hover),(-ms-high-contrast:none){.btn-behance:hover{color:#fff;background-color:#0055f0;border-color:#0050e3}}.btn-behance.focus,.btn-behance:focus{color:#fff;background-color:#0055f0;border-color:#0050e3;box-shadow:0 0 0 .2rem rgba(58,128,255,.5)}.btn-behance.disabled,.btn-behance:disabled{color:#fff;background-color:#1769ff;border-color:#1769ff}.btn-behance:not(:disabled):not(.disabled):active,.show>.btn-behance.dropdown-toggle{color:#fff;background-color:#0050e3;border-color:#004cd6}.btn-behance:not(:disabled):not(.disabled):active:focus,.show>.btn-behance.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,128,255,.5)}.show>.btn-behance.dropdown-toggle{color:#fff;background-color:#0050e3;border-color:#004cd6}.show>.btn-behance.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,128,255,.5)}.btn-reddit{color:#fff;background-color:#ff4500;border-color:#ff4500}@media (hover:hover),(-ms-high-contrast:none){.btn-reddit:hover{color:#fff;background-color:#d93b00;border-color:#cc3700}}.btn-reddit.focus,.btn-reddit:focus{color:#fff;background-color:#d93b00;border-color:#cc3700;box-shadow:0 0 0 .2rem rgba(255,97,38,.5)}.btn-reddit.disabled,.btn-reddit:disabled{color:#fff;background-color:#ff4500;border-color:#ff4500}.btn-reddit:not(:disabled):not(.disabled):active,.show>.btn-reddit.dropdown-toggle{color:#fff;background-color:#cc3700;border-color:#bf3400}.btn-reddit:not(:disabled):not(.disabled):active:focus,.show>.btn-reddit.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,97,38,.5)}.show>.btn-reddit.dropdown-toggle{color:#fff;background-color:#cc3700;border-color:#bf3400}.show>.btn-reddit.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,97,38,.5)}.btn-vimeo{color:#4f5d73;background-color:#aad450;border-color:#aad450}@media (hover:hover),(-ms-high-contrast:none){.btn-vimeo:hover{color:#4f5d73;background-color:#9bcc32;border-color:#93c130}}.btn-vimeo.focus,.btn-vimeo:focus{color:#4f5d73;background-color:#9bcc32;border-color:#93c130;box-shadow:0 0 0 .2rem rgba(156,194,85,.5)}.btn-vimeo.disabled,.btn-vimeo:disabled{color:#4f5d73;background-color:#aad450;border-color:#aad450}.btn-vimeo:not(:disabled):not(.disabled):active,.show>.btn-vimeo.dropdown-toggle{color:#4f5d73;background-color:#93c130;border-color:#8bb72d}.btn-vimeo:not(:disabled):not(.disabled):active:focus,.show>.btn-vimeo.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(156,194,85,.5)}.show>.btn-vimeo.dropdown-toggle{color:#4f5d73;background-color:#93c130;border-color:#8bb72d}.show>.btn-vimeo.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(156,194,85,.5)}.c-callout{position:relative;padding:0 1rem;margin:1rem 0;border-radius:.25rem}html:not([dir=rtl]) .c-callout{border-left:4px solid #d8dbe0}[dir=rtl] .c-callout{border-right:4px solid #d8dbe0}.c-callout-bordered{border:1px solid #d8dbe0;border-left-width:4px}.c-callout code{border-radius:.25rem}.c-callout h4{margin-top:0;margin-bottom:.25rem}.c-callout p:last-child{margin-bottom:0}.c-callout+.c-callout{margin-top:-.25rem}html:not([dir=rtl]) .c-callout-primary{border-left-color:#321fdb}[dir=rtl] .c-callout-primary{border-right-color:#321fdb}.c-callout-primary h4{color:#321fdb}html:not([dir=rtl]) .c-callout-secondary{border-left-color:#ced2d8}[dir=rtl] .c-callout-secondary{border-right-color:#ced2d8}.c-callout-secondary h4{color:#ced2d8}html:not([dir=rtl]) .c-callout-success{border-left-color:#2eb85c}[dir=rtl] .c-callout-success{border-right-color:#2eb85c}.c-callout-success h4{color:#2eb85c}html:not([dir=rtl]) .c-callout-info{border-left-color:#39f}[dir=rtl] .c-callout-info{border-right-color:#39f}.c-callout-info h4{color:#39f}html:not([dir=rtl]) .c-callout-warning{border-left-color:#f9b115}[dir=rtl] .c-callout-warning{border-right-color:#f9b115}.c-callout-warning h4{color:#f9b115}html:not([dir=rtl]) .c-callout-danger{border-left-color:#e55353}[dir=rtl] .c-callout-danger{border-right-color:#e55353}.c-callout-danger h4{color:#e55353}html:not([dir=rtl]) .c-callout-light{border-left-color:#ebedef}[dir=rtl] .c-callout-light{border-right-color:#ebedef}.c-callout-light h4{color:#ebedef}html:not([dir=rtl]) .c-callout-dark{border-left-color:#636f83}[dir=rtl] .c-callout-dark{border-right-color:#636f83}.c-callout-dark h4{color:#636f83}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;margin-bottom:1.5rem;word-wrap:break-word;background-clip:border-box;border:1px solid;border-radius:.25rem;background-color:#fff;border-color:#d8dbe0}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card .drag,.card.drag{cursor:move}.card[class*=" bg-"],.card[class^=bg-]{border-color:rgba(0,0,0,.125)}.card[class*=" bg-"] .card-header,.card[class^=bg-] .card-header{background-color:rgba(0,0,0,.05);border-color:rgba(0,0,0,.125)}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}@media (hover:hover),(-ms-high-contrast:none){.card-link:hover{text-decoration:none}}html:not([dir=rtl]) .card-link+.card-link{margin-left:1.25rem}[dir=rtl] .card-link+.card-link{margin-right:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;border-bottom:1px solid;background-color:#fff;border-color:#d8dbe0}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-header .c-chart-wrapper{position:absolute;top:0;right:0;width:100%;height:100%}.card-footer{padding:.75rem 1.25rem;border-top:1px solid;background-color:#fff;border-color:#d8dbe0}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}html:not([dir=rtl]) .card-group>.card+.card{margin-left:0;border-left:0}[dir=rtl] .card-group>.card+.card{margin-right:0;border-right:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.card-placeholder{background:rgba(0,0,21,.025);border:1px dashed #c4c9d0}.card-header-icon-bg{width:2.8125rem;padding:.75rem 0;margin:-.75rem 1.25rem -.75rem -1.25rem;line-height:inherit;color:#4f5d73;text-align:center;background:0 0;border-right:1px solid;border-right:#d8dbe0}.card-header-actions,.card-header-icon-bg{display:inline-block}html:not([dir=rtl]) .card-header-actions{float:right;margin-right:-.25rem}[dir=rtl] .card-header-actions{float:left;margin-left:-.25rem}.card-header-action{padding:0 .25rem;color:#8a93a2}.card-header-action:hover{color:#4f5d73;text-decoration:none}.card-accent-primary{border-top:2px solid #321fdb!important}.card-accent-secondary{border-top:2px solid #ced2d8!important}.card-accent-success{border-top:2px solid #2eb85c!important}.card-accent-info{border-top:2px solid #39f!important}.card-accent-warning{border-top:2px solid #f9b115!important}.card-accent-danger{border-top:2px solid #e55353!important}.card-accent-light{border-top:2px solid #ebedef!important}.card-accent-dark{border-top:2px solid #636f83!important}.card-full{margin-top:-1rem;margin-right:-15px;margin-left:-15px;border:0;border-bottom:1px solid #d8dbe0}@media (min-width:576px){.card-columns.cols-2{-webkit-column-count:2;-moz-column-count:2;column-count:2}}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-right:15%;margin-left:15%;list-style:none}html:not([dir=rtl]) .carousel-indicators{padding-left:0}[dir=rtl] .carousel-indicators{padding-right:0}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.c-chart-wrapper canvas{width:100%}base-chart.chart{display:block}canvas{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.close{float:right;font-size:1.3125rem;font-weight:700;line-height:1;opacity:.5;color:#000015;text-shadow:0 1px 0 #fff}@media (hover:hover),(-ms-high-contrast:none){.close:hover{text-decoration:none;color:#000015}}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#4f5d73;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.custom-control{position:relative;display:block;min-height:1.3125rem}html:not([dir=rtl]) .custom-control{padding-left:1.5rem}[dir=rtl] .custom-control{padding-right:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;width:1rem;height:1.15625rem;opacity:0}html:not([dir=rtl]) .custom-control-input{left:0}[dir=rtl] .custom-control-input{right:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#321fdb;background-color:#321fdb}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(50,31,219,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#958bef}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#beb8f5;border-color:#beb8f5}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#8a93a2}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#d8dbe0}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.15625rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";border:solid 1px;background-color:#fff;border-color:#9da5b1}html:not([dir=rtl]) .custom-control-label::before{left:-1.5rem}[dir=rtl] .custom-control-label::before{right:-1.5rem}.custom-control-label::after{position:absolute;top:.15625rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}html:not([dir=rtl]) .custom-control-label::after{left:-1.5rem}[dir=rtl] .custom-control-label::after{right:-1.5rem}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#321fdb;background-color:#321fdb}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(50,31,219,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(50,31,219,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(50,31,219,.5)}html:not([dir=rtl]) .custom-switch{padding-left:2.25rem}[dir=rtl] .custom-switch{padding-right:2.25rem}.custom-switch .custom-control-label::before{width:1.75rem;pointer-events:all;border-radius:.5rem}html:not([dir=rtl]) .custom-switch .custom-control-label::before{left:-2.25rem}[dir=rtl] .custom-switch .custom-control-label::before{right:-2.25rem}.custom-switch .custom-control-label::after{top:calc(.15625rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#9da5b1;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;background-color:#9da5b1}html:not([dir=rtl]) .custom-switch .custom-control-label::after{left:calc(-2.25rem + 2px)}[dir=rtl] .custom-switch .custom-control-label::after{right:calc(-2.25rem + 2px)}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(50,31,219,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:.875rem;font-weight:400;line-height:1.5;vertical-align:middle;border:1px solid;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;color:#768192;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23636f83' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;border-color:#d8dbe0}.custom-select:focus{border-color:#958bef;outline:0;box-shadow:0 0 0 .2rem rgba(50,31,219,.25)}.custom-select:focus::-ms-value{color:#768192;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;background-image:none}html:not([dir=rtl]) .custom-select[multiple],html:not([dir=rtl]) .custom-select[size]:not([size="1"]){padding-right:.75rem}[dir=rtl] .custom-select[multiple],[dir=rtl] .custom-select[size]:not([size="1"]){padding-left:.75rem}.custom-select:disabled{color:#8a93a2;background-color:#d8dbe0}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #768192}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;font-size:.765625rem}html:not([dir=rtl]) .custom-select-sm{padding-left:.5rem}[dir=rtl] .custom-select-sm{padding-right:.5rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;font-size:1.09375rem}html:not([dir=rtl]) .custom-select-lg{padding-left:1rem}[dir=rtl] .custom-select-lg{padding-right:1rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(1.5em + .75rem + 2px)}.custom-file-input{z-index:2;margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(50,31,219,.25);border-color:#958bef}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#d8dbe0}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);font-weight:400;border:1px solid;border-radius:.25rem;background-color:#fff;border-color:#d8dbe0}.custom-file-label,.custom-file-label::after{position:absolute;top:0;padding:.375rem .75rem;line-height:1.5;color:#768192}.custom-file-label::after{bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);content:"Browse";border-left:inherit;border-radius:0 .25rem .25rem 0;background-color:#ebedef}html:not([dir=rtl]) .custom-file-label::after{right:0}[dir=rtl] .custom-file-label::after{left:0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #ebedef,0 0 0 .2rem rgba(50,31,219,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #ebedef,0 0 0 .2rem rgba(50,31,219,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #ebedef,0 0 0 .2rem rgba(50,31,219,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#321fdb;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#beb8f5}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;border-color:transparent;border-radius:1rem;background-color:#c4c9d0}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#321fdb;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#beb8f5}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#c4c9d0;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#321fdb;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#beb8f5}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#c4c9d0;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#9da5b1}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#9da5b1}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#9da5b1}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}html:not([dir=rtl]) .dropdown-toggle::after{margin-left:.255em}[dir=rtl] .dropdown-toggle::after{margin-right:.255em}html:not([dir=rtl]) .dropdown-toggle:empty::after{margin-left:0}[dir=rtl] .dropdown-toggle:empty::after{margin-right:0}.dropdown-menu{position:absolute;top:100%;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;font-size:.875rem;text-align:left;list-style:none;background-clip:padding-box;border:1px solid;border-radius:.25rem;color:#4f5d73;background-color:#fff;border-color:#d8dbe0}.c-header .dropdown-menu,.navbar .dropdown-menu,[data-display^=static]~.dropdown-menu{margin:.125rem 0 0}html:not([dir=rtl]) .c-header .dropdown-menu-left,html:not([dir=rtl]) .navbar .dropdown-menu-left,html:not([dir=rtl]) [data-display^=static]~.dropdown-menu-left{right:auto;left:0}[dir=rtl] .c-header .dropdown-menu-left,[dir=rtl] .navbar .dropdown-menu-left,[dir=rtl] [data-display^=static]~.dropdown-menu-left,html:not([dir=rtl]) .c-header .dropdown-menu-right,html:not([dir=rtl]) .navbar .dropdown-menu-right,html:not([dir=rtl]) [data-display^=static]~.dropdown-menu-right{right:0;left:auto}[dir=rtl] .c-header .dropdown-menu-right,[dir=rtl] .navbar .dropdown-menu-right,[dir=rtl] [data-display^=static]~.dropdown-menu-right{right:auto;left:0}@media (min-width:576px){html:not([dir=rtl]) .c-header .dropdown-menu-sm-left,html:not([dir=rtl]) .navbar .dropdown-menu-sm-left,html:not([dir=rtl]) [data-display^=static]~.dropdown-menu-sm-left{right:auto;left:0}[dir=rtl] .c-header .dropdown-menu-sm-left,[dir=rtl] .navbar .dropdown-menu-sm-left,[dir=rtl] [data-display^=static]~.dropdown-menu-sm-left,html:not([dir=rtl]) .c-header .dropdown-menu-sm-right,html:not([dir=rtl]) .navbar .dropdown-menu-sm-right,html:not([dir=rtl]) [data-display^=static]~.dropdown-menu-sm-right{right:0;left:auto}[dir=rtl] .c-header .dropdown-menu-sm-right,[dir=rtl] .navbar .dropdown-menu-sm-right,[dir=rtl] [data-display^=static]~.dropdown-menu-sm-right{right:auto;left:0}}@media (min-width:768px){html:not([dir=rtl]) .c-header .dropdown-menu-md-left,html:not([dir=rtl]) .navbar .dropdown-menu-md-left,html:not([dir=rtl]) [data-display^=static]~.dropdown-menu-md-left{right:auto;left:0}[dir=rtl] .c-header .dropdown-menu-md-left,[dir=rtl] .navbar .dropdown-menu-md-left,[dir=rtl] [data-display^=static]~.dropdown-menu-md-left,html:not([dir=rtl]) .c-header .dropdown-menu-md-right,html:not([dir=rtl]) .navbar .dropdown-menu-md-right,html:not([dir=rtl]) [data-display^=static]~.dropdown-menu-md-right{right:0;left:auto}[dir=rtl] .c-header .dropdown-menu-md-right,[dir=rtl] .navbar .dropdown-menu-md-right,[dir=rtl] [data-display^=static]~.dropdown-menu-md-right{right:auto;left:0}}@media (min-width:992px){html:not([dir=rtl]) .c-header .dropdown-menu-lg-left,html:not([dir=rtl]) .navbar .dropdown-menu-lg-left,html:not([dir=rtl]) [data-display^=static]~.dropdown-menu-lg-left{right:auto;left:0}[dir=rtl] .c-header .dropdown-menu-lg-left,[dir=rtl] .navbar .dropdown-menu-lg-left,[dir=rtl] [data-display^=static]~.dropdown-menu-lg-left,html:not([dir=rtl]) .c-header .dropdown-menu-lg-right,html:not([dir=rtl]) .navbar .dropdown-menu-lg-right,html:not([dir=rtl]) [data-display^=static]~.dropdown-menu-lg-right{right:0;left:auto}[dir=rtl] .c-header .dropdown-menu-lg-right,[dir=rtl] .navbar .dropdown-menu-lg-right,[dir=rtl] [data-display^=static]~.dropdown-menu-lg-right{right:auto;left:0}}@media (min-width:1200px){html:not([dir=rtl]) .c-header .dropdown-menu-xl-left,html:not([dir=rtl]) .navbar .dropdown-menu-xl-left,html:not([dir=rtl]) [data-display^=static]~.dropdown-menu-xl-left{right:auto;left:0}[dir=rtl] .c-header .dropdown-menu-xl-left,[dir=rtl] .navbar .dropdown-menu-xl-left,[dir=rtl] [data-display^=static]~.dropdown-menu-xl-left,html:not([dir=rtl]) .c-header .dropdown-menu-xl-right,html:not([dir=rtl]) .navbar .dropdown-menu-xl-right,html:not([dir=rtl]) [data-display^=static]~.dropdown-menu-xl-right{right:0;left:auto}[dir=rtl] .c-header .dropdown-menu-xl-right,[dir=rtl] .navbar .dropdown-menu-xl-right,[dir=rtl] [data-display^=static]~.dropdown-menu-xl-right{right:auto;left:0}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}html:not([dir=rtl]) .dropup .dropdown-toggle::after{margin-left:.255em}[dir=rtl] .dropup .dropdown-toggle::after{margin-right:.255em}html:not([dir=rtl]) .dropup .dropdown-toggle:empty::after{margin-left:0}[dir=rtl] .dropup .dropdown-toggle:empty::after{margin-right:0}.dropright .dropdown-menu{top:0;margin-top:0}html:not([dir=rtl]) .dropright .dropdown-menu{right:auto;left:100%;margin-left:.125rem}[dir=rtl] .dropright .dropdown-menu{right:100%;left:auto;margin-right:.125rem}.dropright .dropdown-toggle::after{display:inline-block;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid;vertical-align:0}html:not([dir=rtl]) .dropright .dropdown-toggle::after{margin-left:.255em}[dir=rtl] .dropright .dropdown-toggle::after{margin-right:.255em}html:not([dir=rtl]) .dropright .dropdown-toggle:empty::after{margin-left:0}[dir=rtl] .dropright .dropdown-toggle:empty::after{margin-right:0}.dropleft .dropdown-menu{top:0;margin-top:0}html:not([dir=rtl]) .dropleft .dropdown-menu{right:100%;left:auto;margin-right:.125rem}[dir=rtl] .dropleft .dropdown-menu{right:auto;left:100%;margin-left:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;vertical-align:.255em;content:"";display:none}html:not([dir=rtl]) .dropleft .dropdown-toggle::after{margin-left:.255em}[dir=rtl] .dropleft .dropdown-toggle::after{margin-right:.255em}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent;vertical-align:0}html:not([dir=rtl]) .dropleft .dropdown-toggle:empty::after{margin-left:0}[dir=rtl] .dropleft .dropdown-toggle:empty::after{margin-right:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #d8dbe0}.dropdown-item{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:100%;padding:.5rem 1.25rem;clear:both;font-weight:400;text-align:inherit;white-space:nowrap;background-color:transparent;border:0;color:#4f5d73}.dropdown-item:focus,.dropdown-item:hover{text-decoration:none;color:#455164;background-color:#ebedef}.dropdown-item.active,.dropdown-item:active{text-decoration:none;color:#fff;background-color:#321fdb}.dropdown-item.disabled,.dropdown-item:disabled{pointer-events:none;background-color:transparent;color:#8a93a2}.dropdown-menu.show{display:block}.dropdown-header{margin-bottom:0;font-size:.765625rem;white-space:nowrap;color:#8a93a2}.dropdown-header,.dropdown-item-text{display:block;padding:.5rem 1.25rem}.c-footer,.dropdown-item-text{color:#4f5d73}.c-footer{display:-ms-flexbox;display:flex;-ms-flex:0 0 50px;flex:0 0 50px;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;height:50px;padding:0 1rem;background:#ebedef;border-top:1px solid #d8dbe0}.c-footer[class*=bg-]{border-color:rgba(0,0,21,.1)}.c-footer.c-footer-fixed{position:fixed;right:0;bottom:0;left:0;z-index:1030}.c-footer.c-footer-dark{color:#fff;background:#636f83}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:.875rem;font-weight:400;line-height:1.5;background-clip:padding-box;border:1px solid;color:#768192;background-color:#fff;border-color:#d8dbe0;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #768192}.form-control:focus{color:#768192;background-color:#fff;border-color:#958bef;outline:0;box-shadow:0 0 0 .2rem rgba(50,31,219,.25)}.form-control::-webkit-input-placeholder{color:#8a93a2;opacity:1}.form-control::-moz-placeholder{color:#8a93a2;opacity:1}.form-control:-ms-input-placeholder{color:#8a93a2;opacity:1}.form-control::-ms-input-placeholder{color:#8a93a2;opacity:1}.form-control::placeholder{color:#8a93a2;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#d8dbe0;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#768192;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.09375rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.765625rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:.875rem;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0;color:#4f5d73}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.765625rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.09375rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block}html:not([dir=rtl]) .form-check{padding-left:1.25rem}[dir=rtl] .form-check{padding-right:1.25rem}.form-check-input{position:absolute;margin-top:.3rem}html:not([dir=rtl]) .form-check-input{margin-left:-1.25rem}[dir=rtl] .form-check-input{margin-right:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#768192}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center}html:not([dir=rtl]) .form-check-inline{padding-left:0;margin-right:.75rem}[dir=rtl] .form-check-inline{padding-right:0;margin-left:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0}html:not([dir=rtl]) .form-check-inline .form-check-input{margin-right:.3125rem;margin-left:0}[dir=rtl] .form-check-inline .form-check-input{margin-right:0;margin-left:.3125rem}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#2eb85c}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.765625rem;line-height:1.5;color:#fff;background-color:rgba(46,184,92,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#2eb85c;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%232eb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}html:not([dir=rtl]) .form-control.is-valid,html:not([dir=rtl]) .was-validated .form-control:valid{padding-right:calc(1.5em + .75rem);background-position:right calc(.375em + .1875rem) center}[dir=rtl] .form-control.is-valid,[dir=rtl] .was-validated .form-control:valid{padding-left:calc(1.5em + .75rem);background-position:left calc(.375em + .1875rem) center}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#2eb85c;box-shadow:0 0 0 .2rem rgba(46,184,92,.25)}html:not([dir=rtl]) .was-validated textarea.form-control:valid,html:not([dir=rtl]) textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}[dir=rtl] .was-validated textarea.form-control:valid,[dir=rtl] textarea.form-control.is-valid{padding-left:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) left calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#2eb85c;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23636f83' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%232eb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}html:not([dir=rtl]) .custom-select.is-valid,html:not([dir=rtl]) .was-validated .custom-select:valid{padding-right:calc(.75em + 2.3125rem)}[dir=rtl] .custom-select.is-valid,[dir=rtl] .was-validated .custom-select:valid{padding-left:calc(.75em + 2.3125rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#2eb85c;box-shadow:0 0 0 .2rem rgba(46,184,92,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#2eb85c}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#2eb85c}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#2eb85c}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#48d176;background-color:#48d176}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(46,184,92,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#2eb85c}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#2eb85c;box-shadow:0 0 0 .2rem rgba(46,184,92,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#e55353}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.765625rem;line-height:1.5;color:#fff;background-color:rgba(229,83,83,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#e55353;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e55353' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e55353' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}html:not([dir=rtl]) .form-control.is-invalid,html:not([dir=rtl]) .was-validated .form-control:invalid{padding-right:calc(1.5em + .75rem);background-position:right calc(.375em + .1875rem) center}[dir=rtl] .form-control.is-invalid,[dir=rtl] .was-validated .form-control:invalid{padding-left:calc(1.5em + .75rem);background-position:left calc(.375em + .1875rem) center}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#e55353;box-shadow:0 0 0 .2rem rgba(229,83,83,.25)}html:not([dir=rtl]) .was-validated textarea.form-control:invalid,html:not([dir=rtl]) textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}[dir=rtl] .was-validated textarea.form-control:invalid,[dir=rtl] textarea.form-control.is-invalid{padding-left:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) left calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#e55353;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23636f83' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e55353' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e55353' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}html:not([dir=rtl]) .custom-select.is-invalid,html:not([dir=rtl]) .was-validated .custom-select:invalid{padding-right:calc(.75em + 2.3125rem)}[dir=rtl] .custom-select.is-invalid,[dir=rtl] .was-validated .custom-select:invalid{padding-left:calc(.75em + 2.3125rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#e55353;box-shadow:0 0 0 .2rem rgba(229,83,83,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#e55353}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#e55353}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#e55353}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#ec7f7f;background-color:#ec7f7f}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(229,83,83,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#e55353}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#e55353;box-shadow:0 0 0 .2rem rgba(229,83,83,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{-ms-flex-align:center;-ms-flex-pack:center;justify-content:center}.form-inline .form-group,.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-group{-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto}html:not([dir=rtl]) .form-inline .form-check{padding-left:0}[dir=rtl] .form-inline .form-check{padding-right:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0}html:not([dir=rtl]) .form-inline .form-check-input{margin-right:.25rem;margin-left:0}[dir=rtl] .form-inline .form-check-input{margin-right:0;margin-left:.25rem}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.row.row-equal{margin-right:-15px;margin-left:-15px}.row.row-equal,.row.row-equal [class*=col-]{padding-right:7.5px;padding-left:7.5px}.main .container-fluid,.main .container-lg,.main .container-md,.main .container-sm,.main .container-xl{padding:0 30px}.c-header{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-negative:0;flex-shrink:0;min-height:56px;background:#fff;border-bottom:1px solid #d8dbe0}.c-header[class*=bg-]{border-color:rgba(0,0,21,.1)}.c-header.c-header-fixed{position:fixed;right:0;left:0;z-index:1029}.c-header .c-subheader{border-bottom:0;margin-top:-1px;border-top:1px solid #d8dbe0}.c-header-brand{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;min-height:56px;transition:width .3s}.c-header-brand.c-header-brand-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-center{right:50%}@media (max-width:575.98px){.c-header-brand.c-header-brand-xs-down-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-xs-down-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-xs-down-center{right:50%}}.c-header-brand.c-header-brand-xs-up-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-xs-up-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-xs-up-center{right:50%}@media (max-width:767.98px){.c-header-brand.c-header-brand-sm-down-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-sm-down-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-sm-down-center{right:50%}}@media (min-width:576px){.c-header-brand.c-header-brand-sm-up-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-sm-up-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-sm-up-center{right:50%}}@media (max-width:991.98px){.c-header-brand.c-header-brand-md-down-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-md-down-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-md-down-center{right:50%}}@media (min-width:768px){.c-header-brand.c-header-brand-md-up-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-md-up-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-md-up-center{right:50%}}@media (max-width:1199.98px){.c-header-brand.c-header-brand-lg-down-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-lg-down-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-lg-down-center{right:50%}}@media (min-width:992px){.c-header-brand.c-header-brand-lg-up-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-lg-up-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-lg-up-center{right:50%}}.c-header-brand.c-header-brand-xl-down-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-xl-down-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-xl-down-center{right:50%}@media (min-width:1200px){.c-header-brand.c-header-brand-xl-up-center{position:absolute;top:56px;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}html:not([dir=rtl]) .c-header-brand.c-header-brand-xl-up-center{left:50%}[dir=rtl] .c-header-brand.c-header-brand-xl-up-center{right:50%}}.c-header-toggler{min-width:50px;font-size:1.09375rem;background-color:transparent;border:0;border-radius:.25rem}@media (hover:hover),(-ms-high-contrast:none){.c-header-toggler:hover{color:#4f5d73;text-decoration:none}}.c-header-toggler.focus,.c-header-toggler:focus{outline:0}.c-header-toggler:not(:disabled):not(.c-disabled){cursor:pointer}.c-header-toggler-icon{display:block;height:1.3671875rem;background-repeat:no-repeat;background-position:center center;background-size:100% 100%}.c-header-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;min-height:56px;padding:0;margin-bottom:0;list-style:none}.c-header-nav .c-header-nav-item{position:relative}.c-header-nav .c-header-nav-btn{background-color:transparent;border:1px solid transparent}@media (hover:hover),(-ms-high-contrast:none){.c-header-nav .c-header-nav-btn:hover{text-decoration:none}}.c-header-nav .c-header-nav-btn.focus,.c-header-nav .c-header-nav-btn:focus{outline:0}.c-header-nav .c-header-nav-btn,.c-header-nav .c-header-nav-link{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding-right:.5rem;padding-left:.5rem}.c-header-nav .c-header-nav-btn .badge,.c-header-nav .c-header-nav-link .badge{position:absolute;top:50%;margin-top:-16px}html:not([dir=rtl]) .c-header-nav .c-header-nav-btn .badge,html:not([dir=rtl]) .c-header-nav .c-header-nav-link .badge{left:50%;margin-left:0}[dir=rtl] .c-header-nav .c-header-nav-btn .badge,[dir=rtl] .c-header-nav .c-header-nav-link .badge{right:50%;margin-right:0}.c-header-nav .c-header-nav-btn:hover,.c-header-nav .c-header-nav-link:hover{text-decoration:none}.c-header-nav .dropdown-item{min-width:180px}.c-header.c-header-dark{background:#3c4b64;border-bottom:1px solid #636f83}.c-header.c-header-dark .c-subheader{margin-top:-1px;border-top:1px solid #636f83}.c-header.c-header-dark .c-header-brand{color:#fff;background-color:transparent}.c-header.c-header-dark .c-header-brand:focus,.c-header.c-header-dark .c-header-brand:hover{color:#fff}.c-header.c-header-dark .c-header-nav .c-header-nav-btn,.c-header.c-header-dark .c-header-nav .c-header-nav-link{color:rgba(255,255,255,.75)}.c-header.c-header-dark .c-header-nav .c-header-nav-btn:focus,.c-header.c-header-dark .c-header-nav .c-header-nav-btn:hover,.c-header.c-header-dark .c-header-nav .c-header-nav-link:focus,.c-header.c-header-dark .c-header-nav .c-header-nav-link:hover{color:rgba(255,255,255,.9)}.c-header.c-header-dark .c-header-nav .c-header-nav-btn.c-disabled,.c-header.c-header-dark .c-header-nav .c-header-nav-link.c-disabled{color:rgba(255,255,255,.25)}.c-header.c-header-dark .c-header-nav .c-active>.c-header-nav-link,.c-header.c-header-dark .c-header-nav .c-header-nav-link.c-active,.c-header.c-header-dark .c-header-nav .c-header-nav-link.c-show,.c-header.c-header-dark .c-header-nav .c-show>.c-header-nav-link{color:#fff}.c-header.c-header-dark .c-header-toggler{color:rgba(255,255,255,.75);border-color:rgba(255,255,255,.1)}.c-header.c-header-dark .c-header-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.75)' stroke-width='2.25' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.c-header.c-header-dark .c-header-toggler-icon:hover{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.9)' stroke-width='2.25' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.c-header.c-header-dark .c-header-text{color:rgba(255,255,255,.75)}.c-header.c-header-dark .c-header-text a,.c-header.c-header-dark .c-header-text a:focus,.c-header.c-header-dark .c-header-text a:hover{color:#fff}.c-header .c-header-brand{color:#4f5d73;background-color:transparent}.c-header .c-header-brand:focus,.c-header .c-header-brand:hover{color:#3a4555}.c-header .c-header-nav .c-header-nav-btn,.c-header .c-header-nav .c-header-nav-link{color:rgba(0,0,21,.5)}.c-header .c-header-nav .c-header-nav-btn:focus,.c-header .c-header-nav .c-header-nav-btn:hover,.c-header .c-header-nav .c-header-nav-link:focus,.c-header .c-header-nav .c-header-nav-link:hover{color:rgba(0,0,21,.7)}.c-header .c-header-nav .c-header-nav-btn.c-disabled,.c-header .c-header-nav .c-header-nav-link.c-disabled{color:rgba(0,0,21,.3)}.c-header .c-header-nav .c-active>.c-header-nav-link,.c-header .c-header-nav .c-header-nav-link.c-active,.c-header .c-header-nav .c-header-nav-link.c-show,.c-header .c-header-nav .c-show>.c-header-nav-link{color:rgba(0,0,21,.9)}.c-header .c-header-toggler{color:rgba(0,0,21,.5);border-color:rgba(0,0,21,.1)}.c-header .c-header-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 21, 0.5)' stroke-width='2.25' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.c-header .c-header-toggler-icon:hover{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 21, 0.7)' stroke-width='2.25' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.c-header .c-header-text{color:rgba(0,0,21,.5)}.c-header .c-header-text a,.c-header .c-header-text a:focus,.c-header .c-header-text a:hover{color:rgba(0,0,21,.9)}.c-icon{display:inline-block;color:inherit;text-align:center;fill:currentColor}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size){width:1rem;height:1rem;font-size:1rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-2xl{width:2rem;height:2rem;font-size:2rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-3xl{width:3rem;height:3rem;font-size:3rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-4xl{width:4rem;height:4rem;font-size:4rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-5xl{width:5rem;height:5rem;font-size:5rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-6xl{width:6rem;height:6rem;font-size:6rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-7xl{width:7rem;height:7rem;font-size:7rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-8xl{width:8rem;height:8rem;font-size:8rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-9xl{width:9rem;height:9rem;font-size:9rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-xl{width:1.5rem;height:1.5rem;font-size:1.5rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-lg{width:1.25rem;height:1.25rem;font-size:1.25rem}.c-icon:not(.c-icon-c-s):not(.c-icon-custom-size).c-icon-sm{width:.875rem;height:.875rem;font-size:.875rem}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}html:not([dir=rtl]) .input-group>.custom-file+.custom-file,html:not([dir=rtl]) .input-group>.custom-file+.custom-select,html:not([dir=rtl]) .input-group>.custom-file+.form-control,html:not([dir=rtl]) .input-group>.custom-select+.custom-file,html:not([dir=rtl]) .input-group>.custom-select+.custom-select,html:not([dir=rtl]) .input-group>.custom-select+.form-control,html:not([dir=rtl]) .input-group>.form-control+.custom-file,html:not([dir=rtl]) .input-group>.form-control+.custom-select,html:not([dir=rtl]) .input-group>.form-control+.form-control,html:not([dir=rtl]) .input-group>.form-control-plaintext+.custom-file,html:not([dir=rtl]) .input-group>.form-control-plaintext+.custom-select,html:not([dir=rtl]) .input-group>.form-control-plaintext+.form-control{margin-left:-1px}[dir=rtl] .input-group>.custom-file+.custom-file,[dir=rtl] .input-group>.custom-file+.custom-select,[dir=rtl] .input-group>.custom-file+.form-control,[dir=rtl] .input-group>.custom-select+.custom-file,[dir=rtl] .input-group>.custom-select+.custom-select,[dir=rtl] .input-group>.custom-select+.form-control,[dir=rtl] .input-group>.form-control+.custom-file,[dir=rtl] .input-group>.form-control+.custom-select,[dir=rtl] .input-group>.form-control+.form-control,[dir=rtl] .input-group>.form-control-plaintext+.custom-file,[dir=rtl] .input-group>.form-control-plaintext+.custom-select,[dir=rtl] .input-group>.form-control-plaintext+.form-control{margin-right:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}html:not([dir=rtl]) .input-group>.custom-select:not(:last-child),html:not([dir=rtl]) .input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .input-group>.custom-select:not(:last-child),[dir=rtl] .input-group>.form-control:not(:last-child),html:not([dir=rtl]) .input-group>.custom-select:not(:first-child),html:not([dir=rtl]) .input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .input-group>.custom-select:not(:first-child),[dir=rtl] .input-group>.form-control:not(:first-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}html:not([dir=rtl]) .input-group>.custom-file:not(:last-child) .custom-file-label,html:not([dir=rtl]) .input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .input-group>.custom-file:not(:last-child) .custom-file-label,[dir=rtl] .input-group>.custom-file:not(:last-child) .custom-file-label::after,html:not([dir=rtl]) .input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .input-group>.custom-file:not(:first-child) .custom-file-label{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}html:not([dir=rtl]) .input-group-append .btn+.btn,html:not([dir=rtl]) .input-group-append .btn+.input-group-text,html:not([dir=rtl]) .input-group-append .input-group-text+.btn,html:not([dir=rtl]) .input-group-append .input-group-text+.input-group-text,html:not([dir=rtl]) .input-group-prepend .btn+.btn,html:not([dir=rtl]) .input-group-prepend .btn+.input-group-text,html:not([dir=rtl]) .input-group-prepend .input-group-text+.btn,html:not([dir=rtl]) .input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}[dir=rtl] .input-group-append .btn+.btn,[dir=rtl] .input-group-append .btn+.input-group-text,[dir=rtl] .input-group-append .input-group-text+.btn,[dir=rtl] .input-group-append .input-group-text+.input-group-text,[dir=rtl] .input-group-prepend .btn+.btn,[dir=rtl] .input-group-prepend .btn+.input-group-text,[dir=rtl] .input-group-prepend .input-group-text+.btn,[dir=rtl] .input-group-prepend .input-group-text+.input-group-text{margin-right:-1px}.input-group-prepend{white-space:nowrap;vertical-align:middle}html:not([dir=rtl]) .input-group-prepend{margin-right:-1px}[dir=rtl] .input-group-prepend{margin-left:-1px}.input-group-append{white-space:nowrap;vertical-align:middle}html:not([dir=rtl]) .input-group-append{margin-left:-1px}[dir=rtl] .input-group-append{margin-right:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:.875rem;font-weight:400;line-height:1.5;text-align:center;white-space:nowrap;border:1px solid;border-radius:.25rem;color:#768192;background-color:#ebedef;border-color:#d8dbe0}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.09375rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.765625rem;line-height:1.5;border-radius:.2rem}html:not([dir=rtl]) .input-group-lg>.custom-select,html:not([dir=rtl]) .input-group-sm>.custom-select{padding-right:1.75rem}[dir=rtl] .input-group-lg>.custom-select,[dir=rtl] .input-group-sm>.custom-select{padding-left:1.75rem}html:not([dir=rtl]) .input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),html:not([dir=rtl]) .input-group>.input-group-append:last-child>.input-group-text:not(:last-child),html:not([dir=rtl]) .input-group>.input-group-append:not(:last-child)>.btn,html:not([dir=rtl]) .input-group>.input-group-append:not(:last-child)>.input-group-text,html:not([dir=rtl]) .input-group>.input-group-prepend>.btn,html:not([dir=rtl]) .input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),[dir=rtl] .input-group>.input-group-append:last-child>.input-group-text:not(:last-child),[dir=rtl] .input-group>.input-group-append:not(:last-child)>.btn,[dir=rtl] .input-group>.input-group-append:not(:last-child)>.input-group-text,[dir=rtl] .input-group>.input-group-prepend>.btn,[dir=rtl] .input-group>.input-group-prepend>.input-group-text,html:not([dir=rtl]) .input-group>.input-group-append>.btn,html:not([dir=rtl]) .input-group>.input-group-append>.input-group-text,html:not([dir=rtl]) .input-group>.input-group-prepend:first-child>.btn:not(:first-child),html:not([dir=rtl]) .input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),html:not([dir=rtl]) .input-group>.input-group-prepend:not(:first-child)>.btn,html:not([dir=rtl]) .input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}[dir=rtl] .input-group>.input-group-append>.btn,[dir=rtl] .input-group>.input-group-append>.input-group-text,[dir=rtl] .input-group>.input-group-prepend:first-child>.btn:not(:first-child),[dir=rtl] .input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),[dir=rtl] .input-group>.input-group-prepend:not(:first-child)>.btn,[dir=rtl] .input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#ebedef;border:1px solid #c4c9d0;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#8a93a2}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;border-radius:.3rem;background-color:#d8dbe0}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin-bottom:0;border-radius:.25rem}html:not([dir=rtl]) .list-group{padding-left:0}[dir=rtl] .list-group{padding-right:0}.list-group-item-action{width:100%;text-align:inherit;color:#768192}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;text-decoration:none;color:#768192;background-color:#ebedef}.list-group-item-action:active{color:#4f5d73;background-color:#d8dbe0}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;border:1px solid;background-color:inherit;border-color:rgba(0,0,21,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{pointer-events:none;color:#8a93a2;background-color:inherit}.list-group-item.active{z-index:2;color:#fff;background-color:#321fdb;border-color:#321fdb}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal .list-group-item.active{margin-top:0}.list-group-horizontal .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm .list-group-item.active{margin-top:0}.list-group-horizontal-sm .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md .list-group-item.active{margin-top:0}.list-group-horizontal-md .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg .list-group-item.active{margin-top:0}.list-group-horizontal-lg .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl .list-group-item.active{margin-top:0}.list-group-horizontal-xl .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#1a107c;background-color:#c6c0f5}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#1a107c;background-color:#b2aaf2}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#1a107c;border-color:#1a107c}.list-group-item-secondary{color:#6b6d7a;background-color:#f1f2f4}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#6b6d7a;background-color:#e3e5e9}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#6b6d7a;border-color:#6b6d7a}.list-group-item-success{color:#18603a;background-color:#c4ebd1}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#18603a;background-color:#b1e5c2}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#18603a;border-color:#18603a}.list-group-item-info{color:#1b508f;background-color:#c6e2ff}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#1b508f;background-color:#add5ff}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#1b508f;border-color:#1b508f}.list-group-item-warning{color:#815c15;background-color:#fde9bd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#815c15;background-color:#fce1a4}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#815c15;border-color:#815c15}.list-group-item-danger{color:#772b35;background-color:#f8cfcf}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#772b35;background-color:#f5b9b9}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#772b35;border-color:#772b35}.list-group-item-light{color:#7a7b86;background-color:#f9fafb}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#7a7b86;background-color:#eaedf1}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#7a7b86;border-color:#7a7b86}.list-group-item-dark{color:#333a4e;background-color:#d3d7dc}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#333a4e;background-color:#c5cad1}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#333a4e;border-color:#333a4e}.list-group-accent .list-group-item{margin-bottom:1px;border-top:0;border-right:0;border-bottom:0;border-radius:0}.list-group-accent .list-group-item.list-group-item-divider{position:relative}.list-group-accent .list-group-item.list-group-item-divider::before{position:absolute;bottom:-1px;width:90%;height:1px;content:"";background-color:rgba(0,0,21,.125)}html:not([dir=rtl]) .list-group-accent .list-group-item.list-group-item-divider::before{left:5%}[dir=rtl] .list-group-accent .list-group-item.list-group-item-divider::before{right:5%}.list-group-accent .list-group-item-accent-primary{border-left:4px solid #321fdb}.list-group-accent .list-group-item-accent-secondary{border-left:4px solid #ced2d8}.list-group-accent .list-group-item-accent-success{border-left:4px solid #2eb85c}.list-group-accent .list-group-item-accent-info{border-left:4px solid #39f}.list-group-accent .list-group-item-accent-warning{border-left:4px solid #f9b115}.list-group-accent .list-group-item-accent-danger{border-left:4px solid #e55353}.list-group-accent .list-group-item-accent-light{border-left:4px solid #ebedef}.list-group-accent .list-group-item-accent-dark{border-left:4px solid #636f83}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-clip:padding-box;border:1px solid;border-radius:.3rem;outline:0;background-color:#fff;border-color:rgba(0,0,21,.2)}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000015}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);border-color:#d8dbe0}.modal-header,.modal-header .close{padding:1rem 1rem}html:not([dir=rtl]) .modal-header .close{margin:-1rem -1rem -1rem auto}[dir=rtl] .modal-header .close{margin:-1rem auto -1rem -1rem}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px);border-color:#d8dbe0}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-primary .modal-content{border-color:#321fdb}.modal-primary .modal-header{color:#fff;background-color:#321fdb}.modal-secondary .modal-content{border-color:#ced2d8}.modal-secondary .modal-header{color:#fff;background-color:#ced2d8}.modal-success .modal-content{border-color:#2eb85c}.modal-success .modal-header{color:#fff;background-color:#2eb85c}.modal-info .modal-content{border-color:#39f}.modal-info .modal-header{color:#fff;background-color:#39f}.modal-warning .modal-content{border-color:#f9b115}.modal-warning .modal-header{color:#fff;background-color:#f9b115}.modal-danger .modal-content{border-color:#e55353}.modal-danger .modal-header{color:#fff;background-color:#e55353}.modal-light .modal-content{border-color:#ebedef}.modal-light .modal-header{color:#fff;background-color:#ebedef}.modal-dark .modal-content{border-color:#636f83}.modal-dark .modal-header{color:#fff;background-color:#636f83}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:0;list-style:none}html:not([dir=rtl]) .nav{padding-left:0}[dir=rtl] .nav{padding-right:0}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#8a93a2;pointer-events:none;cursor:default;color:#8a93a2}.nav-tabs{border-bottom:1px solid;border-color:#c4c9d0}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#d8dbe0 #d8dbe0 #c4c9d0}.nav-tabs .nav-link.disabled{background-color:transparent;border-color:transparent;color:#8a93a2}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#768192;background-color:#ebedef;border-color:#c4c9d0 #c4c9d0 #ebedef}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-tabs-boxed .nav-tabs{border:0}.nav-tabs-boxed .nav-tabs .nav-link.active{background-color:#fff;border-bottom-color:#fff}.nav-tabs-boxed .tab-content{padding:.75rem 1.25rem;border:1px solid;border-radius:0 .25rem .25rem .25rem;color:#768192;background-color:#fff;border-color:#d8dbe0}.nav-tabs-boxed.nav-tabs-boxed-top-right .nav-tabs{-ms-flex-pack:end;justify-content:flex-end}.nav-tabs-boxed.nav-tabs-boxed-top-right .tab-content{border-radius:.25rem 0 .25rem .25rem}.nav-tabs-boxed.nav-tabs-boxed-left,.nav-tabs-boxed.nav-tabs-boxed-right{display:-ms-flexbox;display:flex}.nav-tabs-boxed.nav-tabs-boxed-left .nav-item,.nav-tabs-boxed.nav-tabs-boxed-right .nav-item{z-index:1;-ms-flex-positive:1;flex-grow:1;margin-bottom:0}[dir=rtl] .nav-tabs-boxed.nav-tabs-boxed-left{-ms-flex-direction:row-reverse;flex-direction:row-reverse}.nav-tabs-boxed.nav-tabs-boxed-left .nav-item{margin-right:-1px}.nav-tabs-boxed.nav-tabs-boxed-left .nav-link{border-radius:.25rem 0 0 .25rem}.nav-tabs-boxed.nav-tabs-boxed-left .nav-link.active{border-color:#d8dbe0 #fff #d8dbe0 #d8dbe0}html:not([dir=rtl]) .nav-tabs-boxed.nav-tabs-boxed-right{-ms-flex-direction:row-reverse;flex-direction:row-reverse}[dir=rtl] .nav-tabs-boxed.nav-tabs-boxed-right{-ms-flex-direction:row;flex-direction:row}html:not([dir=rtl]) .nav-tabs-boxed.nav-tabs-boxed-right .nav-item{margin-left:-1px}[dir=rtl] .nav-tabs-boxed.nav-tabs-boxed-right .nav-item{margin-right:-1px}.nav-tabs-boxed.nav-tabs-boxed-right .nav-link{border-radius:0 .25rem .25rem 0}.nav-tabs-boxed.nav-tabs-boxed-right .nav-link.active{border-color:#d8dbe0 #d8dbe0 #d8dbe0 #fff}.nav-tabs-boxed.nav-tabs-boxed-right .tab-content{border-radius:.25rem 0 .25rem .25rem}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#321fdb}.nav-underline{border-bottom:2px solid;border-color:#c4c9d0}.nav-underline .nav-item{margin-bottom:-2px}.nav-underline .nav-link{border:0;border-bottom:2px solid transparent}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{background:0 0}.nav-underline-primary .nav-link.active,.nav-underline-primary .show>.nav-link{color:#321fdb;border-color:#321fdb}.nav-underline-secondary .nav-link.active,.nav-underline-secondary .show>.nav-link{color:#ced2d8;border-color:#ced2d8}.nav-underline-success .nav-link.active,.nav-underline-success .show>.nav-link{color:#2eb85c;border-color:#2eb85c}.nav-underline-info .nav-link.active,.nav-underline-info .show>.nav-link{color:#39f;border-color:#39f}.nav-underline-warning .nav-link.active,.nav-underline-warning .show>.nav-link{color:#f9b115;border-color:#f9b115}.nav-underline-danger .nav-link.active,.nav-underline-danger .show>.nav-link{color:#e55353;border-color:#e55353}.nav-underline-light .nav-link.active,.nav-underline-light .show>.nav-link{color:#ebedef;border-color:#ebedef}.nav-underline-dark .nav-link.active,.nav-underline-dark .show>.nav-link{color:#636f83;border-color:#636f83}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.c-sidebar .c-sidebar-close+.nav-tabs .nav-link,.c-sidebar .nav-tabs:first-child .nav-link{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;height:56px;padding-top:0;padding-bottom:0}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3359375rem;padding-bottom:.3359375rem;margin-right:1rem;font-size:1.09375rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin-bottom:0;list-style:none}html:not([dir=rtl]) .navbar-nav{padding-left:0}[dir=rtl] .navbar-nav{padding-right:0}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.09375rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar.navbar-dark .navbar-brand,.navbar.navbar-dark .navbar-brand:focus,.navbar.navbar-dark .navbar-brand:hover{color:#fff}.navbar.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar.navbar-dark .navbar-nav .nav-link:focus,.navbar.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar.navbar-dark .navbar-nav .active>.nav-link,.navbar.navbar-dark .navbar-nav .nav-link.active,.navbar.navbar-dark .navbar-nav .nav-link.show,.navbar.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar.navbar-dark .navbar-text a,.navbar.navbar-dark .navbar-text a:focus,.navbar.navbar-dark .navbar-text a:hover{color:#fff}.navbar.navbar-light .navbar-brand,.navbar.navbar-light .navbar-brand:focus,.navbar.navbar-light .navbar-brand:hover{color:rgba(0,0,21,.9)}.navbar.navbar-light .navbar-nav .nav-link{color:rgba(0,0,21,.5)}.navbar.navbar-light .navbar-nav .nav-link:focus,.navbar.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,21,.7)}.navbar.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,21,.3)}.navbar.navbar-light .navbar-nav .active>.nav-link,.navbar.navbar-light .navbar-nav .nav-link.active,.navbar.navbar-light .navbar-nav .nav-link.show,.navbar.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,21,.9)}.navbar.navbar-light .navbar-toggler{color:rgba(0,0,21,.5);border-color:rgba(0,0,21,.1)}.navbar.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 21, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar.navbar-light .navbar-text{color:rgba(0,0,21,.5)}.navbar.navbar-light .navbar-text a,.navbar.navbar-light .navbar-text a:focus,.navbar.navbar-light .navbar-text a:hover{color:rgba(0,0,21,.9)}.pagination{display:-ms-flexbox;display:flex;list-style:none;border-radius:.25rem}html:not([dir=rtl]) .pagination{padding-left:0}[dir=rtl] .pagination{padding-right:0}.page-link{position:relative;display:block;padding:.5rem .75rem;line-height:1.25;border:1px solid;color:#321fdb;background-color:#fff;border-color:#d8dbe0}html:not([dir=rtl]) .page-link{margin-left:-1px}[dir=rtl] .page-link{margin-right:-1px}.page-link:hover{z-index:2;text-decoration:none;color:#231698;background-color:#d8dbe0;border-color:#c4c9d0}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(50,31,219,.25)}html:not([dir=rtl]) .page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}[dir=rtl] .page-item:first-child .page-link{margin-right:0}[dir=rtl] .page-item:first-child .page-link,html:not([dir=rtl]) .page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}[dir=rtl] .page-item:last-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#321fdb;border-color:#321fdb}.page-item.disabled .page-link{pointer-events:none;cursor:auto;color:#8a93a2;background-color:#fff;border-color:#c4c9d0}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.09375rem;line-height:1.5}html:not([dir=rtl]) .pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}[dir=rtl] .pagination-lg .page-item:first-child .page-link,html:not([dir=rtl]) .pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}[dir=rtl] .pagination-lg .page-item:last-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.765625rem;line-height:1.5}html:not([dir=rtl]) .pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}[dir=rtl] .pagination-sm .page-item:first-child .page-link,html:not([dir=rtl]) .pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}[dir=rtl] .pagination-sm .page-item:last-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.popover{z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.765625rem;word-wrap:break-word;background-clip:padding-box;border:1px solid;border-radius:.3rem;background-color:#fff;border-color:rgba(0,0,21,.2)}.popover .popover-arrow{position:absolute;display:block}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.popover[data-popper-placement^=bottom] .popover-arrow,.popover[data-popper-placement^=top] .popover-arrow{width:1.6rem;height:.5rem;padding:0 .3rem}.popover[data-popper-placement^=left] .popover-arrow,.popover[data-popper-placement^=right] .popover-arrow{width:.5rem;height:1.6rem;padding:.3rem 0;margin:0}.popover[data-popper-placement^=top]{margin-bottom:.5rem!important}.popover[data-popper-placement^=top]>.popover-arrow{bottom:calc(-.5rem - 1px)}.popover[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,21,.25)}.popover[data-popper-placement^=top]>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.popover[data-popper-placement^=right]{margin-left:.5rem!important}.popover[data-popper-placement^=right]>.popover-arrow{left:calc(-.5rem - 1px)}.popover[data-popper-placement^=right]>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,21,.25)}.popover[data-popper-placement^=right]>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.popover[data-popper-placement^=bottom]{margin-top:.5rem!important}.popover[data-popper-placement^=bottom]>.popover-arrow{top:calc(-.5rem - 1px)}.popover[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,21,.25)}.popover[data-popper-placement^=bottom]>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.popover[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid;border-bottom-color:#f7f7f7}.popover[data-popper-placement^=left]{margin-left:.5rem!important}.popover[data-popper-placement^=left]>.popover-arrow{right:calc(-.5rem - 1px)}.popover[data-popper-placement^=left]>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,21,.25)}.popover[data-popper-placement^=left]>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:.875rem;border-bottom:1px solid;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);background-color:#f7f7f7;border-bottom-color:#ebebeb}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#4f5d73}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.65625rem;border-radius:.25rem;background-color:#ebedef}.progress,.progress-bar{display:-ms-flexbox;display:flex;overflow:hidden}.progress-bar{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;text-align:center;white-space:nowrap;transition:width .6s ease;color:#fff;background-color:#321fdb}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.progress-xs{height:4px}.progress-sm{height:8px}.progress.progress-white{background-color:rgba(255,255,255,.2)}.progress.progress-white .progress-bar{background-color:#fff}.progress-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-bottom:1rem}.progress-group-prepend{-ms-flex:0 0 100px;flex:0 0 100px;-ms-flex-item-align:center;align-self:center}.progress-group-icon{font-size:1.09375rem}html:not([dir=rtl]) .progress-group-icon{margin:0 1rem 0 .25rem}[dir=rtl] .progress-group-icon{margin:0 .25rem 0 1rem}.progress-group-text{font-size:.765625rem;color:#768192}.progress-group-header{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-align:end;align-items:flex-end;margin-bottom:.25rem}.progress-group-bars{-ms-flex-positive:1;flex-grow:1;-ms-flex-item-align:center;align-self:center}.progress-group-bars .progress:not(:last-child){margin-bottom:2px}.progress-group-header+.progress-group-bars{-ms-flex-preferred-size:100%;flex-basis:100%}.c-sidebar{position:relative;display:-ms-flexbox;display:flex;-ms-flex:0 0 256px;flex:0 0 256px;-ms-flex-direction:column;flex-direction:column;-ms-flex-order:-1;order:-1;width:256px;padding:0;box-shadow:none;color:#fff;background:#3c4b64;transition:box-shadow .3s .15s,margin-left .3s,margin-right .3s,width .3s,z-index 0s ease .3s,-webkit-transform .3s;transition:box-shadow .3s .15s,transform .3s,margin-left .3s,margin-right .3s,width .3s,z-index 0s ease .3s;transition:box-shadow .3s .15s,transform .3s,margin-left .3s,margin-right .3s,width .3s,z-index 0s ease .3s,-webkit-transform .3s}.c-sidebar.c-sidebar-right{-ms-flex-order:99;order:99}@media (max-width:991.98px){.c-sidebar{--is-mobile:true;position:fixed;top:0;bottom:0;z-index:1031}html:not([dir=rtl]) .c-sidebar:not(.c-sidebar-right){left:0}[dir=rtl] .c-sidebar:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-right{right:0}[dir=rtl] .c-sidebar.c-sidebar-right{left:0}}html:not([dir=rtl]) .c-sidebar:not(.c-sidebar-right){margin-left:-256px}[dir=rtl] .c-sidebar:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-right{margin-right:-256px}[dir=rtl] .c-sidebar.c-sidebar-right{margin-left:-256px;border:0}.c-sidebar[class*=bg-]{border-color:rgba(0,0,21,.1)}.c-sidebar.c-sidebar-sm{-ms-flex:0 0 192px;flex:0 0 192px;width:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-sm:not(.c-sidebar-right){margin-left:-192px}[dir=rtl] .c-sidebar.c-sidebar-sm:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-sm.c-sidebar-right{margin-right:-192px}[dir=rtl] .c-sidebar.c-sidebar-sm.c-sidebar-right{margin-left:-192px}.c-sidebar.c-sidebar-lg{-ms-flex:0 0 320px;flex:0 0 320px;width:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-lg:not(.c-sidebar-right){margin-left:-320px}[dir=rtl] .c-sidebar.c-sidebar-lg:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-lg.c-sidebar-right{margin-right:-320px}[dir=rtl] .c-sidebar.c-sidebar-lg.c-sidebar-right{margin-left:-320px}.c-sidebar.c-sidebar-xl{-ms-flex:0 0 384px;flex:0 0 384px;width:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-xl:not(.c-sidebar-right){margin-left:-384px}[dir=rtl] .c-sidebar.c-sidebar-xl:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-xl.c-sidebar-right{margin-right:-384px}[dir=rtl] .c-sidebar.c-sidebar-xl.c-sidebar-right{margin-left:-384px}@media (min-width:992px){.c-sidebar.c-sidebar-fixed{position:fixed;top:0;bottom:0;z-index:1030}html:not([dir=rtl]) .c-sidebar.c-sidebar-fixed:not(.c-sidebar-right){left:0}[dir=rtl] .c-sidebar.c-sidebar-fixed:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-fixed.c-sidebar-right{right:0}[dir=rtl] .c-sidebar.c-sidebar-fixed.c-sidebar-right{left:0}}.c-sidebar.c-sidebar-overlaid{position:fixed;top:0;bottom:0;z-index:1032}html:not([dir=rtl]) .c-sidebar.c-sidebar-overlaid:not(.c-sidebar-right){left:0}[dir=rtl] .c-sidebar.c-sidebar-overlaid:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-overlaid.c-sidebar-right{right:0}[dir=rtl] .c-sidebar.c-sidebar-overlaid.c-sidebar-right{left:0}.c-sidebar-close{position:absolute;width:56px;height:56px;background:0 0;border:0}@media (hover:hover),(-ms-high-contrast:none){.c-sidebar-close:hover{text-decoration:none}}.c-sidebar-close.focus,.c-sidebar-close:focus{outline:0}html:not([dir=rtl]) .c-sidebar-close{right:0}[dir=rtl] .c-sidebar-close{left:0}.c-sidebar-brand{display:-ms-flexbox;display:flex;-ms-flex:0 0 56px;flex:0 0 56px;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.c-sidebar-brand .c-sidebar-brand-minimized{display:none}.c-sidebar-header{-ms-flex:0 0 auto;flex:0 0 auto;padding:.75rem 1rem;text-align:center;transition:.3s}.c-sidebar-nav{position:relative;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;padding:0;margin-bottom:0;overflow-x:hidden;overflow-y:auto;list-style:none}.c-sidebar-nav.ps{overflow:-moz-scrollbars-none;-ms-overflow-style:none}.c-sidebar-nav.ps::-webkit-scrollbar{width:0!important}.c-sidebar-nav-title{padding:.75rem 1rem;margin-top:1rem;font-size:80%;font-weight:700;text-transform:uppercase;transition:.3s}.c-sidebar-nav-divider{height:10px;transition:height .3s}.c-sidebar-nav-item{width:inherit}.c-sidebar-nav-dropdown-toggle,.c-sidebar-nav-link{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center;padding:.8445rem 1rem;text-decoration:none;white-space:nowrap;transition:background .3s,color .3s}html:not([dir=rtl]) .c-sidebar-nav-dropdown-toggle .badge,html:not([dir=rtl]) .c-sidebar-nav-link .badge{margin-left:auto}[dir=rtl] .c-sidebar-nav-dropdown-toggle .badge,[dir=rtl] .c-sidebar-nav-link .badge{margin-right:auto}.c-disabled.c-sidebar-nav-dropdown-toggle,.c-sidebar-nav-link.c-disabled{cursor:default}@media (hover:hover),(-ms-high-contrast:none){.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar-nav-link:hover{text-decoration:none}}.c-sidebar-nav-icon{-ms-flex:0 0 56px;flex:0 0 56px;height:1.09375rem;font-size:1.09375rem;text-align:center;transition:.3s;fill:currentColor}html:not([dir=rtl]) .c-sidebar-nav-icon:first-child{margin-left:-1rem}[dir=rtl] .c-sidebar-nav-icon:first-child{margin-right:-1rem}.c-sidebar-nav-dropdown{position:relative;transition:background .3s ease-in-out}.c-sidebar-nav-dropdown.c-show>.c-sidebar-nav-dropdown-items{max-height:1500px}html:not([dir=rtl]) .c-sidebar-nav-dropdown.c-show>.c-sidebar-nav-dropdown-toggle::after{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}[dir=rtl] .c-sidebar-nav-dropdown.c-show>.c-sidebar-nav-dropdown-toggle::after{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.c-sidebar-nav-dropdown.c-show+.c-sidebar-nav-dropdown.c-show{margin-top:1px}.c-sidebar-nav-dropdown-toggle{cursor:pointer}.c-sidebar-nav-dropdown-toggle::after{display:block;-ms-flex:0 8px;flex:0 8px;height:8px;content:"";background-repeat:no-repeat;background-position:center;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}html:not([dir=rtl]) .c-sidebar-nav-dropdown-toggle::after{margin-left:auto}[dir=rtl] .c-sidebar-nav-dropdown-toggle::after{margin-right:auto;-webkit-transform:rotate(180deg);transform:rotate(180deg)}html:not([dir=rtl]) .c-sidebar-nav-dropdown-toggle .badge{margin-right:1rem}[dir=rtl] .c-sidebar-nav-dropdown-toggle .badge{margin-left:1rem}.c-sidebar-nav-dropdown-items{max-height:0;padding:0;overflow-y:hidden;list-style:none;transition:max-height .3s ease-in-out}html:not([dir=rtl]) .c-sidebar-nav-dropdown-items .c-sidebar-nav-dropdown-toggle,html:not([dir=rtl]) .c-sidebar-nav-dropdown-items .c-sidebar-nav-link{padding-left:56px}[dir=rtl] .c-sidebar-nav-dropdown-items .c-sidebar-nav-dropdown-toggle,[dir=rtl] .c-sidebar-nav-dropdown-items .c-sidebar-nav-link{padding-right:56px}html:not([dir=rtl]) .c-sidebar-nav-dropdown-items .c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,html:not([dir=rtl]) .c-sidebar-nav-dropdown-items .c-sidebar-nav-link .c-sidebar-nav-icon{margin-left:-56px}[dir=rtl] .c-sidebar-nav-dropdown-items .c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,[dir=rtl] .c-sidebar-nav-dropdown-items .c-sidebar-nav-link .c-sidebar-nav-icon{margin-right:-56px}.c-sidebar-nav-label{display:-ms-flexbox;display:flex;padding:.211125rem 1rem;transition:.3s}.c-sidebar-nav-label:hover{text-decoration:none}.c-sidebar-nav-label .c-sidebar-nav-icon{margin-top:1px}.c-sidebar-footer{-ms-flex:0 0 auto;flex:0 0 auto;padding:.75rem 1rem;transition:.3s}.c-sidebar-minimizer{display:-ms-flexbox;display:flex;-ms-flex:0 0 50px;flex:0 0 50px;-ms-flex-pack:end;justify-content:flex-end;width:inherit;padding:0;cursor:pointer;border:0}@media (max-width:991.98px){.c-sidebar-minimizer{display:none}}.c-sidebar-minimizer::before{display:block;width:50px;height:50px;content:"";background-repeat:no-repeat;background-position:center;background-size:12.5px;transition:.3s}[dir=rtl] .c-sidebar-minimizer::before{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.c-sidebar-minimizer.c-focus,.c-sidebar-minimizer:focus{outline:0}.c-sidebar-right .c-sidebar-minimizer{-ms-flex-pack:start;justify-content:flex-start}html:not([dir=rtl]) .c-sidebar-right .c-sidebar-minimizer::before{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}[dir=rtl] .c-sidebar-right .c-sidebar-minimizer::before{-webkit-transform:rotate(0);transform:rotate(0)}@media (max-width:991.98px){.c-sidebar-backdrop{position:fixed;top:0;left:0;z-index:1030;width:100vw;height:100vh;background-color:#000015;transition:.3s}.c-sidebar-backdrop.c-fade{opacity:0}.c-sidebar-backdrop.c-show{opacity:.5}}@media (min-width:992px){.c-sidebar-minimized{z-index:1031;-ms-flex:0 0 56px;flex:0 0 56px}.c-sidebar-minimized.c-sidebar-fixed{z-index:1031;width:56px}html:not([dir=rtl]) .c-sidebar-minimized:not(.c-sidebar-right){margin-left:-56px}[dir=rtl] .c-sidebar-minimized:not(.c-sidebar-right){margin-right:-56px}html:not([dir=rtl]) .c-sidebar-minimized.c-sidebar-right{margin-right:-56px;margin-left:-56px}.c-sidebar-minimized .c-sidebar-brand-full{display:none}.c-sidebar-minimized .c-sidebar-brand-minimized{display:block}.c-sidebar-minimized .c-sidebar-nav{padding-bottom:50px;overflow:visible}.c-sidebar-minimized .c-d-minimized-none,.c-sidebar-minimized .c-sidebar-footer,.c-sidebar-minimized .c-sidebar-form,.c-sidebar-minimized .c-sidebar-header,.c-sidebar-minimized .c-sidebar-nav-divider,.c-sidebar-minimized .c-sidebar-nav-label,.c-sidebar-minimized .c-sidebar-nav-title{height:0;padding:0;margin:0;visibility:hidden;opacity:0}.c-sidebar-minimized .c-sidebar-minimizer{position:fixed;bottom:0;width:inherit}html:not([dir=rtl]) .c-sidebar-minimized .c-sidebar-minimizer::before{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}[dir=rtl] .c-sidebar-minimized .c-sidebar-minimizer::before,html:not([dir=rtl]) .c-sidebar-minimized.c-sidebar-right .c-sidebar-minimizer::before{-webkit-transform:rotate(0);transform:rotate(0)}[dir=rtl] .c-sidebar-minimized.c-sidebar-right .c-sidebar-minimizer::before{-webkit-transform:rotate(180deg);transform:rotate(180deg)}html:not([dir=rtl]) .c-sidebar-minimized.c-sidebar-right .c-sidebar-nav>.c-sidebar-nav-dropdown:hover,html:not([dir=rtl]) .c-sidebar-minimized.c-sidebar-right .c-sidebar-nav>.c-sidebar-nav-item:hover{margin-left:-256px}[dir=rtl] .c-sidebar-minimized.c-sidebar-right .c-sidebar-nav>.c-sidebar-nav-dropdown:hover,[dir=rtl] .c-sidebar-minimized.c-sidebar-right .c-sidebar-nav>.c-sidebar-nav-item:hover{margin-right:-256px}.c-sidebar-minimized .c-sidebar-nav-dropdown-toggle,.c-sidebar-minimized .c-sidebar-nav-link{overflow:hidden;white-space:nowrap;border-left:0}.c-sidebar-minimized .c-sidebar-nav-dropdown-toggle:hover,.c-sidebar-minimized .c-sidebar-nav-link:hover{width:312px}.c-sidebar-minimized .c-sidebar-nav-dropdown-toggle::after{display:none}.c-sidebar-minimized .c-sidebar-nav-dropdown-items .c-sidebar-nav-dropdown-toggle,.c-sidebar-minimized .c-sidebar-nav-dropdown-items .c-sidebar-nav-link{width:256px}.c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown{position:relative}.c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown>.c-sidebar-nav-dropdown-items,.c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown>.c-sidebar-nav-dropdown-items .c-sidebar-nav-dropdown:not(.c-show)>.c-sidebar-nav-dropdown-items{display:none}.c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown .c-sidebar-nav-dropdown-items{max-height:1500px}.c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown:hover{width:312px;overflow:visible}.c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown:hover>.c-sidebar-nav-dropdown-items{position:absolute;display:inline}html:not([dir=rtl]) .c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown:hover>.c-sidebar-nav-dropdown-items{left:56px}[dir=rtl] .c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown:hover>.c-sidebar-nav-dropdown-items{right:56px}html:not([dir=rtl]) .c-sidebar-minimized.c-sidebar-right>.c-sidebar-nav-dropdown:hover>.c-sidebar-nav-dropdown-items{left:0}[dir=rtl] .c-sidebar-minimized.c-sidebar-right>.c-sidebar-nav-dropdown:hover>.c-sidebar-nav-dropdown-items{right:0}}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right){margin-left:0}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right){margin-right:0}@media (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper{margin-left:256px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper{margin-right:256px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-left:192px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-right:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-left:320px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-right:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-left:384px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-right:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-left:56px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-right:56px}}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right{margin-right:0}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right{margin-left:0}@media (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper{margin-right:256px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper{margin-left:256px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-right:192px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-left:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-right:320px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-left:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-right:384px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-left:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-right:56px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-left:56px}}@media (min-width:576px){html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right){margin-left:0}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right),[dir=rtl] .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right){margin-right:0}}@media (min-width:576px) and (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper{margin-left:256px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper{margin-right:256px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-left:192px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-right:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-left:320px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-right:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-left:384px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-right:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-left:56px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-sm-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-right:56px}}@media (min-width:576px){html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show.c-sidebar-right{margin-right:0}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right,[dir=rtl] .c-sidebar.c-sidebar-sm-show.c-sidebar-right{margin-left:0}}@media (min-width:576px) and (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper{margin-right:256px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-sm-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper{margin-left:256px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-right:192px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-sm-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-left:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-right:320px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-sm-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-left:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-right:384px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-sm-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-left:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-sm-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-right:56px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-sm-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-left:56px}}@media (min-width:768px){html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right){margin-left:0}[dir=rtl] .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right),[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right){margin-right:0}}@media (min-width:768px) and (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper{margin-left:256px}[dir=rtl] .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper{margin-right:256px}html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-left:192px}[dir=rtl] .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-right:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-left:320px}[dir=rtl] .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-right:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-left:384px}[dir=rtl] .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-right:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-left:56px}[dir=rtl] .c-sidebar.c-sidebar-md-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-right:56px}}@media (min-width:768px){html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show.c-sidebar-right,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right{margin-right:0}[dir=rtl] .c-sidebar.c-sidebar-md-show.c-sidebar-right,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right{margin-left:0}}@media (min-width:768px) and (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper{margin-right:256px}[dir=rtl] .c-sidebar.c-sidebar-md-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper{margin-left:256px}html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-right:192px}[dir=rtl] .c-sidebar.c-sidebar-md-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-left:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-right:320px}[dir=rtl] .c-sidebar.c-sidebar-md-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-left:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-right:384px}[dir=rtl] .c-sidebar.c-sidebar-md-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-left:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-md-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-right:56px}[dir=rtl] .c-sidebar.c-sidebar-md-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-left:56px}}@media (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right){margin-left:0}[dir=rtl] .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right),[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right){margin-right:0}}@media (min-width:992px) and (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper{margin-left:256px}[dir=rtl] .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper{margin-right:256px}html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-left:192px}[dir=rtl] .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-right:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-left:320px}[dir=rtl] .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-right:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-left:384px}[dir=rtl] .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-right:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-left:56px}[dir=rtl] .c-sidebar.c-sidebar-lg-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-right:56px}}@media (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show.c-sidebar-right,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right{margin-right:0}[dir=rtl] .c-sidebar.c-sidebar-lg-show.c-sidebar-right,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right{margin-left:0}}@media (min-width:992px) and (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper{margin-right:256px}[dir=rtl] .c-sidebar.c-sidebar-lg-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper{margin-left:256px}html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-right:192px}[dir=rtl] .c-sidebar.c-sidebar-lg-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-left:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-right:320px}[dir=rtl] .c-sidebar.c-sidebar-lg-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-left:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-right:384px}[dir=rtl] .c-sidebar.c-sidebar-lg-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-left:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-lg-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-right:56px}[dir=rtl] .c-sidebar.c-sidebar-lg-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-left:56px}}@media (min-width:1200px){html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right),html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right){margin-left:0}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right),[dir=rtl] .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right){margin-right:0}}@media (min-width:1200px) and (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper{margin-left:256px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right).c-sidebar-fixed~.c-wrapper{margin-right:256px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-left:192px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-right:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-left:320px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-right:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-left:384px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-right:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-left:56px}[dir=rtl] .c-sidebar.c-sidebar-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-xl-show:not(.c-sidebar-right).c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-right:56px}}@media (min-width:1200px){html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show.c-sidebar-right{margin-right:0}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right,[dir=rtl] .c-sidebar.c-sidebar-xl-show.c-sidebar-right{margin-left:0}}@media (min-width:1200px) and (min-width:992px){html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper{margin-right:256px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-xl-show.c-sidebar-right.c-sidebar-fixed~.c-wrapper{margin-left:256px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-right:192px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-xl-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-sm~.c-wrapper{margin-left:192px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-right:320px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-xl-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-lg~.c-wrapper{margin-left:320px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-right:384px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-xl-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-xl~.c-wrapper{margin-left:384px}html:not([dir=rtl]) .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,html:not([dir=rtl]) .c-sidebar.c-sidebar-xl-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-right:56px}[dir=rtl] .c-sidebar.c-sidebar-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper,[dir=rtl] .c-sidebar.c-sidebar-xl-show.c-sidebar-right.c-sidebar-fixed.c-sidebar-minimized~.c-wrapper{margin-left:56px}}.c-sidebar .c-sidebar-brand,.c-sidebar .c-sidebar-close{color:#fff}.c-sidebar .c-sidebar-brand,.c-sidebar .c-sidebar-header{background:rgba(0,0,21,.2)}.c-sidebar .c-sidebar-form .c-form-control{color:#fff;background:rgba(0,0,21,.1);border:0}.c-sidebar .c-sidebar-form .c-form-control::-webkit-input-placeholder{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-form .c-form-control::-moz-placeholder{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-form .c-form-control:-ms-input-placeholder{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-form .c-form-control::-ms-input-placeholder{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-form .c-form-control::placeholder{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-nav-title{color:rgba(255,255,255,.6)}.c-sidebar .c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link{color:rgba(255,255,255,.8);background:0 0}.c-sidebar .c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link .c-sidebar-nav-icon{color:rgba(255,255,255,.5)}.c-sidebar .c-active.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link.c-active{color:#fff;background:rgba(255,255,255,.05)}.c-sidebar .c-active.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-active .c-sidebar-nav-icon{color:#fff}@media (hover:hover),(-ms-high-contrast:none){.c-sidebar .c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-link:hover{color:#fff;background:#321fdb}.c-sidebar .c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link:hover .c-sidebar-nav-icon{color:#fff}.c-sidebar .c-sidebar-nav-link:hover.c-sidebar-nav-dropdown-toggle::after,.c-sidebar :hover.c-sidebar-nav-dropdown-toggle::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='%23fff' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E")}}.c-sidebar .c-disabled.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link.c-disabled{color:#b3b2b2;background:0 0}.c-sidebar .c-disabled.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-disabled .c-sidebar-nav-icon{color:rgba(255,255,255,.5)}.c-sidebar .c-disabled.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-link.c-disabled:hover{color:#b3b2b2}.c-sidebar .c-disabled.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-disabled:hover .c-sidebar-nav-icon{color:rgba(255,255,255,.5)}.c-sidebar .c-disabled:hover.c-sidebar-nav-dropdown-toggle::after,.c-sidebar .c-sidebar-nav-link.c-disabled:hover.c-sidebar-nav-dropdown-toggle::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='%23fff' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E")}.c-sidebar .c-sidebar-nav-dropdown-toggle{position:relative}.c-sidebar .c-sidebar-nav-dropdown-toggle::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='rgba(255, 255, 255, 0.5)' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E")}.c-sidebar .c-sidebar-nav-dropdown.c-show{background:rgba(0,0,0,.2)}.c-sidebar .c-sidebar-nav-dropdown.c-show .c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-dropdown.c-show .c-sidebar-nav-link{color:#fff}.c-sidebar .c-sidebar-nav-dropdown.c-show .c-disabled.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-dropdown.c-show .c-sidebar-nav-link.c-disabled{color:#b3b2b2;background:0 0}.c-sidebar .c-sidebar-nav-dropdown.c-show .c-disabled.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-dropdown.c-show .c-sidebar-nav-link.c-disabled:hover{color:#b3b2b2}.c-sidebar .c-sidebar-nav-dropdown.c-show .c-disabled.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-dropdown.c-show .c-sidebar-nav-link.c-disabled:hover .c-sidebar-nav-icon{color:rgba(255,255,255,.5)}.c-sidebar .c-sidebar-nav-label{color:rgba(255,255,255,.6)}.c-sidebar .c-sidebar-nav-label:hover{color:#fff}.c-sidebar .c-sidebar-nav-label .c-sidebar-nav-icon{color:rgba(255,255,255,.5)}.c-sidebar .c-progress{background-color:#596f94!important}.c-sidebar .c-sidebar-footer{background:rgba(0,0,21,.2)}.c-sidebar .c-sidebar-minimizer{background-color:rgba(0,0,21,.2)}.c-sidebar .c-sidebar-minimizer::before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='%238a93a2' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E")}.c-sidebar .c-sidebar-minimizer.c-focus,.c-sidebar .c-sidebar-minimizer:focus{outline:0}.c-sidebar .c-sidebar-minimizer:hover{background-color:rgba(0,0,0,.3)}.c-sidebar .c-sidebar-minimizer:hover::before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='%23fff' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E")}.c-sidebar.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-dropdown-toggle,.c-sidebar.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-link{background:#321fdb}.c-sidebar.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-link .c-sidebar-nav-icon{color:#fff}.c-sidebar.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-disabled.c-sidebar-nav-dropdown-toggle,.c-sidebar.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-link.c-disabled{background:#3c4b64}.c-sidebar.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-disabled.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-link.c-disabled .c-sidebar-nav-icon{color:rgba(255,255,255,.5)}.c-sidebar.c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown>.c-sidebar-nav-dropdown-items{background:#3c4b64}.c-sidebar.c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown:hover{background:#321fdb}.c-sidebar.c-sidebar-light{color:#4f5d73;background:#fff;border-right:1px solid rgba(159,167,179,.5)}[dir=rtl] .c-sidebar.c-sidebar-light,html:not([dir=rtl]) .c-sidebar.c-sidebar-light.c-sidebar-right{border-right:0;border-left:1px solid rgba(159,167,179,.5)}[dir=rtl] .c-sidebar.c-sidebar-light.c-sidebar-right{border:0;border-right:1px solid rgba(159,167,179,.5)}.c-sidebar.c-sidebar-light .c-sidebar-close{color:#4f5d73}.c-sidebar.c-sidebar-light .c-sidebar-brand{color:#fff;background:#321fdb}.c-sidebar.c-sidebar-light .c-sidebar-header{background:rgba(0,0,21,.2)}.c-sidebar.c-sidebar-light .c-sidebar-form .c-form-control{color:#fff;background:rgba(0,0,21,.1);border:0}.c-sidebar.c-sidebar-light .c-sidebar-form .c-form-control::-webkit-input-placeholder{color:rgba(255,255,255,.7)}.c-sidebar.c-sidebar-light .c-sidebar-form .c-form-control::-moz-placeholder{color:rgba(255,255,255,.7)}.c-sidebar.c-sidebar-light .c-sidebar-form .c-form-control:-ms-input-placeholder{color:rgba(255,255,255,.7)}.c-sidebar.c-sidebar-light .c-sidebar-form .c-form-control::-ms-input-placeholder{color:rgba(255,255,255,.7)}.c-sidebar.c-sidebar-light .c-sidebar-form .c-form-control::placeholder{color:rgba(255,255,255,.7)}.c-sidebar.c-sidebar-light .c-sidebar-nav-title{color:rgba(0,0,21,.4)}.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown-toggle,.c-sidebar.c-sidebar-light .c-sidebar-nav-link{color:rgba(0,0,21,.8);background:0 0}.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar.c-sidebar-light .c-sidebar-nav-link .c-sidebar-nav-icon{color:rgba(0,0,21,.5)}.c-sidebar.c-sidebar-light .c-active.c-sidebar-nav-dropdown-toggle,.c-sidebar.c-sidebar-light .c-sidebar-nav-link.c-active{color:rgba(0,0,21,.8);background:rgba(0,0,21,.05)}.c-sidebar.c-sidebar-light .c-active.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar.c-sidebar-light .c-sidebar-nav-link.c-active .c-sidebar-nav-icon{color:#321fdb}@media (hover:hover),(-ms-high-contrast:none){.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown-toggle:hover,.c-sidebar.c-sidebar-light .c-sidebar-nav-link:hover{color:#fff;background:#321fdb}.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar.c-sidebar-light .c-sidebar-nav-link:hover .c-sidebar-nav-icon{color:#fff}.c-sidebar.c-sidebar-light .c-sidebar-nav-link:hover.c-sidebar-nav-dropdown-toggle::after,.c-sidebar.c-sidebar-light :hover.c-sidebar-nav-dropdown-toggle::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='%23fff' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E")}}.c-sidebar.c-sidebar-light .c-disabled.c-sidebar-nav-dropdown-toggle,.c-sidebar.c-sidebar-light .c-sidebar-nav-link.c-disabled{color:#b3b2b2;background:0 0}.c-sidebar.c-sidebar-light .c-disabled.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar.c-sidebar-light .c-sidebar-nav-link.c-disabled .c-sidebar-nav-icon{color:rgba(0,0,21,.5)}.c-sidebar.c-sidebar-light .c-disabled.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar.c-sidebar-light .c-sidebar-nav-link.c-disabled:hover{color:#b3b2b2}.c-sidebar.c-sidebar-light .c-disabled.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar.c-sidebar-light .c-sidebar-nav-link.c-disabled:hover .c-sidebar-nav-icon{color:rgba(0,0,21,.5)}.c-sidebar.c-sidebar-light .c-disabled:hover.c-sidebar-nav-dropdown-toggle::after,.c-sidebar.c-sidebar-light .c-sidebar-nav-link.c-disabled:hover.c-sidebar-nav-dropdown-toggle::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='%23fff' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E")}.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown-toggle{position:relative}.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown-toggle::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='rgba(0, 0, 21, 0.5)' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E")}.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown.c-show{background:rgba(0,0,0,.05)}.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown.c-show .c-sidebar-nav-dropdown-toggle,.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown.c-show .c-sidebar-nav-link{color:rgba(0,0,21,.8)}.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown.c-show .c-disabled.c-sidebar-nav-dropdown-toggle,.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown.c-show .c-sidebar-nav-link.c-disabled{color:#b3b2b2;background:0 0}.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown.c-show .c-disabled.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown.c-show .c-sidebar-nav-link.c-disabled:hover{color:#b3b2b2}.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown.c-show .c-disabled.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar.c-sidebar-light .c-sidebar-nav-dropdown.c-show .c-sidebar-nav-link.c-disabled:hover .c-sidebar-nav-icon{color:rgba(0,0,21,.5)}.c-sidebar.c-sidebar-light .c-sidebar-nav-label{color:rgba(0,0,21,.4)}.c-sidebar.c-sidebar-light .c-sidebar-nav-label:hover{color:#4f5d73}.c-sidebar.c-sidebar-light .c-sidebar-nav-label .c-sidebar-nav-icon{color:rgba(0,0,21,.5)}.c-sidebar.c-sidebar-light .c-sidebar-footer{background:rgba(0,0,21,.2)}.c-sidebar.c-sidebar-light .c-sidebar-minimizer{background-color:rgba(0,0,0,.05)}.c-sidebar.c-sidebar-light .c-sidebar-minimizer::before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='%238a93a2' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E")}.c-sidebar.c-sidebar-light .c-sidebar-minimizer.c-focus,.c-sidebar.c-sidebar-light .c-sidebar-minimizer:focus{outline:0}.c-sidebar.c-sidebar-light .c-sidebar-minimizer:hover{background-color:rgba(0,0,0,.1)}.c-sidebar.c-sidebar-light .c-sidebar-minimizer:hover::before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='%23768192' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E")}.c-sidebar.c-sidebar-light.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-dropdown-toggle,.c-sidebar.c-sidebar-light.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-link{background:#321fdb}.c-sidebar.c-sidebar-light.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar.c-sidebar-light.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-link .c-sidebar-nav-icon{color:#fff}.c-sidebar.c-sidebar-light.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-disabled.c-sidebar-nav-dropdown-toggle,.c-sidebar.c-sidebar-light.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-link.c-disabled{background:#fff}.c-sidebar.c-sidebar-light.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-disabled.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar.c-sidebar-light.c-sidebar-minimized .c-sidebar-nav-item:hover>.c-sidebar-nav-link.c-disabled .c-sidebar-nav-icon{color:rgba(0,0,21,.5)}.c-sidebar.c-sidebar-light.c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown>.c-sidebar-nav-dropdown-items{background:#fff}.c-sidebar .c-sidebar-nav-link-primary.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-primary,.c-sidebar.c-sidebar-light.c-sidebar-minimized .c-sidebar-nav>.c-sidebar-nav-dropdown:hover{background:#321fdb}.c-sidebar .c-sidebar-nav-link-primary.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-primary .c-sidebar-nav-icon{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-nav-link-primary.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-primary:hover{background:#2d1cc5}.c-sidebar .c-sidebar-nav-link-primary.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-primary:hover .c-sidebar-nav-icon{color:#fff}.c-sidebar .c-sidebar-nav-link-secondary.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-secondary{background:#ced2d8}.c-sidebar .c-sidebar-nav-link-secondary.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-secondary .c-sidebar-nav-icon{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-nav-link-secondary.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-secondary:hover{background:#c0c5cd}.c-sidebar .c-sidebar-nav-link-secondary.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-secondary:hover .c-sidebar-nav-icon{color:#fff}.c-sidebar .c-sidebar-nav-link-success.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-success{background:#2eb85c}.c-sidebar .c-sidebar-nav-link-success.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-success .c-sidebar-nav-icon{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-nav-link-success.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-success:hover{background:#29a452}.c-sidebar .c-sidebar-nav-link-success.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-success:hover .c-sidebar-nav-icon{color:#fff}.c-sidebar .c-sidebar-nav-link-info.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-info{background:#39f}.c-sidebar .c-sidebar-nav-link-info.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-info .c-sidebar-nav-icon{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-nav-link-info.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-info:hover{background:#1a8cff}.c-sidebar .c-sidebar-nav-link-info.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-info:hover .c-sidebar-nav-icon{color:#fff}.c-sidebar .c-sidebar-nav-link-warning.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-warning{background:#f9b115}.c-sidebar .c-sidebar-nav-link-warning.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-warning .c-sidebar-nav-icon{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-nav-link-warning.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-warning:hover{background:#eea506}.c-sidebar .c-sidebar-nav-link-warning.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-warning:hover .c-sidebar-nav-icon{color:#fff}.c-sidebar .c-sidebar-nav-link-danger.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-danger{background:#e55353}.c-sidebar .c-sidebar-nav-link-danger.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-danger .c-sidebar-nav-icon{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-nav-link-danger.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-danger:hover{background:#e23d3d}.c-sidebar .c-sidebar-nav-link-danger.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-danger:hover .c-sidebar-nav-icon{color:#fff}.c-sidebar .c-sidebar-nav-link-light.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-light{background:#ebedef}.c-sidebar .c-sidebar-nav-link-light.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-light .c-sidebar-nav-icon{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-nav-link-light.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-light:hover{background:#dde0e4}.c-sidebar .c-sidebar-nav-link-light.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-light:hover .c-sidebar-nav-icon{color:#fff}.c-sidebar .c-sidebar-nav-link-dark.c-sidebar-nav-dropdown-toggle,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-dark{background:#636f83}.c-sidebar .c-sidebar-nav-link-dark.c-sidebar-nav-dropdown-toggle .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-dark .c-sidebar-nav-icon{color:rgba(255,255,255,.7)}.c-sidebar .c-sidebar-nav-link-dark.c-sidebar-nav-dropdown-toggle:hover,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-dark:hover{background:#586374}.c-sidebar .c-sidebar-nav-link-dark.c-sidebar-nav-dropdown-toggle:hover .c-sidebar-nav-icon,.c-sidebar .c-sidebar-nav-link.c-sidebar-nav-link-dark:hover .c-sidebar-nav-icon{color:#fff}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.c-subheader{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%;min-height:48px;background:#fff;border-bottom:1px solid #d8dbe0}.c-subheader[class*=bg-]{border-color:rgba(0,0,21,.1)}.c-subheader.c-subheader-fixed{position:fixed;right:0;left:0;z-index:1030}.c-subheader-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;min-height:48px;padding:0;margin-bottom:0;list-style:none}.c-subheader-nav .c-subheader-nav-item{position:relative}.c-subheader-nav .c-subheader-nav-btn{background-color:transparent;border:1px solid transparent}.c-subheader-nav .c-subheader-nav-btn,.c-subheader-nav .c-subheader-nav-link{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding-right:.5rem;padding-left:.5rem}.c-subheader-nav .c-subheader-nav-btn .badge,.c-subheader-nav .c-subheader-nav-link .badge{position:absolute;top:50%;margin-top:-16px}html:not([dir=rtl]) .c-subheader-nav .c-subheader-nav-btn .badge,html:not([dir=rtl]) .c-subheader-nav .c-subheader-nav-link .badge{left:50%;margin-left:0}[dir=rtl] .c-subheader-nav .c-subheader-nav-btn .badge,[dir=rtl] .c-subheader-nav .c-subheader-nav-link .badge{right:50%;margin-right:0}.c-subheader-nav .c-subheader-nav-btn:hover,.c-subheader-nav .c-subheader-nav-link:hover{text-decoration:none}.c-subheader.c-subheader-dark{background:#3c4b64;border-bottom:1px solid #636f83}.c-subheader.c-subheader-dark .c-subheader-nav .c-subheader-nav-btn,.c-subheader.c-subheader-dark .c-subheader-nav .c-subheader-nav-link{color:rgba(255,255,255,.75)}.c-subheader.c-subheader-dark .c-subheader-nav .c-subheader-nav-btn:focus,.c-subheader.c-subheader-dark .c-subheader-nav .c-subheader-nav-btn:hover,.c-subheader.c-subheader-dark .c-subheader-nav .c-subheader-nav-link:focus,.c-subheader.c-subheader-dark .c-subheader-nav .c-subheader-nav-link:hover{color:rgba(255,255,255,.9)}.c-subheader.c-subheader-dark .c-subheader-nav .c-subheader-nav-btn.c-disabled,.c-subheader.c-subheader-dark .c-subheader-nav .c-subheader-nav-link.c-disabled{color:rgba(255,255,255,.25)}.c-subheader.c-subheader-dark .c-subheader-nav .c-active>.c-subheader-nav-link,.c-subheader.c-subheader-dark .c-subheader-nav .c-show>.c-subheader-nav-link,.c-subheader.c-subheader-dark .c-subheader-nav .c-subheader-nav-link.c-active,.c-subheader.c-subheader-dark .c-subheader-nav .c-subheader-nav-link.c-show{color:#fff}.c-subheader.c-subheader-dark .c-subheader-text{color:rgba(255,255,255,.75)}.c-subheader.c-subheader-dark .c-subheader-text a,.c-subheader.c-subheader-dark .c-subheader-text a:focus,.c-subheader.c-subheader-dark .c-subheader-text a:hover{color:#fff}.c-subheader .c-subheader-nav .c-subheader-nav-btn,.c-subheader .c-subheader-nav .c-subheader-nav-link{color:rgba(0,0,21,.5)}.c-subheader .c-subheader-nav .c-subheader-nav-btn:focus,.c-subheader .c-subheader-nav .c-subheader-nav-btn:hover,.c-subheader .c-subheader-nav .c-subheader-nav-link:focus,.c-subheader .c-subheader-nav .c-subheader-nav-link:hover{color:rgba(0,0,21,.7)}.c-subheader .c-subheader-nav .c-subheader-nav-btn.c-disabled,.c-subheader .c-subheader-nav .c-subheader-nav-link.c-disabled{color:rgba(0,0,21,.3)}.c-subheader .c-subheader-nav .c-active>.c-subheader-nav-link,.c-subheader .c-subheader-nav .c-show>.c-subheader-nav-link,.c-subheader .c-subheader-nav .c-subheader-nav-link.c-active,.c-subheader .c-subheader-nav .c-subheader-nav-link.c-show{color:rgba(0,0,21,.9)}.c-subheader .c-subheader-text{color:rgba(0,0,21,.5)}.c-subheader .c-subheader-text a,.c-subheader .c-subheader-text a:focus,.c-subheader .c-subheader-text a:hover{color:rgba(0,0,21,.9)}.c-switch{display:inline-block;width:40px;height:26px}.c-switch-input{position:absolute;z-index:-1;opacity:0}.c-switch-slider{position:relative;display:block;height:inherit;cursor:pointer;border:1px solid #d8dbe0;border-radius:.25rem}.c-switch-slider,.c-switch-slider::before{background-color:#fff;transition:.15s ease-out}.c-switch-slider::before{position:absolute;top:2px;left:2px;box-sizing:border-box;width:20px;height:20px;content:"";border:1px solid #d8dbe0;border-radius:.125rem}.c-switch-input:checked~.c-switch-slider::before{-webkit-transform:translateX(14px);transform:translateX(14px)}.c-switch-input:focus~.c-switch-slider{color:#768192;background-color:#fff;border-color:#958bef;outline:0;box-shadow:0 0 0 .2rem rgba(50,31,219,.25)}.c-switch-input:disabled~.c-switch-slider{cursor:not-allowed;opacity:.5}.c-switch-lg{width:48px;height:30px}.c-switch-lg .c-switch-slider{font-size:12px}.c-switch-lg .c-switch-slider::before{width:24px;height:24px}.c-switch-lg .c-switch-slider::after{font-size:12px}.c-switch-lg .c-switch-input:checked~.c-switch-slider::before{-webkit-transform:translateX(18px);transform:translateX(18px)}.c-switch-sm{width:32px;height:22px}.c-switch-sm .c-switch-slider{font-size:8px}.c-switch-sm .c-switch-slider::before{width:16px;height:16px}.c-switch-sm .c-switch-slider::after{font-size:8px}.c-switch-sm .c-switch-input:checked~.c-switch-slider::before{-webkit-transform:translateX(10px);transform:translateX(10px)}.c-switch-label{width:48px}.c-switch-label .c-switch-slider::before{z-index:2}.c-switch-label .c-switch-slider::after{position:absolute;top:50%;z-index:1;width:50%;margin-top:-.5em;font-size:10px;font-weight:600;line-height:1;color:#c4c9d0;text-align:center;text-transform:uppercase;content:attr(data-unchecked);transition:inherit}html:not([dir=rtl]) .c-switch-label .c-switch-slider::after{right:1px}.c-switch-label .c-switch-input:checked~.c-switch-slider::before{-webkit-transform:translateX(22px);transform:translateX(22px)}.c-switch-label .c-switch-input:checked~.c-switch-slider::after{left:1px;color:#fff;content:attr(data-checked)}.c-switch-label.c-switch-lg{width:56px;height:30px}.c-switch-label.c-switch-lg .c-switch-slider{font-size:12px}.c-switch-label.c-switch-lg .c-switch-slider::before{width:24px;height:24px}.c-switch-label.c-switch-lg .c-switch-slider::after{font-size:12px}.c-switch-label.c-switch-lg .c-switch-input:checked~.c-switch-slider::before{-webkit-transform:translateX(26px);transform:translateX(26px)}.c-switch-label.c-switch-sm{width:40px;height:22px}.c-switch-label.c-switch-sm .c-switch-slider{font-size:8px}.c-switch-label.c-switch-sm .c-switch-slider::before{width:16px;height:16px}.c-switch-label.c-switch-sm .c-switch-slider::after{font-size:8px}.c-switch-label.c-switch-sm .c-switch-input:checked~.c-switch-slider::before{-webkit-transform:translateX(18px);transform:translateX(18px)}.c-switch[class*="-3d"] .c-switch-slider{background-color:#ebedef;border-radius:50em}.c-switch[class*="-3d"] .c-switch-slider::before{top:-1px;left:-1px;width:26px;height:26px;border:0;border-radius:50em;box-shadow:0 2px 5px rgba(0,0,21,.3)}.c-switch[class*="-3d"].c-switch-lg{width:48px;height:30px}.c-switch[class*="-3d"].c-switch-lg .c-switch-slider::before{width:30px;height:30px}.c-switch[class*="-3d"].c-switch-lg .c-switch-input:checked~.c-switch-slider::before{-webkit-transform:translateX(18px);transform:translateX(18px)}.c-switch[class*="-3d"].c-switch-sm{width:32px;height:22px}.c-switch[class*="-3d"].c-switch-sm .c-switch-slider::before{width:22px;height:22px}.c-switch[class*="-3d"].c-switch-sm .c-switch-input:checked~.c-switch-slider::before{-webkit-transform:translateX(10px);transform:translateX(10px)}.c-switch-primary .c-switch-input:checked+.c-switch-slider{background-color:#321fdb;border-color:#2819ae}.c-switch-primary .c-switch-input:checked+.c-switch-slider::before{border-color:#2819ae}.c-switch-3d-primary .c-switch-input:checked+.c-switch-slider{background-color:#321fdb}.c-switch-outline-primary .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#321fdb}.c-switch-outline-primary .c-switch-input:checked+.c-switch-slider::before{border-color:#321fdb}.c-switch-outline-primary .c-switch-input:checked+.c-switch-slider::after{color:#321fdb}.c-switch-opposite-primary .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#321fdb}.c-switch-opposite-primary .c-switch-input:checked+.c-switch-slider::before{background-color:#321fdb;border-color:#321fdb}.c-switch-opposite-primary .c-switch-input:checked+.c-switch-slider::after{color:#321fdb}.c-switch-secondary .c-switch-input:checked+.c-switch-slider{background-color:#ced2d8;border-color:#b2b8c1}.c-switch-secondary .c-switch-input:checked+.c-switch-slider::before{border-color:#b2b8c1}.c-switch-3d-secondary .c-switch-input:checked+.c-switch-slider{background-color:#ced2d8}.c-switch-outline-secondary .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#ced2d8}.c-switch-outline-secondary .c-switch-input:checked+.c-switch-slider::before{border-color:#ced2d8}.c-switch-outline-secondary .c-switch-input:checked+.c-switch-slider::after{color:#ced2d8}.c-switch-opposite-secondary .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#ced2d8}.c-switch-opposite-secondary .c-switch-input:checked+.c-switch-slider::before{background-color:#ced2d8;border-color:#ced2d8}.c-switch-opposite-secondary .c-switch-input:checked+.c-switch-slider::after{color:#ced2d8}.c-switch-success .c-switch-input:checked+.c-switch-slider{background-color:#2eb85c;border-color:#248f48}.c-switch-success .c-switch-input:checked+.c-switch-slider::before{border-color:#248f48}.c-switch-3d-success .c-switch-input:checked+.c-switch-slider{background-color:#2eb85c}.c-switch-outline-success .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#2eb85c}.c-switch-outline-success .c-switch-input:checked+.c-switch-slider::before{border-color:#2eb85c}.c-switch-outline-success .c-switch-input:checked+.c-switch-slider::after{color:#2eb85c}.c-switch-opposite-success .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#2eb85c}.c-switch-opposite-success .c-switch-input:checked+.c-switch-slider::before{background-color:#2eb85c;border-color:#2eb85c}.c-switch-opposite-success .c-switch-input:checked+.c-switch-slider::after{color:#2eb85c}.c-switch-info .c-switch-input:checked+.c-switch-slider{background-color:#39f;border-color:#0080ff}.c-switch-info .c-switch-input:checked+.c-switch-slider::before{border-color:#0080ff}.c-switch-3d-info .c-switch-input:checked+.c-switch-slider{background-color:#39f}.c-switch-outline-info .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#39f}.c-switch-outline-info .c-switch-input:checked+.c-switch-slider::before{border-color:#39f}.c-switch-outline-info .c-switch-input:checked+.c-switch-slider::after{color:#39f}.c-switch-opposite-info .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#39f}.c-switch-opposite-info .c-switch-input:checked+.c-switch-slider::before{background-color:#39f;border-color:#39f}.c-switch-opposite-info .c-switch-input:checked+.c-switch-slider::after{color:#39f}.c-switch-warning .c-switch-input:checked+.c-switch-slider{background-color:#f9b115;border-color:#d69405}.c-switch-warning .c-switch-input:checked+.c-switch-slider::before{border-color:#d69405}.c-switch-3d-warning .c-switch-input:checked+.c-switch-slider{background-color:#f9b115}.c-switch-outline-warning .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#f9b115}.c-switch-outline-warning .c-switch-input:checked+.c-switch-slider::before{border-color:#f9b115}.c-switch-outline-warning .c-switch-input:checked+.c-switch-slider::after{color:#f9b115}.c-switch-opposite-warning .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#f9b115}.c-switch-opposite-warning .c-switch-input:checked+.c-switch-slider::before{background-color:#f9b115;border-color:#f9b115}.c-switch-opposite-warning .c-switch-input:checked+.c-switch-slider::after{color:#f9b115}.c-switch-danger .c-switch-input:checked+.c-switch-slider{background-color:#e55353;border-color:#de2727}.c-switch-danger .c-switch-input:checked+.c-switch-slider::before{border-color:#de2727}.c-switch-3d-danger .c-switch-input:checked+.c-switch-slider{background-color:#e55353}.c-switch-outline-danger .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#e55353}.c-switch-outline-danger .c-switch-input:checked+.c-switch-slider::before{border-color:#e55353}.c-switch-outline-danger .c-switch-input:checked+.c-switch-slider::after{color:#e55353}.c-switch-opposite-danger .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#e55353}.c-switch-opposite-danger .c-switch-input:checked+.c-switch-slider::before{background-color:#e55353;border-color:#e55353}.c-switch-opposite-danger .c-switch-input:checked+.c-switch-slider::after{color:#e55353}.c-switch-light .c-switch-input:checked+.c-switch-slider{background-color:#ebedef;border-color:#cfd4d8}.c-switch-light .c-switch-input:checked+.c-switch-slider::before{border-color:#cfd4d8}.c-switch-3d-light .c-switch-input:checked+.c-switch-slider{background-color:#ebedef}.c-switch-outline-light .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#ebedef}.c-switch-outline-light .c-switch-input:checked+.c-switch-slider::before{border-color:#ebedef}.c-switch-outline-light .c-switch-input:checked+.c-switch-slider::after{color:#ebedef}.c-switch-opposite-light .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#ebedef}.c-switch-opposite-light .c-switch-input:checked+.c-switch-slider::before{background-color:#ebedef;border-color:#ebedef}.c-switch-opposite-light .c-switch-input:checked+.c-switch-slider::after{color:#ebedef}.c-switch-dark .c-switch-input:checked+.c-switch-slider{background-color:#636f83;border-color:#4d5666}.c-switch-dark .c-switch-input:checked+.c-switch-slider::before{border-color:#4d5666}.c-switch-3d-dark .c-switch-input:checked+.c-switch-slider{background-color:#636f83}.c-switch-outline-dark .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#636f83}.c-switch-outline-dark .c-switch-input:checked+.c-switch-slider::before{border-color:#636f83}.c-switch-outline-dark .c-switch-input:checked+.c-switch-slider::after{color:#636f83}.c-switch-opposite-dark .c-switch-input:checked+.c-switch-slider{background-color:#fff;border-color:#636f83}.c-switch-opposite-dark .c-switch-input:checked+.c-switch-slider::before{background-color:#636f83;border-color:#636f83}.c-switch-opposite-dark .c-switch-input:checked+.c-switch-slider::after{color:#636f83}.c-switch-pill .c-switch-slider,.c-switch-pill .c-switch-slider::before{border-radius:50em}.c-switch-square .c-switch-slider,.c-switch-square .c-switch-slider::before{border-radius:0}.table{width:100%;margin-bottom:1rem;color:#4f5d73}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid;border-top-color:#d8dbe0}.table thead th{vertical-align:bottom;border-bottom:2px solid;border-bottom-color:#d8dbe0}.table tbody+tbody{border-top:2px solid;border-top-color:#d8dbe0}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid;border-color:#d8dbe0}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,21,.05)}@media (hover:hover),(-ms-high-contrast:none){.table-hover tbody tr:hover{color:#4f5d73;background-color:rgba(0,0,21,.075)}}.table-primary,.table-primary>td,.table-primary>th{color:#4f5d73;background-color:#c6c0f5}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#948bec}@media (hover:hover),(-ms-high-contrast:none){.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b2aaf2}}.table-secondary,.table-secondary>td,.table-secondary>th{color:#4f5d73;background-color:#f1f2f4}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#e6e8eb}@media (hover:hover),(-ms-high-contrast:none){.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#e3e5e9}}.table-success,.table-success>td,.table-success>th{color:#4f5d73;background-color:#c4ebd1}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#92daaa}@media (hover:hover),(-ms-high-contrast:none){.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1e5c2}}.table-info,.table-info>td,.table-info>th{color:#4f5d73;background-color:#c6e2ff}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#95caff}@media (hover:hover),(-ms-high-contrast:none){.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#add5ff}}.table-warning,.table-warning>td,.table-warning>th{color:#4f5d73;background-color:#fde9bd}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#fcd685}@media (hover:hover),(-ms-high-contrast:none){.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fce1a4}}.table-danger,.table-danger>td,.table-danger>th{color:#4f5d73;background-color:#f8cfcf}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#f1a6a6}@media (hover:hover),(-ms-high-contrast:none){.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f5b9b9}}.table-light,.table-light>td,.table-light>th{color:#4f5d73;background-color:#f9fafb}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#f5f6f7}@media (hover:hover),(-ms-high-contrast:none){.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#eaedf1}}.table-dark,.table-dark>td,.table-dark>th{color:#4f5d73;background-color:#d3d7dc}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#aeb4bf}@media (hover:hover),(-ms-high-contrast:none){.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#c5cad1}}.table-active,.table-active>td,.table-active>th{color:#4f5d73;background-color:#d8dbe0}@media (hover:hover),(-ms-high-contrast:none){.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#caced5}}.table-selected,.table-selected>td,.table-selected>th{color:#4f5d73;background-color:#d8dbe0}.table-selected tbody+tbody,.table-selected td,.table-selected th,.table-selected thead th{border-color:#d8dbe0}@media (hover:hover),(-ms-high-contrast:none){.table-hover .table-selected:hover,.table-hover .table-selected:hover>td,.table-hover .table-selected:hover>th{background-color:#caced5}}.table tbody tr:focus{outline:0;color:#4f5d73;background-color:rgba(0,0,21,.075)}.table .thead-dark th{color:#fff;background-color:#636f83;border-color:#758297}.table .thead-light th{color:#768192;background-color:#d8dbe0;border-color:#d8dbe0}.table-dark{color:#fff;background-color:#636f83}.table-dark td,.table-dark th,.table-dark thead th{border-color:#758297}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}@media (hover:hover),(-ms-high-contrast:none){.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.table-outline{border:1px solid;border-color:#d8dbe0}.table-align-middle td,.table-outline td{vertical-align:middle}.table-clear td{border:0}.toast{width:350px;max-width:350px;overflow:hidden;font-size:.875rem;background-clip:padding-box;border:1px solid;box-shadow:0 .25rem .75rem rgba(0,0,21,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem;background-color:rgba(255,255,255,.85);border-color:rgba(0,0,21,.1)}.toast:not(:last-child){margin-bottom:.75rem}.toast.show,.toast.showing{opacity:1}.toast.show{display:block}.toast.hide{display:none}.toast-full{width:100%;max-width:100%}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;background-clip:padding-box;border-bottom:1px solid;color:#8a93a2;background-color:rgba(255,255,255,.85);border-color:rgba(0,0,21,.05)}.toast-body{padding:.75rem}.toaster{display:-ms-flexbox;display:flex;-ms-flex-direction:column-reverse;flex-direction:column-reverse;width:100%;padding:.25rem .5rem}.toaster-bottom-center,.toaster-bottom-full,.toaster-bottom-left,.toaster-bottom-right,.toaster-top-center,.toaster-top-full,.toaster-top-left,.toaster-top-right{position:fixed;z-index:1080;width:350px}.toaster-top-center,.toaster-top-full,.toaster-top-left,.toaster-top-right{top:0}.toaster-bottom-center,.toaster-bottom-full,.toaster-bottom-left,.toaster-bottom-right{bottom:0;-ms-flex-direction:column;flex-direction:column}.toaster-bottom-full,.toaster-top-full{width:auto}.toaster-bottom-center,.toaster-top-center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.toaster-bottom-full,.toaster-bottom-right,.toaster-top-full,.toaster-top-right{right:0}.toaster-bottom-full,.toaster-bottom-left,.toaster-top-full,.toaster-top-left{left:0}.toaster .toast{width:100%;max-width:100%;margin-top:.125rem;margin-bottom:.125rem}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.765625rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.tooltip[data-popper-placement^=bottom],.tooltip[data-popper-placement^=top]{padding:.4rem 0}.tooltip[data-popper-placement^=bottom] .tooltip-arrow,.tooltip[data-popper-placement^=top] .tooltip-arrow{width:.8rem;height:.4rem}.tooltip[data-popper-placement^=left],.tooltip[data-popper-placement^=right]{padding:0 .4rem}.tooltip[data-popper-placement^=left] .tooltip-arrow,.tooltip[data-popper-placement^=right] .tooltip-arrow{width:.4rem;height:.8rem}.tooltip[data-popper-placement^=top] .tooltip-arrow{bottom:0}.tooltip[data-popper-placement^=top] .tooltip-arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000015}.tooltip[data-popper-placement^=right] .tooltip-arrow{left:0}.tooltip[data-popper-placement^=right] .tooltip-arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000015}.tooltip[data-popper-placement^=bottom] .tooltip-arrow{top:0}.tooltip[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000015}.tooltip[data-popper-placement^=left] .tooltip-arrow{right:0}.tooltip[data-popper-placement^=left] .tooltip-arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000015}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000015;border-radius:.25rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}.fade-in{-webkit-animation-name:fadeIn;animation-name:fadeIn;-webkit-animation-duration:1s;animation-duration:1s}.c-wrapper{transition:margin .3s;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;min-width:0;min-height:100vh}.c-sidebar.c-sidebar-unfoldable{transition:margin-left .3s,margin-right .3s,width .3s,z-index 0s ease 0s,-webkit-transform .3s;transition:transform .3s,margin-left .3s,margin-right .3s,width .3s,z-index 0s ease 0s;transition:transform .3s,margin-left .3s,margin-right .3s,width .3s,z-index 0s ease 0s,-webkit-transform .3s}.c-no-layout-transition .c-sidebar,.c-no-layout-transition .c-sidebar .c-sidebar-footer,.c-no-layout-transition .c-sidebar .c-sidebar-header,.c-no-layout-transition .c-sidebar .c-sidebar-minimizer,.c-no-layout-transition .c-sidebar .c-sidebar-nav-divider,.c-no-layout-transition .c-sidebar .c-sidebar-nav-dropdown,.c-no-layout-transition .c-sidebar .c-sidebar-nav-dropdown-items,.c-no-layout-transition .c-sidebar .c-sidebar-nav-dropdown-toggle,.c-no-layout-transition .c-sidebar .c-sidebar-nav-icon,.c-no-layout-transition .c-sidebar .c-sidebar-nav-label,.c-no-layout-transition .c-sidebar .c-sidebar-nav-link,.c-no-layout-transition .c-sidebar .c-sidebar-nav-title,.c-no-layout-transition .c-wrapper,.c-no-layout-transition .c-wrapper .c-sidebar-footer,.c-no-layout-transition .c-wrapper .c-sidebar-header,.c-no-layout-transition .c-wrapper .c-sidebar-minimizer,.c-no-layout-transition .c-wrapper .c-sidebar-nav-divider,.c-no-layout-transition .c-wrapper .c-sidebar-nav-dropdown,.c-no-layout-transition .c-wrapper .c-sidebar-nav-dropdown-items,.c-no-layout-transition .c-wrapper .c-sidebar-nav-dropdown-toggle,.c-no-layout-transition .c-wrapper .c-sidebar-nav-icon,.c-no-layout-transition .c-wrapper .c-sidebar-nav-label,.c-no-layout-transition .c-wrapper .c-sidebar-nav-link,.c-no-layout-transition .c-wrapper .c-sidebar-nav-title,.c-no-transition{transition:none}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.1875rem}.h2,h2{font-size:1.75rem}.h3,h3{font-size:1.53125rem}.h4,h4{font-size:1.3125rem}.h5,h5{font-size:1.09375rem}.h6,h6{font-size:.875rem}.lead{font-size:1.09375rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}.c-vr{width:1px;background-color:rgba(0,0,21,.2)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{list-style:none}html:not([dir=rtl]) .list-unstyled{padding-left:0}[dir=rtl] .list-unstyled{padding-right:0}.list-inline{list-style:none}html:not([dir=rtl]) .list-inline{padding-left:0}[dir=rtl] .list-inline{padding-right:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.09375rem}.blockquote-footer{display:block;font-size:80%;color:#8a93a2}.blockquote-footer::before{content:"\2014\00A0"}@media all and (-ms-high-contrast:none){html{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}}.c-wrapper:not(.c-wrapper-fluid) .c-subheader-fixed{position:relative}.c-wrapper:not(.c-wrapper-fluid) .c-header-fixed{position:-webkit-sticky;position:sticky;top:0}@media all and (-ms-high-contrast:none){.c-wrapper:not(.c-wrapper-fluid) .c-header-fixed{position:fixed;margin:inherit}.c-wrapper:not(.c-wrapper-fluid) .c-header-fixed~.c-body{margin-top:104px}}.c-wrapper:not(.c-wrapper-fluid) .c-footer-fixed{position:-webkit-sticky;position:sticky;bottom:0}@media all and (-ms-high-contrast:none){.c-wrapper:not(.c-wrapper-fluid) .c-footer-fixed{position:fixed;margin:inherit}.c-wrapper:not(.c-wrapper-fluid) .c-footer-fixed~.c-body{margin-bottom:49px}}.c-wrapper:not(.c-wrapper-fluid) .c-body{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-positive:1;flex-grow:1}.c-wrapper.c-wrapper-fluid{min-height:100vh}.c-wrapper.c-wrapper-fluid .c-header-fixed{margin:inherit}.c-main{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:1;flex-grow:1;min-width:0;padding-top:2rem}@media (min-width:768px){.c-main>.container-fluid,.c-main>.container-lg,.c-main>.container-md,.c-main>.container-sm,.c-main>.container-xl{padding-right:30px;padding-left:30px}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#321fdb!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#2819ae!important}.bg-secondary{background-color:#ced2d8!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#b2b8c1!important}.bg-success{background-color:#2eb85c!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#248f48!important}.bg-info{background-color:#39f!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#0080ff!important}.bg-warning{background-color:#f9b115!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d69405!important}.bg-danger{background-color:#e55353!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#de2727!important}.bg-light{background-color:#ebedef!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#cfd4d8!important}.bg-dark{background-color:#636f83!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#4d5666!important}.bg-gradient-primary{background:#1f1498!important;background:linear-gradient(45deg,#321fdb 0,#1f1498 100%)!important;border-color:#1f1498!important}.bg-gradient-secondary{background:#fff!important;background:linear-gradient(45deg,#c8d2dc 0,#fff 100%)!important;border-color:#fff!important}.bg-gradient-success{background:#1b9e3e!important;background:linear-gradient(45deg,#2eb85c 0,#1b9e3e 100%)!important;border-color:#1b9e3e!important}.bg-gradient-info{background:#2982cc!important;background:linear-gradient(45deg,#39f 0,#2982cc 100%)!important;border-color:#2982cc!important}.bg-gradient-warning{background:#f6960b!important;background:linear-gradient(45deg,#f9b115 0,#f6960b 100%)!important;border-color:#f6960b!important}.bg-gradient-danger{background:#d93737!important;background:linear-gradient(45deg,#e55353 0,#d93737 100%)!important;border-color:#d93737!important}.bg-gradient-light{background:#fff!important;background:linear-gradient(45deg,#e3e8ed 0,#fff 100%)!important;border-color:#fff!important}.bg-gradient-dark{background:#212333!important;background:linear-gradient(45deg,#3c4b64 0,#212333 100%)!important;border-color:#212333!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}[class^=bg-]{color:#fff}.bg-facebook{background-color:#3b5998!important}a.bg-facebook:focus,a.bg-facebook:hover,button.bg-facebook:focus,button.bg-facebook:hover{background-color:#2d4373!important}.bg-twitter{background-color:#00aced!important}a.bg-twitter:focus,a.bg-twitter:hover,button.bg-twitter:focus,button.bg-twitter:hover{background-color:#0087ba!important}.bg-linkedin{background-color:#4875b4!important}a.bg-linkedin:focus,a.bg-linkedin:hover,button.bg-linkedin:focus,button.bg-linkedin:hover{background-color:#395d90!important}.bg-flickr{background-color:#ff0084!important}a.bg-flickr:focus,a.bg-flickr:hover,button.bg-flickr:focus,button.bg-flickr:hover{background-color:#cc006a!important}.bg-tumblr{background-color:#32506d!important}a.bg-tumblr:focus,a.bg-tumblr:hover,button.bg-tumblr:focus,button.bg-tumblr:hover{background-color:#22364a!important}.bg-xing{background-color:#026466!important}a.bg-xing:focus,a.bg-xing:hover,button.bg-xing:focus,button.bg-xing:hover{background-color:#013334!important}.bg-github{background-color:#4183c4!important}a.bg-github:focus,a.bg-github:hover,button.bg-github:focus,button.bg-github:hover{background-color:#3269a0!important}.bg-stack-overflow{background-color:#fe7a15!important}a.bg-stack-overflow:focus,a.bg-stack-overflow:hover,button.bg-stack-overflow:focus,button.bg-stack-overflow:hover{background-color:#df6101!important}.bg-youtube{background-color:#b00!important}a.bg-youtube:focus,a.bg-youtube:hover,button.bg-youtube:focus,button.bg-youtube:hover{background-color:#800!important}.bg-dribbble{background-color:#ea4c89!important}a.bg-dribbble:focus,a.bg-dribbble:hover,button.bg-dribbble:focus,button.bg-dribbble:hover{background-color:#e51e6b!important}.bg-instagram{background-color:#517fa4!important}a.bg-instagram:focus,a.bg-instagram:hover,button.bg-instagram:focus,button.bg-instagram:hover{background-color:#406582!important}.bg-pinterest{background-color:#cb2027!important}a.bg-pinterest:focus,a.bg-pinterest:hover,button.bg-pinterest:focus,button.bg-pinterest:hover{background-color:#9f191f!important}.bg-vk{background-color:#45668e!important}a.bg-vk:focus,a.bg-vk:hover,button.bg-vk:focus,button.bg-vk:hover{background-color:#344d6c!important}.bg-yahoo{background-color:#400191!important}a.bg-yahoo:focus,a.bg-yahoo:hover,button.bg-yahoo:focus,button.bg-yahoo:hover{background-color:#2a015e!important}.bg-behance{background-color:#1769ff!important}a.bg-behance:focus,a.bg-behance:hover,button.bg-behance:focus,button.bg-behance:hover{background-color:#0050e3!important}.bg-reddit{background-color:#ff4500!important}a.bg-reddit:focus,a.bg-reddit:hover,button.bg-reddit:focus,button.bg-reddit:hover{background-color:#cc3700!important}.bg-vimeo{background-color:#aad450!important}a.bg-vimeo:focus,a.bg-vimeo:hover,button.bg-vimeo:focus,button.bg-vimeo:hover{background-color:#93c130!important}.bg-gray-100{background-color:#ebedef!important}a.bg-gray-100:focus,a.bg-gray-100:hover,button.bg-gray-100:focus,button.bg-gray-100:hover{background-color:#cfd4d8!important}.bg-gray-200{background-color:#d8dbe0!important}a.bg-gray-200:focus,a.bg-gray-200:hover,button.bg-gray-200:focus,button.bg-gray-200:hover{background-color:#bcc1c9!important}.bg-gray-300{background-color:#c4c9d0!important}a.bg-gray-300:focus,a.bg-gray-300:hover,button.bg-gray-300:focus,button.bg-gray-300:hover{background-color:#a8afb9!important}.bg-gray-400{background-color:#b1b7c1!important}a.bg-gray-400:focus,a.bg-gray-400:hover,button.bg-gray-400:focus,button.bg-gray-400:hover{background-color:#959daa!important}.bg-gray-500{background-color:#9da5b1!important}a.bg-gray-500:focus,a.bg-gray-500:hover,button.bg-gray-500:focus,button.bg-gray-500:hover{background-color:#818b9a!important}.bg-gray-600{background-color:#8a93a2!important}a.bg-gray-600:focus,a.bg-gray-600:hover,button.bg-gray-600:focus,button.bg-gray-600:hover{background-color:#6e798b!important}.bg-gray-700{background-color:#768192!important}a.bg-gray-700:focus,a.bg-gray-700:hover,button.bg-gray-700:focus,button.bg-gray-700:hover{background-color:#5e6877!important}.bg-gray-800{background-color:#636f83!important}a.bg-gray-800:focus,a.bg-gray-800:hover,button.bg-gray-800:focus,button.bg-gray-800:hover{background-color:#4d5666!important}.bg-gray-900{background-color:#4f5d73!important}a.bg-gray-900:focus,a.bg-gray-900:hover,button.bg-gray-900:focus,button.bg-gray-900:hover{background-color:#3a4555!important}.bg-box{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:2.5rem;height:2.5rem}.border{border:1px solid #d8dbe0!important}.border-top{border-top:1px solid #d8dbe0!important}.border-right{border-right:1px solid #d8dbe0!important}.border-bottom{border-bottom:1px solid #d8dbe0!important}.border-left{border-left:1px solid #d8dbe0!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border:1px solid!important;border-color:#321fdb!important}.border-secondary{border:1px solid!important;border-color:#ced2d8!important}.border-success{border:1px solid!important;border-color:#2eb85c!important}.border-info{border:1px solid!important;border-color:#39f!important}.border-warning{border:1px solid!important;border-color:#f9b115!important}.border-danger{border:1px solid!important;border-color:#e55353!important}.border-light{border:1px solid!important;border-color:#ebedef!important}.border-dark{border:1px solid!important;border-color:#636f83!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.b-a-0{border:0!important}.b-t-0{border-top:0!important}.b-r-0{border-right:0!important}.b-b-0{border-bottom:0!important}.b-l-0{border-left:0!important}.b-a-1{border:1px solid #d8dbe0}.b-t-1{border-top:1px solid #d8dbe0}.b-r-1{border-right:1px solid #d8dbe0}.b-b-1{border-bottom:1px solid #d8dbe0}.b-l-1{border-left:1px solid #d8dbe0}.b-a-2{border:2px solid #d8dbe0}.b-t-2{border-top:2px solid #d8dbe0}.b-r-2{border-right:2px solid #d8dbe0}.b-b-2{border-bottom:2px solid #d8dbe0}.b-l-2{border-left:2px solid #d8dbe0}.content-center{position:relative;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:0;text-align:center}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (max-width:575.98px){.d-down-none{display:none!important}}@media (max-width:767.98px){.d-sm-down-none{display:none!important}}@media (max-width:991.98px){.d-md-down-none{display:none!important}}@media (max-width:1199.98px){.d-lg-down-none{display:none!important}}.c-default-theme .c-d-default-none,.d-xl-down-none{display:none!important}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714286%;padding-top:42.85714286%}.embed-responsive-16by9::before{padding-top:56.25%;padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%;padding-top:75%}.embed-responsive-1by1::before{padding-top:100%;padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}html:not([dir=rtl]) .float-left{float:left!important}[dir=rtl] .float-left,html:not([dir=rtl]) .float-right{float:right!important}[dir=rtl] .float-right{float:left!important}.float-none{float:none!important}@media (min-width:576px){html:not([dir=rtl]) .float-sm-left{float:left!important}[dir=rtl] .float-sm-left,html:not([dir=rtl]) .float-sm-right{float:right!important}[dir=rtl] .float-sm-right{float:left!important}.float-sm-none{float:none!important}}@media (min-width:768px){html:not([dir=rtl]) .float-md-left{float:left!important}[dir=rtl] .float-md-left,html:not([dir=rtl]) .float-md-right{float:right!important}[dir=rtl] .float-md-right{float:left!important}.float-md-none{float:none!important}}@media (min-width:992px){html:not([dir=rtl]) .float-lg-left{float:left!important}[dir=rtl] .float-lg-left,html:not([dir=rtl]) .float-lg-right{float:right!important}[dir=rtl] .float-lg-right{float:left!important}.float-lg-none{float:none!important}}@media (min-width:1200px){html:not([dir=rtl]) .float-xl-left{float:left!important}[dir=rtl] .float-xl-left,html:not([dir=rtl]) .float-xl-right{float:right!important}[dir=rtl] .float-xl-right{float:left!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;-ms-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,21,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,21,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,21,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0,html:not([dir=rtl]) .mfs-0{margin-left:0!important}[dir=rtl] .mfs-0,html:not([dir=rtl]) .mfe-0{margin-right:0!important}[dir=rtl] .mfe-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1,html:not([dir=rtl]) .mfs-1{margin-left:.25rem!important}[dir=rtl] .mfs-1,html:not([dir=rtl]) .mfe-1{margin-right:.25rem!important}[dir=rtl] .mfe-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2,html:not([dir=rtl]) .mfs-2{margin-left:.5rem!important}[dir=rtl] .mfs-2,html:not([dir=rtl]) .mfe-2{margin-right:.5rem!important}[dir=rtl] .mfe-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3,html:not([dir=rtl]) .mfs-3{margin-left:1rem!important}[dir=rtl] .mfs-3,html:not([dir=rtl]) .mfe-3{margin-right:1rem!important}[dir=rtl] .mfe-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4,html:not([dir=rtl]) .mfs-4{margin-left:1.5rem!important}[dir=rtl] .mfs-4,html:not([dir=rtl]) .mfe-4{margin-right:1.5rem!important}[dir=rtl] .mfe-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5,html:not([dir=rtl]) .mfs-5{margin-left:3rem!important}[dir=rtl] .mfs-5,html:not([dir=rtl]) .mfe-5{margin-right:3rem!important}[dir=rtl] .mfe-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0,html:not([dir=rtl]) .pfs-0{padding-left:0!important}[dir=rtl] .pfs-0,html:not([dir=rtl]) .pfe-0{padding-right:0!important}[dir=rtl] .pfe-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1,html:not([dir=rtl]) .pfs-1{padding-left:.25rem!important}[dir=rtl] .pfs-1,html:not([dir=rtl]) .pfe-1{padding-right:.25rem!important}[dir=rtl] .pfe-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2,html:not([dir=rtl]) .pfs-2{padding-left:.5rem!important}[dir=rtl] .pfs-2,html:not([dir=rtl]) .pfe-2{padding-right:.5rem!important}[dir=rtl] .pfe-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3,html:not([dir=rtl]) .pfs-3{padding-left:1rem!important}[dir=rtl] .pfs-3,html:not([dir=rtl]) .pfe-3{padding-right:1rem!important}[dir=rtl] .pfe-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4,html:not([dir=rtl]) .pfs-4{padding-left:1.5rem!important}[dir=rtl] .pfs-4,html:not([dir=rtl]) .pfe-4{padding-right:1.5rem!important}[dir=rtl] .pfe-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5,html:not([dir=rtl]) .pfs-5{padding-left:3rem!important}[dir=rtl] .pfs-5,html:not([dir=rtl]) .pfe-5{padding-right:3rem!important}[dir=rtl] .pfe-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1,html:not([dir=rtl]) .mfs-n1{margin-left:-.25rem!important}[dir=rtl] .mfs-n1,html:not([dir=rtl]) .mfe-n1{margin-right:-.25rem!important}[dir=rtl] .mfe-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2,html:not([dir=rtl]) .mfs-n2{margin-left:-.5rem!important}[dir=rtl] .mfs-n2,html:not([dir=rtl]) .mfe-n2{margin-right:-.5rem!important}[dir=rtl] .mfe-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3,html:not([dir=rtl]) .mfs-n3{margin-left:-1rem!important}[dir=rtl] .mfs-n3,html:not([dir=rtl]) .mfe-n3{margin-right:-1rem!important}[dir=rtl] .mfe-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4,html:not([dir=rtl]) .mfs-n4{margin-left:-1.5rem!important}[dir=rtl] .mfs-n4,html:not([dir=rtl]) .mfe-n4{margin-right:-1.5rem!important}[dir=rtl] .mfe-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5,html:not([dir=rtl]) .mfs-n5{margin-left:-3rem!important}[dir=rtl] .mfs-n5,html:not([dir=rtl]) .mfe-n5{margin-right:-3rem!important}[dir=rtl] .mfe-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto,html:not([dir=rtl]) .mfs-auto{margin-left:auto!important}[dir=rtl] .mfs-auto,html:not([dir=rtl]) .mfe-auto{margin-right:auto!important}[dir=rtl] .mfe-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0,html:not([dir=rtl]) .mfs-sm-0{margin-left:0!important}[dir=rtl] .mfs-sm-0,html:not([dir=rtl]) .mfe-sm-0{margin-right:0!important}[dir=rtl] .mfe-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1,html:not([dir=rtl]) .mfs-sm-1{margin-left:.25rem!important}[dir=rtl] .mfs-sm-1,html:not([dir=rtl]) .mfe-sm-1{margin-right:.25rem!important}[dir=rtl] .mfe-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2,html:not([dir=rtl]) .mfs-sm-2{margin-left:.5rem!important}[dir=rtl] .mfs-sm-2,html:not([dir=rtl]) .mfe-sm-2{margin-right:.5rem!important}[dir=rtl] .mfe-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3,html:not([dir=rtl]) .mfs-sm-3{margin-left:1rem!important}[dir=rtl] .mfs-sm-3,html:not([dir=rtl]) .mfe-sm-3{margin-right:1rem!important}[dir=rtl] .mfe-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4,html:not([dir=rtl]) .mfs-sm-4{margin-left:1.5rem!important}[dir=rtl] .mfs-sm-4,html:not([dir=rtl]) .mfe-sm-4{margin-right:1.5rem!important}[dir=rtl] .mfe-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5,html:not([dir=rtl]) .mfs-sm-5{margin-left:3rem!important}[dir=rtl] .mfs-sm-5,html:not([dir=rtl]) .mfe-sm-5{margin-right:3rem!important}[dir=rtl] .mfe-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0,html:not([dir=rtl]) .pfs-sm-0{padding-left:0!important}[dir=rtl] .pfs-sm-0,html:not([dir=rtl]) .pfe-sm-0{padding-right:0!important}[dir=rtl] .pfe-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1,html:not([dir=rtl]) .pfs-sm-1{padding-left:.25rem!important}[dir=rtl] .pfs-sm-1,html:not([dir=rtl]) .pfe-sm-1{padding-right:.25rem!important}[dir=rtl] .pfe-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2,html:not([dir=rtl]) .pfs-sm-2{padding-left:.5rem!important}[dir=rtl] .pfs-sm-2,html:not([dir=rtl]) .pfe-sm-2{padding-right:.5rem!important}[dir=rtl] .pfe-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3,html:not([dir=rtl]) .pfs-sm-3{padding-left:1rem!important}[dir=rtl] .pfs-sm-3,html:not([dir=rtl]) .pfe-sm-3{padding-right:1rem!important}[dir=rtl] .pfe-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4,html:not([dir=rtl]) .pfs-sm-4{padding-left:1.5rem!important}[dir=rtl] .pfs-sm-4,html:not([dir=rtl]) .pfe-sm-4{padding-right:1.5rem!important}[dir=rtl] .pfe-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5,html:not([dir=rtl]) .pfs-sm-5{padding-left:3rem!important}[dir=rtl] .pfs-sm-5,html:not([dir=rtl]) .pfe-sm-5{padding-right:3rem!important}[dir=rtl] .pfe-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1,html:not([dir=rtl]) .mfs-sm-n1{margin-left:-.25rem!important}[dir=rtl] .mfs-sm-n1,html:not([dir=rtl]) .mfe-sm-n1{margin-right:-.25rem!important}[dir=rtl] .mfe-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2,html:not([dir=rtl]) .mfs-sm-n2{margin-left:-.5rem!important}[dir=rtl] .mfs-sm-n2,html:not([dir=rtl]) .mfe-sm-n2{margin-right:-.5rem!important}[dir=rtl] .mfe-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3,html:not([dir=rtl]) .mfs-sm-n3{margin-left:-1rem!important}[dir=rtl] .mfs-sm-n3,html:not([dir=rtl]) .mfe-sm-n3{margin-right:-1rem!important}[dir=rtl] .mfe-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4,html:not([dir=rtl]) .mfs-sm-n4{margin-left:-1.5rem!important}[dir=rtl] .mfs-sm-n4,html:not([dir=rtl]) .mfe-sm-n4{margin-right:-1.5rem!important}[dir=rtl] .mfe-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5,html:not([dir=rtl]) .mfs-sm-n5{margin-left:-3rem!important}[dir=rtl] .mfs-sm-n5,html:not([dir=rtl]) .mfe-sm-n5{margin-right:-3rem!important}[dir=rtl] .mfe-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto,html:not([dir=rtl]) .mfs-sm-auto{margin-left:auto!important}[dir=rtl] .mfs-sm-auto,html:not([dir=rtl]) .mfe-sm-auto{margin-right:auto!important}[dir=rtl] .mfe-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0,html:not([dir=rtl]) .mfs-md-0{margin-left:0!important}[dir=rtl] .mfs-md-0,html:not([dir=rtl]) .mfe-md-0{margin-right:0!important}[dir=rtl] .mfe-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1,html:not([dir=rtl]) .mfs-md-1{margin-left:.25rem!important}[dir=rtl] .mfs-md-1,html:not([dir=rtl]) .mfe-md-1{margin-right:.25rem!important}[dir=rtl] .mfe-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2,html:not([dir=rtl]) .mfs-md-2{margin-left:.5rem!important}[dir=rtl] .mfs-md-2,html:not([dir=rtl]) .mfe-md-2{margin-right:.5rem!important}[dir=rtl] .mfe-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3,html:not([dir=rtl]) .mfs-md-3{margin-left:1rem!important}[dir=rtl] .mfs-md-3,html:not([dir=rtl]) .mfe-md-3{margin-right:1rem!important}[dir=rtl] .mfe-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4,html:not([dir=rtl]) .mfs-md-4{margin-left:1.5rem!important}[dir=rtl] .mfs-md-4,html:not([dir=rtl]) .mfe-md-4{margin-right:1.5rem!important}[dir=rtl] .mfe-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5,html:not([dir=rtl]) .mfs-md-5{margin-left:3rem!important}[dir=rtl] .mfs-md-5,html:not([dir=rtl]) .mfe-md-5{margin-right:3rem!important}[dir=rtl] .mfe-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0,html:not([dir=rtl]) .pfs-md-0{padding-left:0!important}[dir=rtl] .pfs-md-0,html:not([dir=rtl]) .pfe-md-0{padding-right:0!important}[dir=rtl] .pfe-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1,html:not([dir=rtl]) .pfs-md-1{padding-left:.25rem!important}[dir=rtl] .pfs-md-1,html:not([dir=rtl]) .pfe-md-1{padding-right:.25rem!important}[dir=rtl] .pfe-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2,html:not([dir=rtl]) .pfs-md-2{padding-left:.5rem!important}[dir=rtl] .pfs-md-2,html:not([dir=rtl]) .pfe-md-2{padding-right:.5rem!important}[dir=rtl] .pfe-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3,html:not([dir=rtl]) .pfs-md-3{padding-left:1rem!important}[dir=rtl] .pfs-md-3,html:not([dir=rtl]) .pfe-md-3{padding-right:1rem!important}[dir=rtl] .pfe-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4,html:not([dir=rtl]) .pfs-md-4{padding-left:1.5rem!important}[dir=rtl] .pfs-md-4,html:not([dir=rtl]) .pfe-md-4{padding-right:1.5rem!important}[dir=rtl] .pfe-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5,html:not([dir=rtl]) .pfs-md-5{padding-left:3rem!important}[dir=rtl] .pfs-md-5,html:not([dir=rtl]) .pfe-md-5{padding-right:3rem!important}[dir=rtl] .pfe-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1,html:not([dir=rtl]) .mfs-md-n1{margin-left:-.25rem!important}[dir=rtl] .mfs-md-n1,html:not([dir=rtl]) .mfe-md-n1{margin-right:-.25rem!important}[dir=rtl] .mfe-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2,html:not([dir=rtl]) .mfs-md-n2{margin-left:-.5rem!important}[dir=rtl] .mfs-md-n2,html:not([dir=rtl]) .mfe-md-n2{margin-right:-.5rem!important}[dir=rtl] .mfe-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3,html:not([dir=rtl]) .mfs-md-n3{margin-left:-1rem!important}[dir=rtl] .mfs-md-n3,html:not([dir=rtl]) .mfe-md-n3{margin-right:-1rem!important}[dir=rtl] .mfe-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4,html:not([dir=rtl]) .mfs-md-n4{margin-left:-1.5rem!important}[dir=rtl] .mfs-md-n4,html:not([dir=rtl]) .mfe-md-n4{margin-right:-1.5rem!important}[dir=rtl] .mfe-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5,html:not([dir=rtl]) .mfs-md-n5{margin-left:-3rem!important}[dir=rtl] .mfs-md-n5,html:not([dir=rtl]) .mfe-md-n5{margin-right:-3rem!important}[dir=rtl] .mfe-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto,html:not([dir=rtl]) .mfs-md-auto{margin-left:auto!important}[dir=rtl] .mfs-md-auto,html:not([dir=rtl]) .mfe-md-auto{margin-right:auto!important}[dir=rtl] .mfe-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0,html:not([dir=rtl]) .mfs-lg-0{margin-left:0!important}[dir=rtl] .mfs-lg-0,html:not([dir=rtl]) .mfe-lg-0{margin-right:0!important}[dir=rtl] .mfe-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1,html:not([dir=rtl]) .mfs-lg-1{margin-left:.25rem!important}[dir=rtl] .mfs-lg-1,html:not([dir=rtl]) .mfe-lg-1{margin-right:.25rem!important}[dir=rtl] .mfe-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2,html:not([dir=rtl]) .mfs-lg-2{margin-left:.5rem!important}[dir=rtl] .mfs-lg-2,html:not([dir=rtl]) .mfe-lg-2{margin-right:.5rem!important}[dir=rtl] .mfe-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3,html:not([dir=rtl]) .mfs-lg-3{margin-left:1rem!important}[dir=rtl] .mfs-lg-3,html:not([dir=rtl]) .mfe-lg-3{margin-right:1rem!important}[dir=rtl] .mfe-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4,html:not([dir=rtl]) .mfs-lg-4{margin-left:1.5rem!important}[dir=rtl] .mfs-lg-4,html:not([dir=rtl]) .mfe-lg-4{margin-right:1.5rem!important}[dir=rtl] .mfe-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5,html:not([dir=rtl]) .mfs-lg-5{margin-left:3rem!important}[dir=rtl] .mfs-lg-5,html:not([dir=rtl]) .mfe-lg-5{margin-right:3rem!important}[dir=rtl] .mfe-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0,html:not([dir=rtl]) .pfs-lg-0{padding-left:0!important}[dir=rtl] .pfs-lg-0,html:not([dir=rtl]) .pfe-lg-0{padding-right:0!important}[dir=rtl] .pfe-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1,html:not([dir=rtl]) .pfs-lg-1{padding-left:.25rem!important}[dir=rtl] .pfs-lg-1,html:not([dir=rtl]) .pfe-lg-1{padding-right:.25rem!important}[dir=rtl] .pfe-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2,html:not([dir=rtl]) .pfs-lg-2{padding-left:.5rem!important}[dir=rtl] .pfs-lg-2,html:not([dir=rtl]) .pfe-lg-2{padding-right:.5rem!important}[dir=rtl] .pfe-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3,html:not([dir=rtl]) .pfs-lg-3{padding-left:1rem!important}[dir=rtl] .pfs-lg-3,html:not([dir=rtl]) .pfe-lg-3{padding-right:1rem!important}[dir=rtl] .pfe-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4,html:not([dir=rtl]) .pfs-lg-4{padding-left:1.5rem!important}[dir=rtl] .pfs-lg-4,html:not([dir=rtl]) .pfe-lg-4{padding-right:1.5rem!important}[dir=rtl] .pfe-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5,html:not([dir=rtl]) .pfs-lg-5{padding-left:3rem!important}[dir=rtl] .pfs-lg-5,html:not([dir=rtl]) .pfe-lg-5{padding-right:3rem!important}[dir=rtl] .pfe-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1,html:not([dir=rtl]) .mfs-lg-n1{margin-left:-.25rem!important}[dir=rtl] .mfs-lg-n1,html:not([dir=rtl]) .mfe-lg-n1{margin-right:-.25rem!important}[dir=rtl] .mfe-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2,html:not([dir=rtl]) .mfs-lg-n2{margin-left:-.5rem!important}[dir=rtl] .mfs-lg-n2,html:not([dir=rtl]) .mfe-lg-n2{margin-right:-.5rem!important}[dir=rtl] .mfe-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3,html:not([dir=rtl]) .mfs-lg-n3{margin-left:-1rem!important}[dir=rtl] .mfs-lg-n3,html:not([dir=rtl]) .mfe-lg-n3{margin-right:-1rem!important}[dir=rtl] .mfe-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4,html:not([dir=rtl]) .mfs-lg-n4{margin-left:-1.5rem!important}[dir=rtl] .mfs-lg-n4,html:not([dir=rtl]) .mfe-lg-n4{margin-right:-1.5rem!important}[dir=rtl] .mfe-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5,html:not([dir=rtl]) .mfs-lg-n5{margin-left:-3rem!important}[dir=rtl] .mfs-lg-n5,html:not([dir=rtl]) .mfe-lg-n5{margin-right:-3rem!important}[dir=rtl] .mfe-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto,html:not([dir=rtl]) .mfs-lg-auto{margin-left:auto!important}[dir=rtl] .mfs-lg-auto,html:not([dir=rtl]) .mfe-lg-auto{margin-right:auto!important}[dir=rtl] .mfe-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0,html:not([dir=rtl]) .mfs-xl-0{margin-left:0!important}[dir=rtl] .mfs-xl-0,html:not([dir=rtl]) .mfe-xl-0{margin-right:0!important}[dir=rtl] .mfe-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1,html:not([dir=rtl]) .mfs-xl-1{margin-left:.25rem!important}[dir=rtl] .mfs-xl-1,html:not([dir=rtl]) .mfe-xl-1{margin-right:.25rem!important}[dir=rtl] .mfe-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2,html:not([dir=rtl]) .mfs-xl-2{margin-left:.5rem!important}[dir=rtl] .mfs-xl-2,html:not([dir=rtl]) .mfe-xl-2{margin-right:.5rem!important}[dir=rtl] .mfe-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3,html:not([dir=rtl]) .mfs-xl-3{margin-left:1rem!important}[dir=rtl] .mfs-xl-3,html:not([dir=rtl]) .mfe-xl-3{margin-right:1rem!important}[dir=rtl] .mfe-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4,html:not([dir=rtl]) .mfs-xl-4{margin-left:1.5rem!important}[dir=rtl] .mfs-xl-4,html:not([dir=rtl]) .mfe-xl-4{margin-right:1.5rem!important}[dir=rtl] .mfe-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5,html:not([dir=rtl]) .mfs-xl-5{margin-left:3rem!important}[dir=rtl] .mfs-xl-5,html:not([dir=rtl]) .mfe-xl-5{margin-right:3rem!important}[dir=rtl] .mfe-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0,html:not([dir=rtl]) .pfs-xl-0{padding-left:0!important}[dir=rtl] .pfs-xl-0,html:not([dir=rtl]) .pfe-xl-0{padding-right:0!important}[dir=rtl] .pfe-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1,html:not([dir=rtl]) .pfs-xl-1{padding-left:.25rem!important}[dir=rtl] .pfs-xl-1,html:not([dir=rtl]) .pfe-xl-1{padding-right:.25rem!important}[dir=rtl] .pfe-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2,html:not([dir=rtl]) .pfs-xl-2{padding-left:.5rem!important}[dir=rtl] .pfs-xl-2,html:not([dir=rtl]) .pfe-xl-2{padding-right:.5rem!important}[dir=rtl] .pfe-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3,html:not([dir=rtl]) .pfs-xl-3{padding-left:1rem!important}[dir=rtl] .pfs-xl-3,html:not([dir=rtl]) .pfe-xl-3{padding-right:1rem!important}[dir=rtl] .pfe-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4,html:not([dir=rtl]) .pfs-xl-4{padding-left:1.5rem!important}[dir=rtl] .pfs-xl-4,html:not([dir=rtl]) .pfe-xl-4{padding-right:1.5rem!important}[dir=rtl] .pfe-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5,html:not([dir=rtl]) .pfs-xl-5{padding-left:3rem!important}[dir=rtl] .pfs-xl-5,html:not([dir=rtl]) .pfe-xl-5{padding-right:3rem!important}[dir=rtl] .pfe-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1,html:not([dir=rtl]) .mfs-xl-n1{margin-left:-.25rem!important}[dir=rtl] .mfs-xl-n1,html:not([dir=rtl]) .mfe-xl-n1{margin-right:-.25rem!important}[dir=rtl] .mfe-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2,html:not([dir=rtl]) .mfs-xl-n2{margin-left:-.5rem!important}[dir=rtl] .mfs-xl-n2,html:not([dir=rtl]) .mfe-xl-n2{margin-right:-.5rem!important}[dir=rtl] .mfe-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3,html:not([dir=rtl]) .mfs-xl-n3{margin-left:-1rem!important}[dir=rtl] .mfs-xl-n3,html:not([dir=rtl]) .mfe-xl-n3{margin-right:-1rem!important}[dir=rtl] .mfe-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4,html:not([dir=rtl]) .mfs-xl-n4{margin-left:-1.5rem!important}[dir=rtl] .mfs-xl-n4,html:not([dir=rtl]) .mfe-xl-n4{margin-right:-1.5rem!important}[dir=rtl] .mfe-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5,html:not([dir=rtl]) .mfs-xl-n5{margin-left:-3rem!important}[dir=rtl] .mfs-xl-n5,html:not([dir=rtl]) .mfe-xl-n5{margin-right:-3rem!important}[dir=rtl] .mfe-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto,html:not([dir=rtl]) .mfs-xl-auto{margin-left:auto!important}[dir=rtl] .mfs-xl-auto,html:not([dir=rtl]) .mfe-xl-auto{margin-right:auto!important}[dir=rtl] .mfe-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,21,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#321fdb!important}a.text-primary:focus,a.text-primary:hover{color:#231698!important}.text-secondary{color:#ced2d8!important}a.text-secondary:focus,a.text-secondary:hover{color:#a3abb6!important}.text-success{color:#2eb85c!important}a.text-success:focus,a.text-success:hover{color:#1f7b3d!important}.text-info{color:#39f!important}a.text-info:focus,a.text-info:hover{color:#0073e6!important}.text-warning{color:#f9b115!important}a.text-warning:focus,a.text-warning:hover{color:#bd8305!important}.text-danger{color:#e55353!important}a.text-danger:focus,a.text-danger:hover{color:#cd1f1f!important}.text-light{color:#ebedef!important}a.text-light:focus,a.text-light:hover{color:#c1c7cd!important}.text-dark{color:#636f83!important}a.text-dark:focus,a.text-dark:hover{color:#424a57!important}.text-body{color:#4f5d73!important}.text-muted{color:#768192!important}.text-black-50{color:rgba(0,0,21,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.font-xs{font-size:.75rem!important}.font-sm{font-size:.85rem!important}.font-lg{font-size:1rem!important}.font-xl{font-size:1.25rem!important}.font-2xl{font-size:1.5rem!important}.font-3xl{font-size:1.75rem!important}.font-4xl{font-size:2rem!important}.font-5xl{font-size:2.5rem!important}[class^=text-value]{font-weight:600}.text-value-xs{font-size:.65625rem}.text-value-sm{font-size:.74375rem}.text-value{font-size:.875rem}.text-value-lg{font-size:1.3125rem}.text-value-xl{font-size:1.53125rem}.text-white .text-muted{color:rgba(255,255,255,.6)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}[dir=rtl]{direction:rtl;unicode-bidi:embed}[dir=rtl] body{text-align:right}.ie-custom-properties{primary:#321fdb;secondary:#ced2d8;success:#2eb85c;info:#39f;warning:#f9b115;danger:#e55353;light:#ebedef;dark:#636f83;breakpoint-xs:0;breakpoint-sm:576px;breakpoint-md:768px;breakpoint-lg:992px;breakpoint-xl:1200px}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #9da5b1;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000015}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #c4c9d0!important}.table-dark{color:inherit}.table .thead-dark th,.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#d8dbe0}.table .thead-dark th{color:inherit}} -/*# sourceMappingURL=coreui.min.css.map */ \ No newline at end of file diff --git a/ui/app/base/static/assets/vendors/@fontawesome/js/all.min.js b/ui/app/base/static/assets/vendors/@fontawesome/js/all.min.js deleted file mode 100755 index 9c790f948..000000000 --- a/ui/app/base/static/assets/vendors/@fontawesome/js/all.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Font Awesome Free 5.13.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -!function(){"use strict";var c={},l={};try{"undefined"!=typeof window&&(c=window),"undefined"!=typeof document&&(l=document)}catch(c){}var h=(c.navigator||{}).userAgent,z=void 0===h?"":h,a=c,v=l,m=(a.document,!!v.documentElement&&!!v.head&&"function"==typeof v.addEventListener&&v.createElement,~z.indexOf("MSIE")||z.indexOf("Trident/"),"___FONT_AWESOME___"),s=function(){try{return!0}catch(c){return!1}}();var e=a||{};e[m]||(e[m]={}),e[m].styles||(e[m].styles={}),e[m].hooks||(e[m].hooks={}),e[m].shims||(e[m].shims=[]);var t=e[m];function M(c,z){var l=(2>>0;h--;)l[h]=c[h];return l}function gc(c){return c.classList?bc(c.classList):(c.getAttribute("class")||"").split(" ").filter(function(c){return c})}function Ac(c,l){var h,z=l.split("-"),a=z[0],v=z.slice(1).join("-");return a!==c||""===v||(h=v,~T.indexOf(h))?null:v}function Sc(c){return"".concat(c).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function yc(h){return Object.keys(h||{}).reduce(function(c,l){return c+"".concat(l,": ").concat(h[l],";")},"")}function wc(c){return c.size!==Lc.size||c.x!==Lc.x||c.y!==Lc.y||c.rotate!==Lc.rotate||c.flipX||c.flipY}function kc(c){var l=c.transform,h=c.containerWidth,z=c.iconWidth,a={transform:"translate(".concat(h/2," 256)")},v="translate(".concat(32*l.x,", ").concat(32*l.y,") "),m="scale(".concat(l.size/16*(l.flipX?-1:1),", ").concat(l.size/16*(l.flipY?-1:1),") "),s="rotate(".concat(l.rotate," 0 0)");return{outer:a,inner:{transform:"".concat(v," ").concat(m," ").concat(s)},path:{transform:"translate(".concat(z/2*-1," -256)")}}}var Zc={x:0,y:0,width:"100%",height:"100%"};function xc(c){var l=!(1").concat(m.map(Jc).join(""),"")}var $c=function(){};function cl(c){return"string"==typeof(c.getAttribute?c.getAttribute(J):null)}var ll={replace:function(c){var l=c[0],h=c[1].map(function(c){return Jc(c)}).join("\n");if(l.parentNode&&l.outerHTML)l.outerHTML=h+($.keepOriginalSource&&"svg"!==l.tagName.toLowerCase()?"\x3c!-- ".concat(l.outerHTML," --\x3e"):"");else if(l.parentNode){var z=document.createElement("span");l.parentNode.replaceChild(z,l),z.outerHTML=h}},nest:function(c){var l=c[0],h=c[1];if(~gc(l).indexOf($.replacementClass))return ll.replace(c);var z=new RegExp("".concat($.familyPrefix,"-.*"));delete h[0].attributes.style,delete h[0].attributes.id;var a=h[0].attributes.class.split(" ").reduce(function(c,l){return l===$.replacementClass||l.match(z)?c.toSvg.push(l):c.toNode.push(l),c},{toNode:[],toSvg:[]});h[0].attributes.class=a.toSvg.join(" ");var v=h.map(function(c){return Jc(c)}).join("\n");l.setAttribute("class",a.toNode.join(" ")),l.setAttribute(J,""),l.innerHTML=v}};function hl(c){c()}function zl(h,c){var z="function"==typeof c?c:$c;if(0===h.length)z();else{var l=hl;$.mutateApproach===y&&(l=i.requestAnimationFrame||hl),l(function(){var c=!0===$.autoReplaceSvg?ll.replace:ll[$.autoReplaceSvg]||ll.replace,l=_c.begin("mutate");h.map(c),l(),z()})}}var al=!1;function vl(){al=!1}var ml=null;function sl(c){if(t&&$.observeMutations){var a=c.treeCallback,v=c.nodeCallback,m=c.pseudoElementsCallback,l=c.observeMutationsRoot,h=void 0===l?o:l;ml=new t(function(c){al||bc(c).forEach(function(c){if("childList"===c.type&&0 - - - - - - - - - - - - - - Kubeinit.com - {% block title %}{% endblock %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {% block stylesheets %}{% endblock stylesheets %} - - - - - - - - - {% block content %}{% endblock content %} - - {% include 'site_template/scripts.html' %} - - - {% block javascripts %}{% endblock javascripts %} - - - diff --git a/ui/app/base/templates/base-site.html b/ui/app/base/templates/base-site.html deleted file mode 100755 index 020a38239..000000000 --- a/ui/app/base/templates/base-site.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - -{% set titl %} -{% block title %}{% endblock %} -{% endset %} - - - Kubeinit - {{ titl }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {% block stylesheets %}{% endblock stylesheets %} - - - - - - - - {% include 'site_template/sidebar.html' %} - -
- -{% with title=titl %} - {% include 'site_template/navigation.html' %} -{% endwith %} - -
-
- - {% block content %}{% endblock content %} - -
-
- - {% include 'site_template/footer.html' %} - -
- - {% include 'site_template/scripts.html' %} - - - {% block javascripts %}{% endblock javascripts %} - - - diff --git a/ui/app/base/templates/site_template/footer.html b/ui/app/base/templates/site_template/footer.html deleted file mode 100755 index 2f26f952c..000000000 --- a/ui/app/base/templates/site_template/footer.html +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/ui/app/base/templates/site_template/navigation.html b/ui/app/base/templates/site_template/navigation.html deleted file mode 100755 index 6f4787645..000000000 --- a/ui/app/base/templates/site_template/navigation.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - -
- - - Pystol - - -
    - -
-
    -
  • - {% if username and email %} - - Welcome: {{ username }} - {{ email }} - - {% endif %} -
  • -
  • - - - - -
  • -
  • - - - - - -
  • -
-
diff --git a/ui/app/base/templates/site_template/scripts.html b/ui/app/base/templates/site_template/scripts.html deleted file mode 100755 index a32ff071a..000000000 --- a/ui/app/base/templates/site_template/scripts.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/ui/app/base/templates/site_template/sidebar.html b/ui/app/base/templates/site_template/sidebar.html deleted file mode 100755 index 27872ecdd..000000000 --- a/ui/app/base/templates/site_template/sidebar.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - diff --git a/ui/app/executed/__init__.py b/ui/app/executed/__init__.py deleted file mode 100755 index 547fd1455..000000000 --- a/ui/app/executed/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask import Blueprint - -blueprint = Blueprint( - 'executed_blueprint', - __name__, - url_prefix='/executed', - template_folder='templates', - static_folder='static' -) - - -def get_position(): - """Get the position.""" - return 0 - - -def get_category(): - """Get the category.""" - return 1 - - -def get_name(): - """Get the name.""" - return "Executed" - - -def get_icon(): - """Get the icon.""" - return "fa-running" - - -def get_endpoint(): - """Get the endpoint.""" - return "executed_blueprint.executed" diff --git a/ui/app/executed/routes.py b/ui/app/executed/routes.py deleted file mode 100755 index b34cd8ef1..000000000 --- a/ui/app/executed/routes.py +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -# import os - -import app -from app import version as kubeinit_ui_version -from app.base.allocated import compute_allocated_resources -# from app.base.hexa import hexagons_data -from app.base.k8sclient import (cluster_name_configured) -# state_namespaces, -# state_nodes, -# state_pods) -from app.executed import blueprint - -from flask import current_app, redirect, render_template, request, url_for - -# from flask_login import (current_user, -# login_required, -# login_user, -# logout_user) - -from google.cloud import firestore - -from jinja2 import TemplateNotFound - -from pystol.lister import list_actions - -KUBEINIT_VERSION = kubeinit_ui_version.__version__ - -# -# Begin authentication -# -try: - from app.auth.routes import get_session_data - from app.auth.util import remote_cluster -except ImportError: - print("Module not available") - -try: - fdb = firestore.Client() - transaction = fdb.transaction() -except Exception as e: - print("Cant connect to firestore: %s" % (e)) -# -# End authentication -# - - -@blueprint.route('/') -def executed(): - """ - Render all the templates not from base. - - This is a main method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - if 'kubeconfig' not in session or session['kubeconfig'] is None or session['kubeconfig'] == '': - kubeconfig = None - api_client = None - else: - kubeconfig = session['kubeconfig'] - api_client = remote_cluster(kubeconfig=kubeconfig) - - if ('username' not in session or - session['username'] is None or - session['username'] == '' or - 'email' not in session or - session['email'] is None or - session['email'] == ''): - - username = None - email = None - else: - username = session['username'] - email = session['email'] - - try: - return render_template('executed.html', - username=username, email=email, - list_actions=list_actions(api_client=api_client, debug=True), - compute_allocated_resources=compute_allocated_resources( - api_client=api_client), - cluster_name_configured=cluster_name_configured( - api_client=api_client), - kubeinit_version=KUBEINIT_VERSION,) - - except TemplateNotFound: - return render_template('page-404.html'), 404 - except Exception as e: - print("Exception found in %s: %s" % (blueprint.name, e)) - if current_app.config['DEBUG']: - raise e - return render_template('page-500.html'), 500 diff --git a/ui/app/executed/templates/executed.html b/ui/app/executed/templates/executed.html deleted file mode 100755 index 70424e7ca..000000000 --- a/ui/app/executed/templates/executed.html +++ /dev/null @@ -1,119 +0,0 @@ -{% extends "base-site.html" %} - -{% block title %} Executed {% endblock %} - -{% block content %} - -
-
-
-
-
-
Pystol's executed actions
-
- - - - - - - - - - - - {% for action in list_actions %} - - - - - - - - - - {% endfor %} - -
NameCreatedAction StateWorkflow StateOutput
{{ action.name }}{{ action.creationTimestamp }} -{% if action.action_state == 'PystolActionCreating' %} -{{ action.action_state }} -{% elif action.action_state == 'PystolActionRunning' %} -{{ action.action_state }} -{% elif action.action_state == 'PystolActionEndedSuccessfully' %} -{{ action.action_state }} -{% elif action.action_state == 'PystolActionEndedFail' %} -{{ action.action_state }} -{% elif action.action_state == 'PystolActionEndedFailTimeout' %} -{{ action.action_state }} -{% else %} -State not found, report! {{ action.action_state }} -{% endif %} - -{% if action.workflow_state == 'PystolOperatorWaitingAction' %} -{{ action.workflow_state }} -{% elif action.workflow_state == 'PystolOperatorStartProcessingAction' %} -{{ action.workflow_state }} -{% elif action.workflow_state == 'PystolOperatorCreatingJob' %} -{{ action.workflow_state }} -{% elif action.workflow_state == 'PystolOperatorExecutingAction' %} -{{ action.workflow_state }} -{% elif action.workflow_state == 'PystolOperatorEnded' %} -{{ action.workflow_state }} -{% else %} -State not found, report! {{ action.workflow_state }} -{% endif %} -OPEN
-
-
-
- -
- -
-
- -{% for action in list_actions %} - - -{% endfor %} - - -{% endblock content %} - - - - - - -{% block javascripts %} - - - - - - - - -{% endblock javascripts %} diff --git a/ui/app/faq/__init__.py b/ui/app/faq/__init__.py deleted file mode 100755 index 007a7802a..000000000 --- a/ui/app/faq/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask import Blueprint - -blueprint = Blueprint( - 'faq_blueprint', - __name__, - url_prefix='/faq', - template_folder='templates', - static_folder='static' -) - - -def get_position(): - """Get the position.""" - return 0 - - -def get_category(): - """Get the category.""" - return 2 - - -def get_name(): - """Get the name.""" - return "F.A.Q." - - -def get_icon(): - """Get the icon.""" - return "fa-question" - - -def get_endpoint(): - """Get the endpoint.""" - return "faq_blueprint.faq" diff --git a/ui/app/faq/routes.py b/ui/app/faq/routes.py deleted file mode 100755 index 81732aab2..000000000 --- a/ui/app/faq/routes.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -# import os - -import app -from app import version as kubeinit_ui_version -from app.base.allocated import compute_allocated_resources -# from app.base.hexa import hexagons_data -from app.base.k8sclient import (cluster_name_configured) -# state_namespaces, -# state_nodes, -# state_pods) -from app.faq import blueprint - -from flask import current_app, redirect, render_template, request, url_for - -# from flask_login import (current_user, -# login_required, -# login_user, -# logout_user) - -from google.cloud import firestore - -from jinja2 import TemplateNotFound - -KUBEINIT_VERSION = kubeinit_ui_version.__version__ - -# -# Begin authentication -# -try: - from app.auth.routes import get_session_data - from app.auth.util import remote_cluster -except ImportError: - print("Module not available") - -try: - fdb = firestore.Client() - transaction = fdb.transaction() -except Exception as e: - print("Cant connect to firestore: %s" % (e)) -# -# End authentication -# - - -@blueprint.route('/') -def faq(): - """ - Render all the templates not from base. - - This is a main method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - if 'kubeconfig' not in session or session['kubeconfig'] is None or session['kubeconfig'] == '': - kubeconfig = None - api_client = None - else: - kubeconfig = session['kubeconfig'] - api_client = remote_cluster(kubeconfig=kubeconfig) - - if ('username' not in session or - session['username'] is None or - session['username'] == '' or - 'email' not in session or - session['email'] is None or - session['email'] == ''): - - username = None - email = None - else: - username = session['username'] - email = session['email'] - - try: - return render_template('faq.html', - username=username, email=email, - compute_allocated_resources=compute_allocated_resources( - api_client=api_client), - cluster_name_configured=cluster_name_configured( - api_client=api_client), - kubeinit_version=KUBEINIT_VERSION,) - - except TemplateNotFound: - return render_template('page-404.html'), 404 - except Exception as e: - print("Exception found in %s: %s" % (blueprint.name, e)) - if current_app.config['DEBUG']: - raise e - return render_template('page-500.html'), 500 diff --git a/ui/app/faq/templates/faq.html b/ui/app/faq/templates/faq.html deleted file mode 100755 index 32250a5e5..000000000 --- a/ui/app/faq/templates/faq.html +++ /dev/null @@ -1,51 +0,0 @@ -{% extends "base-site.html" %} - -{% block title %} F.A.Q. {% endblock %} - -{% block content %} - -
-
-
-
-
-
Frequently asked questions
-
-
-
- -
-
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
-
-
-
- -
-
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
-
-
-
- -
-
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
-
-
-
-
-
-
-
-
-
- -{% endblock content %} - -{% block javascripts %} - -{% endblock javascripts %} diff --git a/ui/app/home/__init__.py b/ui/app/home/__init__.py deleted file mode 100755 index ae020fe42..000000000 --- a/ui/app/home/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask import Blueprint - -blueprint = Blueprint( - 'home_blueprint', - __name__, - url_prefix='', - template_folder='templates', - static_folder='static' -) diff --git a/ui/app/home/routes.py b/ui/app/home/routes.py deleted file mode 100755 index 2fa817995..000000000 --- a/ui/app/home/routes.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -# import os - -import app -from app import version as kubeinit_ui_version -# from app.base.allocated import compute_allocated_resources -# from app.base.hexa import hexagons_data -# from app.base.k8sclient import (cluster_name_configured, -# state_namespaces, -# state_nodes, -# state_pods) -from app.home import blueprint - -from flask import current_app, redirect, render_template, request, url_for - -# from flask_login import (current_user, -# login_required, -# login_user, -# logout_user) - -from google.cloud import firestore - -from jinja2 import TemplateNotFound - -# from pystol.lister import list_actions, show_actions -# from pystol.operator import insert_pystol_object - -KUBEINIT_VERSION = kubeinit_ui_version.__version__ - -# -# Begin authentication -# -try: - from app.auth.routes import get_session_data - # from app.auth.util import remote_cluster -except ImportError: - print("Module not available") - -try: - fdb = firestore.Client() - transaction = fdb.transaction() -except Exception as e: - print("Cant connect to firestore: %s" % (e)) -# -# End authentication -# - - -@blueprint.route('/') -def home_root(): - """ - Render the index of Pystol. - - This is a main method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - return redirect(url_for('usage_blueprint.usage')) - - -@blueprint.route('/', defaults={'path': ''}) -@blueprint.route('/') -def route_template(path): - """ - Render all the templates not from other blueprints. - - This is a main method - """ - try: - return render_template(path + '.html') - except TemplateNotFound: - return render_template('page-404.html'), 404 - except Exception as e: - print("Exception found in %s: %s" % (blueprint.name, e)) - if current_app.config['DEBUG']: - raise e - return render_template('page-500.html'), 500 diff --git a/ui/app/home/templates/page-403.html b/ui/app/home/templates/page-403.html deleted file mode 100755 index 4fdc62278..000000000 --- a/ui/app/home/templates/page-403.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "base-site-fullscreen.html" %} -{% block title %} 403 {% endblock %} -{% block content %} -
-
-
-
-

403

-

Oops! Not gonna happen.

-

- Wat! You are not authorized to see this... :P - Login -

-
-
-
-
-{% endblock content %} diff --git a/ui/app/home/templates/page-404.html b/ui/app/home/templates/page-404.html deleted file mode 100755 index 64fee9f0f..000000000 --- a/ui/app/home/templates/page-404.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "base-site-fullscreen.html" %} -{% block title %} 404 {% endblock %} -{% block content %} -
-
-
-
-

404

-

Oops! You're lost.

-

- The page you are looking for was not found - Home -

-
-
-
-
-{% endblock content %} diff --git a/ui/app/home/templates/page-500.html b/ui/app/home/templates/page-500.html deleted file mode 100755 index 8424c177f..000000000 --- a/ui/app/home/templates/page-500.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base-site-fullscreen.html" %} -{% block title %} 500 {% endblock %} -{% block content %} -
-
-
-
-

500

-

It is interesting when the thing that must break things breaks!

-

The page you are looking for is temporarily unavailable - Home. -

-
-
-
-{% endblock content %} diff --git a/ui/app/namespaces/__init__.py b/ui/app/namespaces/__init__.py deleted file mode 100755 index 46c4884c9..000000000 --- a/ui/app/namespaces/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask import Blueprint - -blueprint = Blueprint( - 'namespaces_blueprint', - __name__, - url_prefix='/namespaces', - template_folder='templates', - static_folder='static' -) - - -def get_position(): - """Get the position.""" - return 2 - - -def get_category(): - """Get the category.""" - return 0 - - -def get_name(): - """Get the name.""" - return "Namespaces" - - -def get_icon(): - """Get the icon.""" - return "fa-window-restore" - - -def get_endpoint(): - """Get the endpoint.""" - return "namespaces_blueprint.namespaces" diff --git a/ui/app/namespaces/routes.py b/ui/app/namespaces/routes.py deleted file mode 100755 index 369547ac6..000000000 --- a/ui/app/namespaces/routes.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -# import os - -import app -from app import version as kubeinit_ui_version -from app.base.allocated import compute_allocated_resources -# from app.base.hexa import hexagons_data -from app.base.k8sclient import (cluster_name_configured, - state_namespaces) -# state_nodes, -# state_pods) -from app.namespaces import blueprint - -from flask import current_app, redirect, render_template, request, url_for - -# from flask_login import (current_user, -# login_required, -# login_user, -# logout_user) - -from google.cloud import firestore - -from jinja2 import TemplateNotFound - -KUBEINIT_VERSION = kubeinit_ui_version.__version__ - -# -# Begin authentication -# -try: - from app.auth.routes import get_session_data - from app.auth.util import remote_cluster -except ImportError: - print("Module not available") - -try: - fdb = firestore.Client() - transaction = fdb.transaction() -except Exception as e: - print("Cant connect to firestore: %s" % (e)) -# -# End authentication -# - - -@blueprint.route('/') -def namespaces(): - """ - Render all the templates not from base. - - This is a main method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - if 'kubeconfig' not in session or session['kubeconfig'] is None or session['kubeconfig'] == '': - kubeconfig = None - api_client = None - else: - kubeconfig = session['kubeconfig'] - api_client = remote_cluster(kubeconfig=kubeconfig) - - if ('username' not in session or - session['username'] is None or - session['username'] == '' or - 'email' not in session or - session['email'] is None or - session['email'] == ''): - - username = None - email = None - else: - username = session['username'] - email = session['email'] - - try: - return render_template('namespaces.html', - username=username, email=email, - state_namespaces=state_namespaces( - api_client=api_client), - compute_allocated_resources=compute_allocated_resources( - api_client=api_client), - cluster_name_configured=cluster_name_configured( - api_client=api_client), - kubeinit_version=KUBEINIT_VERSION,) - - except TemplateNotFound: - return render_template('page-404.html'), 404 - except Exception as e: - print("Exception found in %s: %s" % (blueprint.name, e)) - if current_app.config['DEBUG']: - raise e - return render_template('page-500.html'), 500 diff --git a/ui/app/namespaces/templates/namespaces.html b/ui/app/namespaces/templates/namespaces.html deleted file mode 100755 index 82a36d7d4..000000000 --- a/ui/app/namespaces/templates/namespaces.html +++ /dev/null @@ -1,56 +0,0 @@ -{% extends "base-site.html" %} - -{% block title %} Namespaces {% endblock %} - -{% block content %} - -
-
-
-
-
-
List cluster's namespaces
-
- - - - - - - - - {% for data in state_namespaces %} - - - - - {% endfor %} - -
NameStatus
{{data.name}}{{data.status}}
-
-
-
- - -
- -
-
- -{% endblock content %} - - -{% block javascripts %} - - - - - - - - -{% endblock javascripts %} diff --git a/ui/app/nodes/__init__.py b/ui/app/nodes/__init__.py deleted file mode 100755 index 7c79ca118..000000000 --- a/ui/app/nodes/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask import Blueprint - -blueprint = Blueprint( - 'nodes_blueprint', - __name__, - url_prefix='/nodes', - template_folder='templates', - static_folder='static' -) - - -def get_position(): - """Get the position.""" - return 3 - - -def get_category(): - """Get the category.""" - return 0 - - -def get_name(): - """Get the name.""" - return "Nodes" - - -def get_icon(): - """Get the icon.""" - return "fa-server" - - -def get_endpoint(): - """Get the endpoint.""" - return "nodes_blueprint.nodes" diff --git a/ui/app/nodes/routes.py b/ui/app/nodes/routes.py deleted file mode 100755 index cd0d7122f..000000000 --- a/ui/app/nodes/routes.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -# import os - -import app -from app import version as kubeinit_ui_version -from app.base.allocated import compute_allocated_resources -# from app.base.hexa import hexagons_data -from app.base.k8sclient import (cluster_name_configured, - state_nodes) -# state_namespaces, -# state_pods) -from app.nodes import blueprint - -from flask import current_app, redirect, render_template, request, url_for - -# from flask_login import (current_user, -# login_required, -# login_user, -# logout_user) - -from google.cloud import firestore - -from jinja2 import TemplateNotFound - -KUBEINIT_VERSION = kubeinit_ui_version.__version__ - -# -# Begin authentication -# -try: - from app.auth.routes import get_session_data - from app.auth.util import remote_cluster -except ImportError: - print("Module not available") - -try: - fdb = firestore.Client() - transaction = fdb.transaction() -except Exception as e: - print("Cant connect to firestore: %s" % (e)) -# -# End authentication -# - - -@blueprint.route('/') -def nodes(): - """ - Render all the templates not from base. - - This is a main method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - if 'kubeconfig' not in session or session['kubeconfig'] is None or session['kubeconfig'] == '': - kubeconfig = None - api_client = None - else: - kubeconfig = session['kubeconfig'] - api_client = remote_cluster(kubeconfig=kubeconfig) - - if ('username' not in session or - session['username'] is None or - session['username'] == '' or - 'email' not in session or - session['email'] is None or - session['email'] == ''): - - username = None - email = None - else: - username = session['username'] - email = session['email'] - - try: - return render_template('nodes.html', - username=username, email=email, - state_nodes=state_nodes( - api_client=api_client), - compute_allocated_resources=compute_allocated_resources( - api_client=api_client), - cluster_name_configured=cluster_name_configured( - api_client=api_client), - kubeinit_version=KUBEINIT_VERSION,) - - except TemplateNotFound: - return render_template('page-404.html'), 404 - except Exception as e: - print("Exception found in %s: %s" % (blueprint.name, e)) - if current_app.config['DEBUG']: - raise e - return render_template('page-500.html'), 500 diff --git a/ui/app/nodes/templates/nodes.html b/ui/app/nodes/templates/nodes.html deleted file mode 100755 index ade5795a4..000000000 --- a/ui/app/nodes/templates/nodes.html +++ /dev/null @@ -1,58 +0,0 @@ -{% extends "base-site.html" %} - -{% block title %} Nodes {% endblock %} - -{% block content %} - -
-
-
-
-
-
List cluster's nodes
-
- - - - - - - - - - {% for data in state_nodes %} - - - - - - {% endfor %} - -
NameTypestatus
{{data.name}}{{data.status}}Active -
-
-
-
- -
- -
-
- -{% endblock content %} - - -{% block javascripts %} - - - - - - - - -{% endblock javascripts %} diff --git a/ui/app/pods/__init__.py b/ui/app/pods/__init__.py deleted file mode 100755 index df6b060ca..000000000 --- a/ui/app/pods/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask import Blueprint - -blueprint = Blueprint( - 'pods_blueprint', - __name__, - url_prefix='/pods', - template_folder='templates', - static_folder='static' -) - - -def get_position(): - """Get the position.""" - return 4 - - -def get_category(): - """Get the category.""" - return 0 - - -def get_name(): - """Get the name.""" - return "Pods" - - -def get_icon(): - """Get the icon.""" - return "fa-boxes" - - -def get_endpoint(): - """Get the endpoint.""" - return "pods_blueprint.pods" diff --git a/ui/app/pods/routes.py b/ui/app/pods/routes.py deleted file mode 100755 index 1923db39f..000000000 --- a/ui/app/pods/routes.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -# import os - -import app -from app import version as kubeinit_ui_version -from app.base.allocated import compute_allocated_resources -# from app.base.hexa import hexagons_data -from app.base.k8sclient import (cluster_name_configured, - state_pods) -# state_namespaces, -# state_nodes, -from app.pods import blueprint - -from flask import current_app, redirect, render_template, request, url_for - -# from flask_login import (current_user, -# login_required, -# login_user, -# logout_user) - -from google.cloud import firestore - -from jinja2 import TemplateNotFound - -KUBEINIT_VERSION = kubeinit_ui_version.__version__ - -# -# Begin authentication -# -try: - from app.auth.routes import get_session_data - from app.auth.util import remote_cluster -except ImportError: - print("Module not available") - -try: - fdb = firestore.Client() - transaction = fdb.transaction() -except Exception as e: - print("Cant connect to firestore: %s" % (e)) -# -# End authentication -# - - -@blueprint.route('/') -def pods(): - """ - Render all the templates not from base. - - This is a main method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - if 'kubeconfig' not in session or session['kubeconfig'] is None or session['kubeconfig'] == '': - kubeconfig = None - api_client = None - else: - kubeconfig = session['kubeconfig'] - api_client = remote_cluster(kubeconfig=kubeconfig) - - if ('username' not in session or - session['username'] is None or - session['username'] == '' or - 'email' not in session or - session['email'] is None or - session['email'] == ''): - - username = None - email = None - else: - username = session['username'] - email = session['email'] - - try: - return render_template('pods.html', - username=username, email=email, - state_pods=state_pods( - api_client=api_client), - compute_allocated_resources=compute_allocated_resources( - api_client=api_client), - cluster_name_configured=cluster_name_configured( - api_client=api_client), - kubeinit_version=KUBEINIT_VERSION,) - - except TemplateNotFound: - return render_template('page-404.html'), 404 - except Exception as e: - print("Exception found in %s: %s" % (blueprint.name, e)) - if current_app.config['DEBUG']: - raise e - return render_template('page-500.html'), 500 diff --git a/ui/app/pods/templates/pods.html b/ui/app/pods/templates/pods.html deleted file mode 100755 index 870576947..000000000 --- a/ui/app/pods/templates/pods.html +++ /dev/null @@ -1,67 +0,0 @@ -{% extends "base-site.html" %} - -{% block title %} Pods {% endblock %} - -{% block content %} - -
-
-
-
-
-
List cluster's pods
-
- - - - - - - - - - - - {% for data in state_pods %} - - - - - - - - {% endfor %} - -
NamestatusIpNamespacesHost
{{data.name}} - {% if 'Running' in data.phase %} - Running - {% else %} - Danger - {% endif %} - {{data.pod_ip}}{{data.namespace}}{{data.host_ip}}
-
-
-
- -
- -
-
- -{% endblock content %} - - -{% block javascripts %} - - - - - - - - -{% endblock javascripts %} diff --git a/ui/app/run/__init__.py b/ui/app/run/__init__.py deleted file mode 100755 index 49e06da68..000000000 --- a/ui/app/run/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask import Blueprint - -blueprint = Blueprint( - 'run_blueprint', - __name__, - url_prefix='/run', - template_folder='templates', - static_folder='static' -) - - -def get_position(): - """Get the position.""" - return 2 - - -def get_category(): - """Get the category.""" - return 1 - - -def get_name(): - """Get the name.""" - return "Run" - - -def get_icon(): - """Get the icon.""" - return "fa-rocket" - - -def get_endpoint(): - """Get the endpoint.""" - return "run_blueprint.run" diff --git a/ui/app/run/forms.py b/ui/app/run/forms.py deleted file mode 100755 index 98070e645..000000000 --- a/ui/app/run/forms.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask_wtf import FlaskForm - -from wtforms import StringField, TextField # ValidationError -from wtforms.validators import DataRequired - - -class RunForm(FlaskForm): - """ - Get the run form. - - This class renders the run form - """ - - namespace = TextField('Namespace', - id='namespace', - validators=[DataRequired()]) - collection = TextField('Collection', - id='collection', - validators=[DataRequired()]) - role = TextField('Role', - id='role', - validators=[DataRequired()]) - source = TextField('Source', - id='source') - extra_vars = StringField('Extra vars', - id='extra_vars', - default='{}') diff --git a/ui/app/run/routes.py b/ui/app/run/routes.py deleted file mode 100755 index cac85bbe7..000000000 --- a/ui/app/run/routes.py +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -# import os -import json - -import app -from app import version as kubeinit_ui_version -from app.base.allocated import compute_allocated_resources -# from app.base.hexa import hexagons_data -from app.base.k8sclient import (cluster_name_configured) -# state_namespaces, -# state_nodes, -# state_pods) -from app.run import blueprint -from app.run.forms import RunForm - -from flask import current_app, redirect, render_template, request, url_for - -from google.cloud import firestore - -from jinja2 import TemplateNotFound - -from pystol.operator import insert_pystol_object - -# from flask_login import (current_user, -# login_required, -# login_user, -# logout_user) - -KUBEINIT_VERSION = kubeinit_ui_version.__version__ - -# -# Begin authentication -# -try: - from app.auth.routes import get_session_data - from app.auth.util import remote_cluster -except ImportError: - print("Module not available") - -try: - fdb = firestore.Client() - transaction = fdb.transaction() -except Exception as e: - print("Cant connect to firestore: %s" % (e)) -# -# End authentication -# - - -@blueprint.route('/', methods=['GET', 'POST']) -def run(): - """ - Render all the templates not from base. - - This is a main method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - form = RunForm(request.form) - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - if 'kubeconfig' not in session or session['kubeconfig'] is None or session['kubeconfig'] == '': - kubeconfig = None - api_client = None - else: - kubeconfig = session['kubeconfig'] - api_client = remote_cluster(kubeconfig=kubeconfig) - - if ('username' not in session or - session['username'] is None or - session['username'] == '' or - 'email' not in session or - session['email'] is None or - session['email'] == ''): - - username = None - email = None - else: - username = session['username'] - email = session['email'] - - form = RunForm() - - if request.method == "POST": - dict = request.form - - namespace = "" - collection = "" - role = "" - source = "" - extra_vars = {} - - if 'namespace' in dict: - namespace = dict['namespace'] - else: - namespace = "" - - if 'collection' in dict: - collection = dict['collection'] - else: - collection = "" - - if 'role' in dict: - role = dict['role'] - else: - role = "" - - if 'source' in dict: - source = dict['source'] - else: - source = "" - - if 'extra_vars' in dict: - if dict['extra_vars'] == "" or dict['extra_vars'] is None: - extra_vars = "{}" - else: - extra_vars = dict['extra_vars'] - else: - extra_vars = "{}" - - errors = 0 - try: - json.loads(extra_vars) - except ValueError as e: - print(e) - errors = errors + 1 - - if errors == 0: - insert_pystol_object(namespace=namespace, - collection=collection, - role=role, - source=source, - extra_vars=extra_vars, - api_client=api_client) - return redirect(url_for('executed_blueprint.executed')) - else: - form.extra_vars.errors = ["This must be a valid JSON"] - try: - return render_template('run.html', - username=username, email=email, - form=form, - compute_allocated_resources=compute_allocated_resources( - api_client=api_client), - cluster_name_configured=cluster_name_configured( - api_client=api_client), - kubeinit_version=KUBEINIT_VERSION,) - - except TemplateNotFound: - return render_template('page-404.html'), 404 - except Exception as e: - print("Exception found in %s: %s" % (blueprint.name, e)) - if current_app.config['DEBUG']: - raise e - return render_template('page-500.html'), 500 diff --git a/ui/app/run/templates/run.html b/ui/app/run/templates/run.html deleted file mode 100755 index 24a446d82..000000000 --- a/ui/app/run/templates/run.html +++ /dev/null @@ -1,89 +0,0 @@ -{% extends "base-site.html" %} - -{% block title %} Run {% endblock %} - -{% block content %} - -
-
- -
-
-
-
Run a Pystol action
-
-
- - {{ form.hidden_tag() }} - -
- -
- {{ form.namespace(placeholder="Namespace", class="form-control") }} - (Mandatory) The collection namespace. For example: 'pystol' -
-
- -
- -
- {{ form.collection(placeholder="Collection", class="form-control") }} - (Mandatory) The collection name. For example: 'actions' -
-
- -
- -
- {{ form.role(placeholder="Role", class="form-control") }} - (Mandatory) The role name for the action. For example: 'pingtest' -
-
- -
- -
- {{ form.source(placeholder="Source", class="form-control") }} - (Optional) The source of the collection. For example: 'https://github.com/kubeinit/kubeinit-galaxy.git' -
-
- -
- -
- {{ form.extra_vars(placeholder="Extra variables", class="form-control") }} - (Optional) Extra variables for the action. For example: '{"pystol_variable_1":"true","pystol_variable_2":"false"}' -
-
- - {% for field, errors in form.errors.items() %} - - {% endfor %} - - -
- - -
- -
-
-
-
- - - - - - -
- -
- -
- -{% endblock content %} - -{% block javascripts %} - -{% endblock javascripts %} diff --git a/ui/app/usage/__init__.py b/ui/app/usage/__init__.py deleted file mode 100755 index 5f67715c6..000000000 --- a/ui/app/usage/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from flask import Blueprint - -blueprint = Blueprint( - 'usage_blueprint', - __name__, - url_prefix='/usage', - template_folder='templates', - static_folder='static' -) - - -def get_position(): - """Get the position.""" - return 1 - - -def get_category(): - """Get the category.""" - return 0 - - -def get_name(): - """Get the name.""" - return "Usage" - - -def get_icon(): - """Get the icon.""" - return "fa-info" - - -def get_endpoint(): - """Get the endpoint.""" - return "usage_blueprint.usage" diff --git a/ui/app/usage/routes.py b/ui/app/usage/routes.py deleted file mode 100755 index a8bb96b1d..000000000 --- a/ui/app/usage/routes.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -# import os - -import app -from app import version as kubeinit_ui_version -from app.base.allocated import compute_allocated_resources -from app.base.hexa import hexagons_data -from app.base.k8sclient import (cluster_name_configured) -# state_namespaces, -# state_nodes, -# state_pods) -from app.usage import blueprint - -from flask import current_app, redirect, render_template, request, url_for - -# from flask_login import (current_user, -# login_required, -# login_user, -# logout_user) - -from google.cloud import firestore - -from jinja2 import TemplateNotFound - -KUBEINIT_VERSION = kubeinit_ui_version.__version__ - -# -# Begin authentication -# -try: - from app.auth.routes import get_session_data - from app.auth.util import remote_cluster -except ImportError: - print("Module not available") - -try: - fdb = firestore.Client() - transaction = fdb.transaction() -except Exception as e: - print("Cant connect to firestore: %s" % (e)) -# -# End authentication -# - - -@blueprint.route('/') -def usage(): - """ - Render all the templates not from base. - - This is a main method - """ - # - # Basic authentication module requirement - # If the auth module is installed and the user is not authenticated, so go to login - # - session = {} - if hasattr(app, 'auth'): - try: - session = get_session_data(transaction=transaction, session_id=request.cookies.get('session_id')) - except Exception as e: - print(e) - return redirect(url_for('auth_blueprint.login')) - else: - session['kubeconfig'] = None - # not current_user.is_authenticated: - if hasattr(app, 'auth') and session['email'] is None: - return redirect(url_for('auth_blueprint.login')) - # - # End basic authentication requirement - # - - if 'kubeconfig' not in session or session['kubeconfig'] is None or session['kubeconfig'] == '': - kubeconfig = None - api_client = None - else: - kubeconfig = session['kubeconfig'] - api_client = remote_cluster(kubeconfig=kubeconfig) - - if ('username' not in session or - session['username'] is None or - session['username'] == '' or - 'email' not in session or - session['email'] is None or - session['email'] == ''): - - username = None - email = None - else: - username = session['username'] - email = session['email'] - - try: - return render_template('usage.html', - username=username, email=email, - hexagons_data=hexagons_data( - api_client=api_client), - compute_allocated_resources=compute_allocated_resources( - api_client=api_client), - cluster_name_configured=cluster_name_configured( - api_client=api_client), - kubeinit_version=KUBEINIT_VERSION,) - - except TemplateNotFound: - return render_template('page-404.html'), 404 - except Exception as e: - print("Exception found in %s: %s" % (blueprint.name, e)) - if current_app.config['DEBUG']: - raise e - return render_template('page-500.html'), 500 diff --git a/ui/app/usage/templates/usage.html b/ui/app/usage/templates/usage.html deleted file mode 100755 index 338017e54..000000000 --- a/ui/app/usage/templates/usage.html +++ /dev/null @@ -1,245 +0,0 @@ -{% extends "base-site.html" %} - -{% block title %} Usage {% endblock %} - -{% block content %} - - -
-
- - -
-
-
-
Pods distribution
-
-
- - {% for node in hexagons_data %} - -
- -
-
-
- - - -
-
-
{{ node.name }}
-
-
- -
- - -
- - {% endfor %} - -
-
-
-
-
- - - -
-
-
-
Usage
-
-
-
- {% for node in hexagons_data %} -
- -
-
- - - -
-
-
{{ node.name }}
-
-
- - -
- - {% endfor%} - -
- -
-
-
-
- -
- -
-
- - -{% for node in hexagons_data %} - - - -{% for pod in node.pods %} - - - -{% endfor %} -{% endfor %} - - - - - - - - -{% endblock content %} - -{% block stylesheets %} - - - - - -{% endblock stylesheets %} - -{% block javascripts %} - - - - - - - - -{% endblock javascripts %} diff --git a/ui/app/version.py b/ui/app/version.py deleted file mode 100644 index 9da19b374..000000000 --- a/ui/app/version.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -__version__ = "2.2.2" diff --git a/ui/config.py b/ui/config.py deleted file mode 100755 index b583f4115..000000000 --- a/ui/config.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -import os -from os import environ -# import secrets - - -class Config(object): - """ - Get the global config. - - This method gets the global configuration - """ - - basedir = os.path.abspath(os.path.dirname(__file__)) - - SECRET_KEY = "KeYkEyKeY" # secrets.token_urlsafe(16) - - # This will create a file in FOLDER - SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, - 'database.db') - - # For 'in memory' database, please use: - # SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' - - SQLALCHEMY_TRACK_MODIFICATIONS = False - - # THEME SUPPORT - # if set then url_for('static', filename='', theme='') - # will add the theme name to the static URL: - # /static//filename - # DEFAULT_THEME = "themes/dark" - DEFAULT_THEME = None - - TEMPLATES_AUTO_RELOAD = True - - -class ProductionConfig(Config): - """ - Get the production config. - - This method gets the prod configuration - """ - - DEBUG = False - - # Security - SESSION_COOKIE_HTTPONLY = True - REMEMBER_COOKIE_HTTPONLY = True - REMEMBER_COOKIE_DURATION = 3600 - - # PostgreSQL database - SQLALCHEMY_DATABASE_URI = 'postgresql://{}:{}@{}:{}/{}'.format( - environ.get('DATABASE_USER', 'kuebinit'), - environ.get('DATABASE_PASSWORD', 'kuebinit'), - environ.get('DATABASE_HOST', 'localhost'), - environ.get('DATABASE_PORT', 5432), - environ.get('DATABASE_NAME', 'kuebinit') - ) - - -class DebugConfig(Config): - """ - Enable the debug config. - - This is a main class - """ - - DEBUG = True - - -config_dict = { - 'Production': ProductionConfig, - 'Debug': DebugConfig -} diff --git a/ui/db_clear.py b/ui/db_clear.py deleted file mode 100644 index e9c23d4fd..000000000 --- a/ui/db_clear.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from os import environ -from sys import exit - -from app import create_app - -from config import config_dict - -from models import db - - -get_config_mode = environ.get('KUBEINIT_CONFIG_MODE', 'Debug') - -try: - config_mode = config_dict[get_config_mode.capitalize()] -except KeyError: - exit('Error: Invalid KUBEINIT_CONFIG_MODE environment variable entry.') - -app = create_app(config_mode) -app.app_context().push() - -db.drop_all(app=app) -db.create_all(app=app) diff --git a/ui/db_mock.py b/ui/db_mock.py deleted file mode 100644 index 6a34705a1..000000000 --- a/ui/db_mock.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -from datetime import date -from os import environ -from sys import exit - -from app import create_app - -from config import config_dict - -from models import DataCenter, db - - -get_config_mode = environ.get('KUBEINIT_CONFIG_MODE', 'Debug') - -try: - config_mode = config_dict[get_config_mode.capitalize()] -except KeyError: - exit('Error: Invalid KUBEINIT_CONFIG_MODE environment variable entry.') - -app = create_app(config_mode) -app.app_context().push() - -db.drop_all(app=app) -db.create_all(app=app) - -cluster_1 = DataCenter(availability_zone='AZ1', - airport_name='MAD', - name='MAD-1', - created=date.today(), - location='Madrid') - -cluster_2 = DataCenter(availability_zone='AZ1', - airport_name='MAD', - name='MAD-2', - created=date.today(), - location='Madrid') - -cluster_3 = DataCenter(availability_zone='AZ1', - airport_name='MAD', - name='MAD-3', - created=date.today(), - location='Madrid') - -cluster_4 = DataCenter(availability_zone='AZ1', - airport_name='MAD', - name='MAD-4', - created=date.today(), - location='Madrid') - -db.session.add(cluster_1) -db.session.add(cluster_2) -db.session.add(cluster_3) -db.session.add(cluster_4) - -db.session.commit() diff --git a/ui/migrations/README b/ui/migrations/README deleted file mode 100755 index 98e4f9c44..000000000 --- a/ui/migrations/README +++ /dev/null @@ -1 +0,0 @@ -Generic single-database configuration. \ No newline at end of file diff --git a/ui/migrations/alembic.ini b/ui/migrations/alembic.ini deleted file mode 100755 index f8ed4801f..000000000 --- a/ui/migrations/alembic.ini +++ /dev/null @@ -1,45 +0,0 @@ -# A generic, single database configuration. - -[alembic] -# template used to generate migration files -# file_template = %%(rev)s_%%(slug)s - -# set to 'true' to run the environment during -# the 'revision' command, regardless of autogenerate -# revision_environment = false - - -# Logging configuration -[loggers] -keys = root,sqlalchemy,alembic - -[handlers] -keys = console - -[formatters] -keys = generic - -[logger_root] -level = WARN -handlers = console -qualname = - -[logger_sqlalchemy] -level = WARN -handlers = -qualname = sqlalchemy.engine - -[logger_alembic] -level = INFO -handlers = -qualname = alembic - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatter_generic] -format = %(levelname)-5.5s [%(name)s] %(message)s -datefmt = %H:%M:%S diff --git a/ui/migrations/env.py b/ui/migrations/env.py deleted file mode 100755 index 68f66e047..000000000 --- a/ui/migrations/env.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from __future__ import with_statement - -import logging -from logging.config import fileConfig - -from alembic import context - -from flask import current_app - -from sqlalchemy import engine_from_config, pool - -# this is the Alembic Config object, which provides -# access to the values within the .ini file in use. -config = context.config - -# Interpret the config file for Python logging. -# This line sets up loggers basically. -fileConfig(config.config_file_name) -logger = logging.getLogger('alembic.env') - -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata -config.set_main_option('sqlalchemy.url', - current_app.config.get('SQLALCHEMY_DATABASE_URI')) -target_metadata = current_app.extensions['migrate'].db.metadata - -# other values from the config, defined by the needs of env.py, -# can be acquired: -# my_important_option = config.get_main_option("my_important_option") -# ... etc. - - -def run_migrations_offline(): - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - - """ - url = config.get_main_option("sqlalchemy.url") - context.configure(url=url) - - with context.begin_transaction(): - context.run_migrations() - - -def run_migrations_online(): - """Run migrations in 'online' mode. - - In this scenario we need to create an Engine - and associate a connection with the context. - - """ - # this callback is used to prevent an auto-migration from being generated - # when there are no changes to the schema - # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html - def process_revision_directives(context, revision, directives): - if getattr(config.cmd_opts, 'autogenerate', False): - script = directives[0] - if script.upgrade_ops.is_empty(): - directives[:] = [] - logger.info('No changes in schema detected.') - - engine = engine_from_config(config.get_section(config.config_ini_section), - prefix='sqlalchemy.', - poolclass=pool.NullPool) - - connection = engine.connect() - context.configure(connection=connection, - target_metadata=target_metadata, - process_revision_directives=process_revision_directives, - **current_app.extensions['migrate'].configure_args) - - try: - with context.begin_transaction(): - context.run_migrations() - finally: - connection.close() - - -if context.is_offline_mode(): - run_migrations_offline() -else: - run_migrations_online() diff --git a/ui/migrations/script.py.mako b/ui/migrations/script.py.mako deleted file mode 100755 index 2c0156303..000000000 --- a/ui/migrations/script.py.mako +++ /dev/null @@ -1,24 +0,0 @@ -"""${message} - -Revision ID: ${up_revision} -Revises: ${down_revision | comma,n} -Create Date: ${create_date} - -""" -from alembic import op -import sqlalchemy as sa -${imports if imports else ""} - -# revision identifiers, used by Alembic. -revision = ${repr(up_revision)} -down_revision = ${repr(down_revision)} -branch_labels = ${repr(branch_labels)} -depends_on = ${repr(depends_on)} - - -def upgrade(): - ${upgrades if upgrades else "pass"} - - -def downgrade(): - ${downgrades if downgrades else "pass"} diff --git a/ui/migrations/versions/6b6aa97e1b29_.py b/ui/migrations/versions/6b6aa97e1b29_.py deleted file mode 100755 index a29ef952f..000000000 --- a/ui/migrations/versions/6b6aa97e1b29_.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -from alembic import op - -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '6b6aa97e1b29' -down_revision = None -branch_labels = None -depends_on = None - - -def upgrade(): - """ - Upgrade command form alembic. - - This is the upgrade method - """ - # ### commands auto generated by Alembic - please adjust! ### - op.create_table('User', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('username', sa.String(length=120), - nullable=True), - sa.Column('email', sa.String(length=120), - nullable=True), - sa.Column('password', sa.String(length=30), - nullable=True), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('email'), - sa.UniqueConstraint('username')) - # ### end Alembic commands ### - - -def downgrade(): - """ - Downgrade command form alembic. - - This is the downgrade method - """ - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('User') - # ### end Alembic commands ### diff --git a/ui/models/__init__.py b/ui/models/__init__.py deleted file mode 100644 index 69e280174..000000000 --- a/ui/models/__init__.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -from flask_sqlalchemy import SQLAlchemy - -db = SQLAlchemy() - -"""Data center model.""" - - -class DataCenter(db.Model): - """Data model for the main data center.""" - - __tablename__ = "kubeinit-datacenter" - id = db.Column(db.Integer, primary_key=True) - availability_zone = db.Column(db.String(80), nullable=False) - airport_name = db.Column(db.String(80), nullable=False) - name = db.Column(db.String(80), index=True, unique=True, nullable=False) - created = db.Column(db.DateTime, nullable=False) - location = db.Column(db.String(80), nullable=False) - # hosts = db.relationship('Host', backref='host', lazy=True) - - def __repr__(self): - """Get the class object name.""" - return "".format(self.name) - - -class Host(db.Model): - """Data model for the hosts inside the datacenter.""" - - __tablename__ = "kubeinit-host" - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(80), index=True, unique=True, nullable=False) - ipmi_user = db.Column(db.String(80), index=True, unique=True, nullable=False) - ipmi_password = db.Column(db.String(80), index=True, unique=True, nullable=False) - # datacenter_id = db.Column(db.Integer, db.ForeignKey('datacenter.id'), nullable=False) - # virtualmachines = db.relationship('VirtualMachine', backref='virtualmachine', lazy=True) - - def __repr__(self): - """Get the class object name.""" - return "".format(self.name) - - -class VirtualMachine(db.Model): - """Data model for the virtual machines in the data center.""" - - __tablename__ = "kubeinit-virtualmachine" - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(80), index=True, unique=True, nullable=False) - # host_id = db.Column(db.Integer, db.ForeignKey('host.id'), nullable=False) - # datacenter_id = db.Column(db.Integer, db.ForeignKey('datacenter.id'), nullable=False) - - def __repr__(self): - """Get the class object name.""" - return "".format(self.name) - - -class Cluster(db.Model): - """Data model for a cluster in the datacenters.""" - - __tablename__ = "kubeinit-cluster" - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(80), index=True, unique=True, nullable=False) - distro = db.Column(db.String(80), index=True, unique=True, nullable=False) - # virtualmachines = db.relationship('VirtualMachine', backref='virtualmachine', lazy=True) - # hosts = db.relationship('Host', backref='host', lazy=True) - - def __repr__(self): - """Get the class object name.""" - return "".format(self.name) diff --git a/ui/package.json b/ui/package.json deleted file mode 100755 index 4c44e04dc..000000000 --- a/ui/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "kubeinit-ui", - "version": "2.2.2", - "description": "Kubeinit UI", - "repository": { - "type": "git", - "url": "https://github.com/kubeinit/kubeinit.git" - }, - "keywords": [ - "flask", - "kubeinit-ui" - ], - "author": "kubeinit.org", - "contributors": [ - "Carlos Camacho " - ], - "license": "Apache 2.0" -} diff --git a/ui/requirements.txt b/ui/requirements.txt deleted file mode 100755 index 801a408d1..000000000 --- a/ui/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -email_validator -flask -flask_login -flask_migrate -flask_wtf -wtforms==2.3.3 # "TextField" values with "StringField" -flask_sqlalchemy -gunicorn -kubernetes -pint -requests_oauthlib -pystol diff --git a/ui/requirements_dev.txt b/ui/requirements_dev.txt deleted file mode 100755 index 01781f7a6..000000000 --- a/ui/requirements_dev.txt +++ /dev/null @@ -1,8 +0,0 @@ -coveralls -coverage -pytest -flake8 -flake8-print -pep8-naming -selenium --r requirements.txt \ No newline at end of file diff --git a/ui/run.py b/ui/run.py deleted file mode 100755 index c5c929fea..000000000 --- a/ui/run.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from os import environ -from sys import exit - -from app import create_app - -from config import config_dict - - -get_config_mode = environ.get('KUBEINIT_CONFIG_MODE', 'Debug') - -try: - config_mode = config_dict[get_config_mode.capitalize()] -except KeyError: - exit('Error: Invalid KUBEINIT_CONFIG_MODE environment variable entry.') - -app = create_app(config_mode) -app.app_context().push() - - -if __name__ == "__main__": - app.run(host='0.0.0.0', port='3000', threaded=True) diff --git a/ui/runtime.txt b/ui/runtime.txt deleted file mode 100755 index a01373a36..000000000 --- a/ui/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -python-3.7.2 diff --git a/ui/setup.cfg b/ui/setup.cfg deleted file mode 100755 index c182de16d..000000000 --- a/ui/setup.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[flake8] -max-line-length=100 -ignore=E402,E266 -exclude=./migrations diff --git a/ui/tests/__init__.py b/ui/tests/__init__.py deleted file mode 100755 index b7212a42b..000000000 --- a/ui/tests/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" diff --git a/ui/tests/chromedriver b/ui/tests/chromedriver deleted file mode 100755 index 6adfdc19b..000000000 Binary files a/ui/tests/chromedriver and /dev/null differ diff --git a/ui/tests/conftest.py b/ui/tests/conftest.py deleted file mode 100755 index 2ad1ef7cc..000000000 --- a/ui/tests/conftest.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - -from threading import Thread -from time import sleep - -from app import create_app, db - -from config import config_dict - -from pytest import fixture - -from selenium import webdriver -from selenium.webdriver.chrome.options import Options - - -@fixture -def base_client(): - """ - Test the base app. - - This is method function - """ - app = create_app(config_dict['Debug']) - app_ctx = app.app_context() - app_ctx.push() - db.session.close() - db.drop_all() - yield app.test_client() - - -@fixture -def user_client(): - """ - Test the base app. - - This is method function - """ - app = create_app(config_dict['Debug']) - app_ctx = app.app_context() - app_ctx.push() - db.session.close() - db.drop_all() - client = app.test_client() - create = {'username': '', 'password': '', 'create_account': ''} - login = {'username': '', 'password': '', 'login': ''} - with app.app_context(): - client.post('/create_user', data=create) - client.post('/login', data=login) - yield client - - -@fixture -def selenium_client(): - """ - Test the base app. - - This is method function - """ - app = create_app(config_dict['Debug'], True) - app_context = app.app_context() - app_context.push() - db.session.close() - db.drop_all() - options = Options() - options.add_argument('--headless') - # options.add_argument('--disable-gpu') - # Flask can run in a separate thread, but the reloader expects to run in - # the main thread: it must be disabled - client = None - try: - client = webdriver.Chrome('./tests/chromedriver', - chrome_options=options) - except Exception: - pass - # if the client cannot start, we don't want to start a Thread as the - # test execution would be stuck - if client: - Thread( - target=app.run, - kwargs={ - 'host': '0.0.0.0', - 'port': 5000, - 'use_reloader': False - } - ).start() - # give the server some time to start - sleep(1) - yield client - client.get('http://127.0.0.1:5000/shutdown') - client.quit() - app_context.pop() diff --git a/ui/tests/test_base.py b/ui/tests/test_base.py deleted file mode 100755 index 4a98f2005..000000000 --- a/ui/tests/test_base.py +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from logging import CRITICAL, disable -disable(CRITICAL) - -urls = { - '': ( - '/fixed_sidebar', - '/fixed_footer', - '/plain_page', - '/page_403', - '/page_404', - '/page_500' - ), - '/home': ( - '/index', - '/index2', - '/index3' - ), - '/forms': ( - '/form', - '/form_advanced', - '/form_validation', - '/form_wizards', - '/form_upload', - '/form_buttons' - ), - '/ui': ( - '/general_elements', - '/media_gallery', - '/typography', - '/icons', - '/glyphicons', - '/widgets', - '/invoice', - '/inbox', - '/calendar' - ), - '/tables': ( - '/tables', - '/tables_dynamic' - ), - '/data': ( - '/chartjs', - '/chartjs2', - '/morisjs', - '/echarts', - '/other_charts' - ), - '/additional': ( - '/ecommerce', - '/projects', - '/project_detail', - '/contacts', - '/profile', - '/pricing' - ) -} - -free_access = {'/', '/login', '/page_403', '/page_404', '/page_500'} - - -def check_pages(*pages): - """ - Test the base app. - - This is method function - """ - def decorator(function): - def wrapper(user_client): - function(user_client) - for page in pages: - r = user_client.get(page, follow_redirects=True) - print(r) - # assert r.status_code == 200 - assert True - return wrapper - return decorator - - -def check_blueprints(*blueprints): - """ - Test the base app. - - This is method function - """ - def decorator(function): - def wrapper(user_client): - function(user_client) - for blueprint in blueprints: - for page in urls[blueprint]: - r = user_client.get(blueprint + page, - follow_redirects=True) - print(r) - # assert r.status_code == 200 - assert True - return wrapper - return decorator - -# Base test -# test the login system: login, user creation, logout -# test that all pages respond with HTTP 403 if not logged in, 200 otherwise - - -def test_authentication(base_client): - """ - Test the base app. - - This is method function - """ - for blueprint, pages in urls.items(): - for page in pages: - page_url = blueprint + page - expected_code = 200 if page_url in free_access else 403 - r = base_client.get(page_url, follow_redirects=True) - print(expected_code) - print(r) - # assert r.status_code == expected_code - assert True - - -def test_urls(user_client): - """ - Test the base app. - - This is method function - """ - for blueprint, pages in urls.items(): - for page in pages: - page_url = blueprint + page - r = user_client.get(page_url, follow_redirects=True) - print(r) - # assert r.status_code == 200 - assert True - # logout and test that we cannot access anything anymore - r = user_client.get('/logout', follow_redirects=True) - test_authentication(user_client) diff --git a/ui/tests/test_example.py b/ui/tests/test_example.py deleted file mode 100755 index 77fac503f..000000000 --- a/ui/tests/test_example.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python - -""" -Copyright kubeinit contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at: - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -""" - - -from tests.test_base import check_blueprints, check_pages - - -@check_pages('/', '/home/index') -def test_pages(base_client): - """ - Run the selenium test. - - This is a Kubeinit function - """ - # do something - base_client.post('/', data={}) - # the pages are tested (GET request: 200) afterwards by the - # @check_pages decorator - - -@check_blueprints('/forms', '/ui') -def test_blueprints(base_client): - """ - Run the selenium test. - - This is a Kubeinit function - """ - # do something - base_client.post('/', data={}) - # the blueprints are tested (GET request: 200) afterwards by the - # @check_blueprints decorator