diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 95afdda..bddd66b 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,4 +1,4 @@ -## Description +# Description Please include a summary of the changes and the purpose of this pull request. diff --git a/.github/workflows/api-dev-build-docker-push.yml b/.github/workflows/api-dev-build-docker-push.yml deleted file mode 100644 index 4c9a93b..0000000 --- a/.github/workflows/api-dev-build-docker-push.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: API - DEV - Build and Docker Push - -on: - push: - branches: - - development - paths: - - 'api/**' - workflow_dispatch: - -env: - DOCKER_IMAGE: prasadhonrao/devcamper-webapi - AZURE_WEBAPP_NAME: devcamper-webapi - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Log in to Docker Hub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build and push Docker image - run: | - docker build -t ${{ env.DOCKER_IMAGE }}:${{ github.sha }} -f api/Dockerfile api - docker tag ${{ env.DOCKER_IMAGE }}:${{ github.sha }} ${{ env.DOCKER_IMAGE }}:latest - docker push ${{ env.DOCKER_IMAGE }}:${{ github.sha }} - docker push ${{ env.DOCKER_IMAGE }}:latest diff --git a/.github/workflows/api-dev-ci.yml b/.github/workflows/api-dev-ci.yml deleted file mode 100644 index c13a796..0000000 --- a/.github/workflows/api-dev-ci.yml +++ /dev/null @@ -1,124 +0,0 @@ -name: API - DEV - Continuous Integration - -on: - push: - branches: - - development - paths: - - 'api/**' - workflow_dispatch: - -jobs: - lint: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install dependencies - run: npm install --prefix api - - - name: Run linter - run: | - export PATH=$(pwd)/api/node_modules/.bin:$PATH - npm run lint --prefix api - - dependency-check: - runs-on: ubuntu-latest - needs: lint - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install dependencies - run: npm install --prefix api - - - name: Run dependency check - run: npm audit --audit-level=high --prefix api - - security: - runs-on: ubuntu-latest - needs: dependency-check - permissions: - actions: read - contents: read - security-events: write - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install dependencies - run: npm install --prefix api - - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: javascript - - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 - - test: - runs-on: ubuntu-latest - needs: security - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install dependencies - run: npm install --prefix api - - - name: Run tests - run: npm test --prefix api - - code-coverage: - runs-on: ubuntu-latest - needs: test - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install dependencies - run: npm install --prefix api - - - name: Run tests with coverage - run: npm run test --prefix api -- --coverage - - - name: Upload coverage report - uses: actions/upload-artifact@v4 - with: - name: coverage-report - path: api/coverage diff --git a/.github/workflows/api-dev-deploy-to-azure.yml b/.github/workflows/api-dev-deploy-to-azure.yml deleted file mode 100644 index fd79edc..0000000 --- a/.github/workflows/api-dev-deploy-to-azure.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: API - DEV - Deploy to Azure - -on: - workflow_dispatch: - -env: - DOCKER_IMAGE: prasadhonrao/devcamper-webapi - AZURE_WEBAPP_NAME: devcamper-webapi - -jobs: - deploy: - runs-on: ubuntu-latest - - steps: - - name: Log in to Azure - uses: azure/login@v2 - with: - creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }} - - - name: Deploy to Azure Web App - uses: azure/webapps-deploy@v2 - with: - app-name: ${{ env.AZURE_WEBAPP_NAME }} - images: '${{ env.DOCKER_IMAGE }}:latest' - - notify: - runs-on: ubuntu-latest - needs: deploy - if: always() - - steps: - - name: Send email notification - uses: dawidd6/action-send-mail@v3 - with: - server_address: smtp.gmail.com - server_port: 587 - username: ${{ secrets.GMAIL_USERNAME }} - password: ${{ secrets.GMAIL_PASSWORD }} - subject: '${{ job.status }}: DevCamper API Deployment' - body: | - The deployment has ${{ job.status }}! - Repository: ${{ github.repository }} - Branch: ${{ github.ref }} - Commit: ${{ github.sha }} - Author: ${{ github.actor }} - Workflow: ${{ github.workflow }} - Job: ${{ github.job }} - Run ID: ${{ github.run_id }} - Run Number: ${{ github.run_number }} - Logs: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - to: ${{ secrets.NOTIFY_EMAIL }} - from: ${{ secrets.GMAIL_USERNAME }} diff --git a/.github/workflows/api-prod-cd.yml b/.github/workflows/api-prod-cd.yml deleted file mode 100644 index 6f5b361..0000000 --- a/.github/workflows/api-prod-cd.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: API - PROD - Continuous Deployment - -on: - push: - branches: - - main - paths: - - 'api/**' - workflow_dispatch: - -env: - DOCKER_IMAGE: prasadhonrao/devcamper-webapi - AZURE_WEBAPP_NAME: devcamper-webapi - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Log in to Docker Hub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build and push Docker image - run: | - docker build -t ${{ env.DOCKER_IMAGE }}:${{ github.sha }} -f api/Dockerfile api - docker tag ${{ env.DOCKER_IMAGE }}:${{ github.sha }} ${{ env.DOCKER_IMAGE }}:latest - docker push ${{ env.DOCKER_IMAGE }}:${{ github.sha }} - docker push ${{ env.DOCKER_IMAGE }}:latest - - deploy: - runs-on: ubuntu-latest - needs: build - - steps: - - name: Log in to Azure - uses: azure/login@v2 - with: - creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }} - - - name: Deploy to Azure Web App - uses: azure/webapps-deploy@v2 - with: - app-name: ${{ env.AZURE_WEBAPP_NAME }} - images: '${{ env.DOCKER_IMAGE }}:latest' - - notify: - runs-on: ubuntu-latest - needs: deploy - if: always() - - steps: - - name: Send email notification - uses: dawidd6/action-send-mail@v3 - with: - server_address: smtp.gmail.com - server_port: 587 - username: ${{ secrets.GMAIL_USERNAME }} - password: ${{ secrets.GMAIL_PASSWORD }} - subject: '${{ job.status }}: Deployment Notification' - body: | - The deployment has ${{ job.status }}! - Repository: ${{ github.repository }} - Branch: ${{ github.ref }} - Commit: ${{ github.sha }} - Author: ${{ github.actor }} - Workflow: ${{ github.workflow }} - Job: ${{ github.job }} - Run ID: ${{ github.run_id }} - Run Number: ${{ github.run_number }} - Logs: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - to: ${{ secrets.NOTIFY_EMAIL }} - from: ${{ secrets.GMAIL_USERNAME }} diff --git a/.github/workflows/ui-dev-ci-cd.yml b/.github/workflows/ui-dev-ci-cd.yml deleted file mode 100644 index 498882e..0000000 --- a/.github/workflows/ui-dev-ci-cd.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: UI - DEV - CI/CD - -on: - push: - branches: - - development - paths: - - 'ui/**' - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Set up Node.js version - uses: actions/setup-node@v3 - with: - node-version: '20.x' - - - name: npm install, build, and test - working-directory: ./ui - run: | - npm install - npm run build --if-present - npm run test --if-present - - - name: Zip artifact for deployment - working-directory: ./ui - run: | - cd build - zip -r ../release.zip ./* - - - name: Upload artifact for deployment job - uses: actions/upload-artifact@v4 - with: - name: node-app - path: ./ui/release.zip - - deploy: - runs-on: ubuntu-latest - needs: build - environment: - name: 'dev' - - steps: - - name: Download artifact from build job - uses: actions/download-artifact@v4 - with: - name: node-app - path: . - - - name: List contents of the downloaded artifact directory - run: ls -R . - - - name: Unzip artifact into wwwroot - run: unzip ./release.zip -d wwwroot - - - name: List contents of wwwroot directory - run: ls -R wwwroot - - - name: 'Login to Azure' - uses: azure/login@v1 - with: - creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }} - - - name: 'Deploy to Azure Web App' - uses: azure/webapps-deploy@v3 - with: - app-name: 'devcamper-webapp' # Replace with your Azure App Service name - slot-name: 'dev' # Specify the slot name (e.g., 'dev' for development slot) - package: wwwroot - - - name: 'Validate Deployment' - run: | - response=$(curl --write-out '%{http_code}' --silent --output /dev/null https://devcamper-webapp-dev.azurewebsites.net) - if [ "$response" -ne 200 ]; then - echo "Deployment validation failed with status code $response" - exit 1 - else - echo "Deployment validation succeeded with status code $response" - fi diff --git a/.github/workflows/ui-prod-ci-cd.yml b/.github/workflows/ui-prod-ci-cd.yml deleted file mode 100644 index cd99b81..0000000 --- a/.github/workflows/ui-prod-ci-cd.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: UI - PROD - CI/CD - -on: - push: - branches: - - main - paths: - - 'ui/**' - pull_request: - branches: - - main - paths: - - 'ui/**' - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Set up Node.js version - uses: actions/setup-node@v3 - with: - node-version: '20.x' - - - name: npm install, build, and test - working-directory: ./ui - run: | - npm install - npm run build --if-present - npm run test --if-present - - - name: Zip artifact for deployment - working-directory: ./ui - run: | - cd build - zip -r ../release.zip ./* - - - name: Upload artifact for deployment job - uses: actions/upload-artifact@v4 - with: - name: node-app - path: ./ui/release.zip - - deploy: - runs-on: ubuntu-latest - needs: build - environment: - name: 'dev' - - steps: - - name: Download artifact from build job - uses: actions/download-artifact@v4 - with: - name: node-app - path: . - - - name: List contents of the downloaded artifact directory - run: ls -R . - - - name: Unzip artifact into wwwroot - run: unzip ./release.zip -d wwwroot - - - name: List contents of wwwroot directory - run: ls -R wwwroot - - # - name: Delete artifact - # run: rm ./ui/release.zip - - - name: 'Login to Azure' - uses: azure/login@v1 - with: - creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }} - - - name: 'Deploy to Azure Web App' - uses: azure/webapps-deploy@v3 - with: - app-name: 'devcamper-webapp' # Replace with your Azure App Service name - package: wwwroot - - - name: 'Validate Deployment' - run: | - response=$(curl --write-out '%{http_code}' --silent --output /dev/null https://devcamper-webapp-dev.azurewebsites.net) - if [ "$response" -ne 200 ]; then - echo "Deployment validation failed with status code $response" - exit 1 - else - echo "Deployment validation succeeded with status code $response" - fi diff --git a/.github/workflows/webapi-ci.yml b/.github/workflows/webapi-ci.yml new file mode 100644 index 0000000..695ef42 --- /dev/null +++ b/.github/workflows/webapi-ci.yml @@ -0,0 +1,196 @@ +name: WebAPI CI + +on: + push: + branches: + - development + paths: + - 'src/webapi/**' + workflow_dispatch: + +env: + DOCKER_IMAGE: prasadhonrao/devcamper-webapi + AZURE_WEBAPP_NAME: devcamper-webapi + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install --prefix src/webapi + + - name: Run linter + run: | + export PATH=$(pwd)/src/webapi/node_modules/.bin:$PATH + npm run lint --prefix src/webapi + + dependency-check: + runs-on: ubuntu-latest + needs: lint + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install --prefix src/webapi + + - name: Run dependency check + run: npm audit --audit-level=high --prefix src/webapi + + security: + runs-on: ubuntu-latest + needs: dependency-check + permissions: + actions: read + contents: read + security-events: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install --prefix src/webapi + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: javascript + + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + + test: + runs-on: ubuntu-latest + needs: security + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install --prefix src/webapi + + - name: Run tests + run: npm test --prefix src/webapi + + code-coverage: + runs-on: ubuntu-latest + needs: test + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install --prefix src/webapi + + - name: Run tests with coverage + run: npm run test --prefix src/webapi -- --coverage + + - name: Upload coverage report + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: src/webapi/coverage + + build: + runs-on: ubuntu-latest + needs: code-coverage + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Log in to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push Docker image + run: | + docker build -t ${{ env.DOCKER_IMAGE }}:${{ github.sha }} -f src/webapi/Dockerfile src/webapi + docker tag ${{ env.DOCKER_IMAGE }}:${{ github.sha }} ${{ env.DOCKER_IMAGE }}:latest + docker push ${{ env.DOCKER_IMAGE }}:${{ github.sha }} + docker push ${{ env.DOCKER_IMAGE }}:latest + + deploy: + runs-on: ubuntu-latest + needs: build + + steps: + - name: Log in to Azure + uses: azure/login@v2 + with: + creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }} + + - name: Deploy to Azure Web App + uses: azure/webapps-deploy@v2 + with: + app-name: ${{ env.AZURE_WEBAPP_NAME }} + images: '${{ env.DOCKER_IMAGE }}:latest' + + notify: + runs-on: ubuntu-latest + needs: deploy + if: always() + + steps: + - name: Send email notification + uses: dawidd6/action-send-mail@v3 + with: + server_address: smtp.gmail.com + server_port: 587 + username: ${{ secrets.GMAIL_USERNAME }} + password: ${{ secrets.GMAIL_PASSWORD }} + subject: '${{ job.status }}: DevCamper API Deployment' + body: | + The deployment has ${{ job.status }}! + Repository: ${{ github.repository }} + Branch: ${{ github.ref }} + Commit: ${{ github.sha }} + Author: ${{ github.actor }} + Workflow: ${{ github.workflow }} + Job: ${{ github.job }} + Run ID: ${{ github.run_id }} + Run Number: ${{ github.run_number }} + Logs: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + to: ${{ secrets.NOTIFY_EMAIL }} + from: ${{ secrets.GMAIL_USERNAME }} diff --git a/.github/workflows/webapp-ci.yml b/.github/workflows/webapp-ci.yml new file mode 100644 index 0000000..08c1835 --- /dev/null +++ b/.github/workflows/webapp-ci.yml @@ -0,0 +1,197 @@ +name: WebApp CI + +on: + push: + branches: + - development + paths: + - 'src/webapp/**' + workflow_dispatch: + +env: + DOCKER_IMAGE: prasadhonrao/devcamper-webapp + AZURE_WEBAPP_NAME: devcamper-webapp + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install --prefix src/webapp + + - name: Run linter + run: | + export PATH=$(pwd)/src/webapp/node_modules/.bin:$PATH + npm run lint --prefix src/webapp + + dependency-check: + runs-on: ubuntu-latest + needs: lint + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install --prefix src/webapp + + # TODO: Analyze how to check for high severity vulnerabilities + # - name: Run dependency check + # run: npm audit --audit-level=high --prefix src/webapp + + security: + runs-on: ubuntu-latest + needs: dependency-check + permissions: + actions: read + contents: read + security-events: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install --prefix src/webapp + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: javascript + + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + + test: + runs-on: ubuntu-latest + needs: security + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install --prefix src/webapp + + - name: Run tests + run: npm test --prefix src/webapp + + code-coverage: + runs-on: ubuntu-latest + needs: test + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install --prefix src/webapp + + - name: Run tests with coverage + run: npm run test --prefix src/webapp -- --coverage + + - name: Upload coverage report + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: src/webapp/coverage + + build: + runs-on: ubuntu-latest + needs: code-coverage + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Log in to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push Docker image + run: | + docker build --build-arg REACT_APP_DEVCAMPER_BASE_API_URI=${{ secrets.REACT_APP_DEVCAMPER_BASE_API_URI }} -t ${{ env.DOCKER_IMAGE }}:${{ github.sha }} -f src/webapp/Dockerfile src/webapp + docker tag ${{ env.DOCKER_IMAGE }}:${{ github.sha }} ${{ env.DOCKER_IMAGE }}:latest + docker push ${{ env.DOCKER_IMAGE }}:${{ github.sha }} + docker push ${{ env.DOCKER_IMAGE }}:latest + + deploy: + runs-on: ubuntu-latest + needs: build + + steps: + - name: Log in to Azure + uses: azure/login@v2 + with: + creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }} + + - name: Deploy to Azure Web App + uses: azure/webapps-deploy@v2 + with: + app-name: ${{ env.AZURE_WEBAPP_NAME }} + images: '${{ env.DOCKER_IMAGE }}:latest' + + notify: + runs-on: ubuntu-latest + needs: deploy + if: always() + + steps: + - name: Send email notification + uses: dawidd6/action-send-mail@v3 + with: + server_address: smtp.gmail.com + server_port: 587 + username: ${{ secrets.GMAIL_USERNAME }} + password: ${{ secrets.GMAIL_PASSWORD }} + subject: '${{ job.status }}: DevCamper APP Deployment' + body: | + The deployment has ${{ job.status }}! + Repository: ${{ github.repository }} + Branch: ${{ github.ref }} + Commit: ${{ github.sha }} + Author: ${{ github.actor }} + Workflow: ${{ github.workflow }} + Job: ${{ github.job }} + Run ID: ${{ github.run_id }} + Run Number: ${{ github.run_number }} + Logs: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + to: ${{ secrets.NOTIFY_EMAIL }} + from: ${{ secrets.GMAIL_USERNAME }} diff --git a/.k8s/emptydir-volume/network/install.sh b/.k8s/emptydir-volume/network/install.sh deleted file mode 100644 index 6ab0a3e..0000000 --- a/.k8s/emptydir-volume/network/install.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!bin/bash -# Install an NGINX Ingress Controller -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml -kubectl apply -f ingress.yaml \ No newline at end of file diff --git a/.k8s/emptydir-volume/network/uninstall.sh b/.k8s/emptydir-volume/network/uninstall.sh deleted file mode 100644 index 84d9ef5..0000000 --- a/.k8s/emptydir-volume/network/uninstall.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!bin/bash -kubectl delete -f ingress.yaml \ No newline at end of file diff --git a/.k8s/emptydir-volume/webapp/configmap.yaml b/.k8s/emptydir-volume/webapp/configmap.yaml deleted file mode 100644 index 1d23696..0000000 --- a/.k8s/emptydir-volume/webapp/configmap.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: devcamper-webapp-configmap - namespace: devcamper-namespace -data: - react_app_devcamper_base_api_uri: 'http://devcamper.webapi' diff --git a/.k8s/without-volume/database/install.sh b/.k8s/without-volume/database/install.sh deleted file mode 100644 index a08f6e9..0000000 --- a/.k8s/without-volume/database/install.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!bin/bash -kubectl apply -f configmap.yaml -kubectl apply -f secret.yaml -kubectl apply -f deployment.yaml -kubectl apply -f service-nodeport.yaml -kubectl apply -f service.yaml \ No newline at end of file diff --git a/.k8s/without-volume/database/secret.yaml b/.k8s/without-volume/database/secret.yaml deleted file mode 100644 index 9dc04fb..0000000 --- a/.k8s/without-volume/database/secret.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: devcamper-db-secret - namespace: devcamper-namespace -data: - mongodb_username: 'YWRtaW4=' # base64 encoded string for 'admin' - mongodb_password: 'cGFzc3dvcmQ=' # base64 encoded string for 'password' diff --git a/.k8s/without-volume/database/service-nodeport.yaml b/.k8s/without-volume/database/service-nodeport.yaml deleted file mode 100644 index 38f5651..0000000 --- a/.k8s/without-volume/database/service-nodeport.yaml +++ /dev/null @@ -1,15 +0,0 @@ -# This service is created only to validate the connectivity to the database externally -apiVersion: v1 -kind: Service -metadata: - name: devcamper-db-nodeport-service - namespace: devcamper-namespace -spec: - type: NodePort - selector: - app: devcamper-db - ports: - - protocol: TCP - port: 27017 - targetPort: 27017 - nodePort: 32017 diff --git a/.k8s/without-volume/database/service.yaml b/.k8s/without-volume/database/service.yaml deleted file mode 100644 index d6fa98a..0000000 --- a/.k8s/without-volume/database/service.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: devcamper-db-clusterip-service - namespace: devcamper-namespace -spec: - selector: - app: devcamper-db - ports: - - name: mongodb - port: 27017 - targetPort: 27017 - type: ClusterIP diff --git a/.k8s/without-volume/install.sh b/.k8s/without-volume/install.sh deleted file mode 100644 index 82a6fdd..0000000 --- a/.k8s/without-volume/install.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# Function to run install script in a directory -run_install() { - local dir=$1 - cd "$dir" || { echo "Failed to change directory to $dir"; exit 1; } - bash ./install.sh - cd - > /dev/null || { echo "Failed to return to previous directory"; exit 1; } -} - -# Set trap to ensure we return to the original directory on exit -trap 'cd - > /dev/null' EXIT - -# Run install scripts in the specified directories -run_install namespace -run_install database -run_install webapi -run_install webapp \ No newline at end of file diff --git a/.k8s/without-volume/uninstall.sh b/.k8s/without-volume/uninstall.sh deleted file mode 100644 index 3dd7216..0000000 --- a/.k8s/without-volume/uninstall.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# Function to run uninstall script in a directory -run_uninstall() { - local dir=$1 - cd "$dir" || { echo "Failed to change directory to $dir"; exit 1; } - bash ./uninstall.sh - cd - > /dev/null || { echo "Failed to return to previous directory"; exit 1; } -} - -# Set trap to ensure we return to the original directory on exit -trap 'cd - > /dev/null' EXIT - -# Run uninstall scripts in the specified directories -run_uninstall database -run_uninstall webapi -run_uninstall webapp -run_uninstall namespace diff --git a/.k8s/without-volume/webapi/install.sh b/.k8s/without-volume/webapi/install.sh deleted file mode 100644 index e4e601b..0000000 --- a/.k8s/without-volume/webapi/install.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!bin/bash -kubectl apply -f configmap.yaml -kubectl apply -f secret.yaml -kubectl apply -f deployment.yaml -kubectl apply -f service-nodeport.yaml \ No newline at end of file diff --git a/.k8s/without-volume/webapi/secret.yaml b/.k8s/without-volume/webapi/secret.yaml deleted file mode 100644 index 302f7b3..0000000 --- a/.k8s/without-volume/webapi/secret.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: devcamper-webapi-secret - namespace: devcamper-namespace -type: Opaque -data: - mongodb_username: YWRtaW4= # base64 encoded string for 'admin' - mongodb_password: cGFzc3dvcmQ= # base64 encoded string for 'password' - geocoder_api_key: '' - smtp_host: '' - smtp_port: '' - smtp_email: '' - smtp_password: '' - from_email: '' - from_name: '' - jwt_secret: '' diff --git a/.k8s/without-volume/webapp/install.sh b/.k8s/without-volume/webapp/install.sh deleted file mode 100644 index bfeaf9d..0000000 --- a/.k8s/without-volume/webapp/install.sh +++ /dev/null @@ -1 +0,0 @@ -#!bin/bash diff --git a/.k8s/without-volume/webapp/uninstall.sh b/.k8s/without-volume/webapp/uninstall.sh deleted file mode 100644 index bfeaf9d..0000000 --- a/.k8s/without-volume/webapp/uninstall.sh +++ /dev/null @@ -1 +0,0 @@ -#!bin/bash diff --git a/assets/html/add-bootcamp.html b/assets/html/add-bootcamp.html deleted file mode 100644 index 43feae4..0000000 --- a/assets/html/add-bootcamp.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-

Add Bootcamp

-

- Important: You must be affiliated with a bootcamp to add to DevCamper -

-
-
-
-
-
-

Location & Contact

-

- If multiple locations, use the main or largest -

-
- - -
-
- - - Street, city, state, etc -
-
- - -
-
- - -
-
- - -
-
-
-
-
-
-
-

Other Info

-
- - - No more than 500 characters -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-

- *After you add the bootcamp, you can add the specific courses - offered -

-
-
-
-
-
- - -
-
-
- - - - - - diff --git a/assets/html/add-course.html b/assets/html/add-course.html deleted file mode 100644 index 253039d..0000000 --- a/assets/html/add-course.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
-
-
- Manage Courses -

DevWorks Bootcamp

-

Add Course

-
-
- - -
-
- - - Enter number of weeks course lasts -
-
- - - USD Currency -
-
- - -
-
- - No more than 500 characters -
-
- - -
-
- -
-
-
-
-
-
-
- - - - - - diff --git a/assets/html/add-review.html b/assets/html/add-review.html deleted file mode 100644 index a8439c5..0000000 --- a/assets/html/add-review.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
-
-
- Bootcamp Info -

DevWorks Bootcamp

-

Write a Review

-

- You must have attended and graduated this bootcamp to review -

-
-
- - -
-
- -
-
- -
-
- -
-
-
-
-
-
-
- - - - - - diff --git a/assets/html/bootcamp.html b/assets/html/bootcamp.html deleted file mode 100644 index f01a81a..0000000 --- a/assets/html/bootcamp.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
- -
-

DevWorks Bootcamp

- -

Devworks is a full stack JavaScript Bootcamp located in the heart of Boston that focuses on the technologies you need to get a high paying job as a web developer

- -

Average Course Cost: $10,000

- -
-
Front End Web Development
-
-
Duration: 8 Weeks
-

This course will provide you with all of the essentials to become a successful frontend web developer. You will learn to master HTML, CSS and front end JavaScript, along with tools like Git, VSCode and front end frameworks like Vue

-
    -
  • Cost: $8,000 USD
  • -
  • Skill Required: Beginner
  • -
  • Scholarship Available:
  • -
-
-
- -
-
Full Stack Web Development
-
-
Duration: 12 Weeks
-

In this course you will learn full stack web development, first learning all about the frontend with HTML/CSS/JS/Vue and then the backend with Node.js/Express/MongoDB

-
    -
  • Cost: $10,000 USD
  • -
  • Skill Required: Intermediate
  • -
  • Scholarship Available:
  • -
-
-
-
- -
- - - -

8.8 Rating

- - Read Reviews - Write a Review - Visit Website - -
- -
    -
  • Housing
  • -
  • Job Assistance
  • -
  • Job Guarantee
  • -
  • Accepts GI Bill
  • -
-
-
-
-
- - - - - - - - diff --git a/assets/html/bootcamps.html b/assets/html/bootcamps.html deleted file mode 100644 index d1eca24..0000000 --- a/assets/html/bootcamps.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - - -
-
-
- -
-
-

By Location

-
-
-
-
- -
-
-
-
- -
-
-
- -
-
- -

Filter

-
- - -
- - -
- -
- - -
- -
-
- -
- -
-
-
- ... -
-
-
-
- Devworks Bootcamp - 8.8 -
- Boston, MA -

- Web Development, UI/UX, Mobile Development -

-
-
-
-
- -
-
-
- ... -
-
-
-
- ModernTech Bootcamp - 7.5 -
- Boston, MA -

- Web Development, UI/UX, Mobile Development -

-
-
-
-
-
-
-
- ... -
-
-
-
- Codemasters - 9.2 -
- Burlington, VT -

- Web Development, Data Science, Marketing -

-
-
-
-
- -
-
-
- ... -
-
-
-
- DevCentral Bootcamp - 6.4 -
- Kingston, RI -

- Web Development, UI/UX, Mobile Development, Marketing -

-
-
-
-
- - - -
-
-
-
- - - - - - diff --git a/assets/html/css/bootstrap.css b/assets/html/css/bootstrap.css deleted file mode 100644 index c5afe29..0000000 --- a/assets/html/css/bootstrap.css +++ /dev/null @@ -1,9707 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -:root { - --blue: #007bff; - --indigo: #6610f2; - --purple: #6f42c1; - --pink: #e83e8c; - --red: #dc3545; - --orange: #e05433; - --yellow: #ffc107; - --green: #28a745; - --teal: #20c997; - --cyan: #17a2b8; - --white: #fff; - --gray: #6c757d; - --gray-dark: #343a40; - --primary: #e05433; - --secondary: #6c757d; - --success: #28a745; - --info: #17a2b8; - --warning: #ffc107; - --danger: #dc3545; - --light: #f8f9fa; - --dark: #343a40; - --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; -} -*, -*::before, -*::after { - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -article, -aside, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section { - display: block; -} -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #212529; - text-align: left; - background-color: #f8f9fa; -} -[tabindex='-1']:focus { - outline: 0 !important; -} -hr { - -webkit-box-sizing: content-box; - box-sizing: content-box; - height: 0; - overflow: visible; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin-top: 0; - margin-bottom: 0.5rem; -} -p { - margin-top: 0; - margin-bottom: 1rem; -} -abbr[title], -abbr[data-original-title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; - text-decoration-skip-ink: none; -} -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} -dt { - font-weight: 700; -} -dd { - margin-bottom: 0.5rem; - margin-left: 0; -} -blockquote { - margin: 0 0 1rem; -} -b, -strong { - font-weight: bolder; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sub { - bottom: -0.25em; -} -sup { - top: -0.5em; -} -a { - color: #e05433; - text-decoration: none; - background-color: transparent; -} -a:hover { - color: #ac361a; - text-decoration: underline; -} -a:not([href]):not([tabindex]) { - color: inherit; - text-decoration: none; -} -a:not([href]):not([tabindex]):hover, -a:not([href]):not([tabindex]):focus { - color: inherit; - text-decoration: none; -} -a:not([href]):not([tabindex]):focus { - outline: 0; -} -pre, -code, -kbd, -samp { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; - font-size: 1em; -} -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; -} -figure { - margin: 0 0 1rem; -} -img { - vertical-align: middle; - border-style: none; -} -svg { - overflow: hidden; - vertical-align: middle; -} -table { - border-collapse: collapse; -} -caption { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - color: #6c757d; - text-align: left; - caption-side: bottom; -} -th { - text-align: inherit; -} -label { - display: inline-block; - margin-bottom: 0.5rem; -} -button { - border-radius: 0; -} -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -button, -input { - overflow: visible; -} -button, -select { - text-transform: none; -} -select { - word-wrap: normal; -} -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; -} -button:not(:disabled), -[type='button']:not(:disabled), -[type='reset']:not(:disabled), -[type='submit']:not(:disabled) { - cursor: pointer; -} -button::-moz-focus-inner, -[type='button']::-moz-focus-inner, -[type='reset']::-moz-focus-inner, -[type='submit']::-moz-focus-inner { - padding: 0; - border-style: none; -} -input[type='radio'], -input[type='checkbox'] { - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type='date'], -input[type='time'], -input[type='datetime-local'], -input[type='month'] { - -webkit-appearance: listbox; -} -textarea { - overflow: auto; - resize: vertical; -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: 0.5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal; -} -progress { - vertical-align: baseline; -} -[type='number']::-webkit-inner-spin-button, -[type='number']::-webkit-outer-spin-button { - height: auto; -} -[type='search'] { - outline-offset: -2px; - -webkit-appearance: none; -} -[type='search']::-webkit-search-decoration { - -webkit-appearance: none; -} -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} -output { - display: inline-block; -} -summary { - display: list-item; - cursor: pointer; -} -template { - display: none; -} -[hidden] { - display: none !important; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; -} -h1, -.h1 { - font-size: 2.5rem; -} -h2, -.h2 { - font-size: 2rem; -} -h3, -.h3 { - font-size: 1.75rem; -} -h4, -.h4 { - font-size: 1.5rem; -} -h5, -.h5 { - font-size: 1.25rem; -} -h6, -.h6 { - font-size: 1rem; -} -.lead { - font-size: 1.25rem; - font-weight: 300; -} -.display-1 { - font-size: 6rem; - font-weight: 300; - line-height: 1.2; -} -.display-2 { - font-size: 5.5rem; - font-weight: 300; - line-height: 1.2; -} -.display-3 { - font-size: 4.5rem; - font-weight: 300; - line-height: 1.2; -} -.display-4 { - font-size: 3.5rem; - font-weight: 300; - line-height: 1.2; -} -hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid rgba(0, 0, 0, 0.1); -} -small, -.small { - font-size: 80%; - font-weight: 400; -} -mark, -.mark { - padding: 0.2em; - background-color: #fcf8e3; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - list-style: none; -} -.list-inline-item { - display: inline-block; -} -.list-inline-item:not(:last-child) { - margin-right: 0.5rem; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; -} -.blockquote-footer { - display: block; - font-size: 80%; - color: #6c757d; -} -.blockquote-footer::before { - content: '\2014\00A0'; -} -.img-fluid { - max-width: 100%; - height: auto; -} -.img-thumbnail { - padding: 0.25rem; - background-color: #f8f9fa; - border: 1px solid #dee2e6; - border-radius: 0; - max-width: 100%; - height: auto; -} -.figure { - display: inline-block; -} -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; -} -.figure-caption { - font-size: 90%; - color: #6c757d; -} -code { - font-size: 87.5%; - color: #e83e8c; - word-break: break-word; -} -a > code { - color: inherit; -} -kbd { - padding: 0.2rem 0.4rem; - font-size: 87.5%; - color: #fff; - background-color: #212529; - border-radius: 0; -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: 700; -} -pre { - display: block; - font-size: 87.5%; - color: #212529; -} -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - width: 100%; - padding-right: 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 { - width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - display: -webkit-box; - 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-1, -.col-2, -.col-3, -.col-4, -.col-5, -.col-6, -.col-7, -.col-8, -.col-9, -.col-10, -.col-11, -.col-12, -.col, -.col-auto, -.col-sm-1, -.col-sm-2, -.col-sm-3, -.col-sm-4, -.col-sm-5, -.col-sm-6, -.col-sm-7, -.col-sm-8, -.col-sm-9, -.col-sm-10, -.col-sm-11, -.col-sm-12, -.col-sm, -.col-sm-auto, -.col-md-1, -.col-md-2, -.col-md-3, -.col-md-4, -.col-md-5, -.col-md-6, -.col-md-7, -.col-md-8, -.col-md-9, -.col-md-10, -.col-md-11, -.col-md-12, -.col-md, -.col-md-auto, -.col-lg-1, -.col-lg-2, -.col-lg-3, -.col-lg-4, -.col-lg-5, -.col-lg-6, -.col-lg-7, -.col-lg-8, -.col-lg-9, -.col-lg-10, -.col-lg-11, -.col-lg-12, -.col-lg, -.col-lg-auto, -.col-xl-1, -.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-10, -.col-xl-11, -.col-xl-12, -.col-xl, -.col-xl-auto { - position: relative; - width: 100%; - padding-right: 15px; - padding-left: 15px; -} -.col { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; -} -.col-auto { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; -} -.col-1 { - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333%; - flex: 0 0 8.33333%; - max-width: 8.33333%; -} -.col-2 { - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66667%; - flex: 0 0 16.66667%; - max-width: 16.66667%; -} -.col-3 { - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; -} -.col-4 { - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333%; - flex: 0 0 33.33333%; - max-width: 33.33333%; -} -.col-5 { - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66667%; - flex: 0 0 41.66667%; - max-width: 41.66667%; -} -.col-6 { - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; -} -.col-7 { - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333%; - flex: 0 0 58.33333%; - max-width: 58.33333%; -} -.col-8 { - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66667%; - flex: 0 0 66.66667%; - max-width: 66.66667%; -} -.col-9 { - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; -} -.col-10 { - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333%; - flex: 0 0 83.33333%; - max-width: 83.33333%; -} -.col-11 { - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66667%; - flex: 0 0 91.66667%; - max-width: 91.66667%; -} -.col-12 { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; -} -.order-first { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1; -} -.order-last { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; -} -.order-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; -} -.order-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; -} -.order-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; -} -.order-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; -} -.order-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; -} -.order-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; -} -.order-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; -} -.order-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; -} -.order-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; -} -.order-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; -} -.order-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; -} -.order-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; -} -.order-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; -} -.offset-1 { - margin-left: 8.33333%; -} -.offset-2 { - margin-left: 16.66667%; -} -.offset-3 { - margin-left: 25%; -} -.offset-4 { - margin-left: 33.33333%; -} -.offset-5 { - margin-left: 41.66667%; -} -.offset-6 { - margin-left: 50%; -} -.offset-7 { - margin-left: 58.33333%; -} -.offset-8 { - margin-left: 66.66667%; -} -.offset-9 { - margin-left: 75%; -} -.offset-10 { - margin-left: 83.33333%; -} -.offset-11 { - margin-left: 91.66667%; -} -@media (min-width: 576px) { - .col-sm { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-sm-auto { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-sm-1 { - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333%; - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - .col-sm-2 { - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66667%; - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .col-sm-3 { - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-sm-4 { - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333%; - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .col-sm-5 { - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66667%; - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .col-sm-6 { - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-sm-7 { - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333%; - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .col-sm-8 { - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66667%; - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .col-sm-9 { - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-sm-10 { - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333%; - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .col-sm-11 { - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66667%; - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .col-sm-12 { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-sm-first { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1; - } - .order-sm-last { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; - } - .order-sm-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; - } - .order-sm-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .order-sm-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .order-sm-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .order-sm-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; - } - .order-sm-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; - } - .order-sm-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; - } - .order-sm-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; - } - .order-sm-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; - } - .order-sm-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; - } - .order-sm-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; - } - .order-sm-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; - } - .order-sm-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; - } - .offset-sm-0 { - margin-left: 0; - } - .offset-sm-1 { - margin-left: 8.33333%; - } - .offset-sm-2 { - margin-left: 16.66667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.33333%; - } - .offset-sm-5 { - margin-left: 41.66667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.33333%; - } - .offset-sm-8 { - margin-left: 66.66667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.33333%; - } - .offset-sm-11 { - margin-left: 91.66667%; - } -} -@media (min-width: 768px) { - .col-md { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-md-auto { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-md-1 { - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333%; - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - .col-md-2 { - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66667%; - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .col-md-3 { - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-md-4 { - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333%; - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .col-md-5 { - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66667%; - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .col-md-6 { - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-md-7 { - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333%; - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .col-md-8 { - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66667%; - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .col-md-9 { - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-md-10 { - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333%; - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .col-md-11 { - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66667%; - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .col-md-12 { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-md-first { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1; - } - .order-md-last { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; - } - .order-md-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; - } - .order-md-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .order-md-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .order-md-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .order-md-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; - } - .order-md-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; - } - .order-md-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; - } - .order-md-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; - } - .order-md-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; - } - .order-md-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; - } - .order-md-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; - } - .order-md-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; - } - .order-md-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; - } - .offset-md-0 { - margin-left: 0; - } - .offset-md-1 { - margin-left: 8.33333%; - } - .offset-md-2 { - margin-left: 16.66667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.33333%; - } - .offset-md-5 { - margin-left: 41.66667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.33333%; - } - .offset-md-8 { - margin-left: 66.66667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.33333%; - } - .offset-md-11 { - margin-left: 91.66667%; - } -} -@media (min-width: 992px) { - .col-lg { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-lg-auto { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-lg-1 { - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333%; - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - .col-lg-2 { - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66667%; - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .col-lg-3 { - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-lg-4 { - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333%; - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .col-lg-5 { - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66667%; - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .col-lg-6 { - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-lg-7 { - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333%; - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .col-lg-8 { - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66667%; - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .col-lg-9 { - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-lg-10 { - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333%; - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .col-lg-11 { - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66667%; - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .col-lg-12 { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-lg-first { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1; - } - .order-lg-last { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; - } - .order-lg-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; - } - .order-lg-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .order-lg-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .order-lg-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .order-lg-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; - } - .order-lg-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; - } - .order-lg-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; - } - .order-lg-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; - } - .order-lg-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; - } - .order-lg-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; - } - .order-lg-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; - } - .order-lg-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; - } - .order-lg-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; - } - .offset-lg-0 { - margin-left: 0; - } - .offset-lg-1 { - margin-left: 8.33333%; - } - .offset-lg-2 { - margin-left: 16.66667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.33333%; - } - .offset-lg-5 { - margin-left: 41.66667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.33333%; - } - .offset-lg-8 { - margin-left: 66.66667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.33333%; - } - .offset-lg-11 { - margin-left: 91.66667%; - } -} -@media (min-width: 1200px) { - .col-xl { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-xl-auto { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-xl-1 { - -webkit-box-flex: 0; - -ms-flex: 0 0 8.33333%; - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - .col-xl-2 { - -webkit-box-flex: 0; - -ms-flex: 0 0 16.66667%; - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .col-xl-3 { - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-xl-4 { - -webkit-box-flex: 0; - -ms-flex: 0 0 33.33333%; - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .col-xl-5 { - -webkit-box-flex: 0; - -ms-flex: 0 0 41.66667%; - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .col-xl-6 { - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-xl-7 { - -webkit-box-flex: 0; - -ms-flex: 0 0 58.33333%; - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .col-xl-8 { - -webkit-box-flex: 0; - -ms-flex: 0 0 66.66667%; - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .col-xl-9 { - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-xl-10 { - -webkit-box-flex: 0; - -ms-flex: 0 0 83.33333%; - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .col-xl-11 { - -webkit-box-flex: 0; - -ms-flex: 0 0 91.66667%; - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .col-xl-12 { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-xl-first { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1; - } - .order-xl-last { - -webkit-box-ordinal-group: 14; - -ms-flex-order: 13; - order: 13; - } - .order-xl-0 { - -webkit-box-ordinal-group: 1; - -ms-flex-order: 0; - order: 0; - } - .order-xl-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1; - } - .order-xl-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2; - } - .order-xl-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3; - } - .order-xl-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4; - } - .order-xl-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5; - } - .order-xl-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6; - } - .order-xl-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7; - } - .order-xl-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8; - } - .order-xl-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9; - } - .order-xl-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10; - } - .order-xl-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11; - } - .order-xl-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12; - } - .offset-xl-0 { - margin-left: 0; - } - .offset-xl-1 { - margin-left: 8.33333%; - } - .offset-xl-2 { - margin-left: 16.66667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.33333%; - } - .offset-xl-5 { - margin-left: 41.66667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.33333%; - } - .offset-xl-8 { - margin-left: 66.66667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.33333%; - } - .offset-xl-11 { - margin-left: 91.66667%; - } -} -.table { - width: 100%; - margin-bottom: 1rem; - color: #212529; -} -.table th, -.table td { - padding: 0.75rem; - vertical-align: top; - border-top: 1px solid #dee2e6; -} -.table thead th { - vertical-align: bottom; - border-bottom: 2px solid #dee2e6; -} -.table tbody + tbody { - border-top: 2px solid #dee2e6; -} -.table-sm th, -.table-sm td { - padding: 0.3rem; -} -.table-bordered { - border: 1px solid #dee2e6; -} -.table-bordered th, -.table-bordered td { - border: 1px solid #dee2e6; -} -.table-bordered thead th, -.table-bordered thead td { - border-bottom-width: 2px; -} -.table-borderless th, -.table-borderless td, -.table-borderless thead th, -.table-borderless tbody + tbody { - border: 0; -} -.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(0, 0, 0, 0.05); -} -.table-hover tbody tr:hover { - color: #212529; - background-color: rgba(0, 0, 0, 0.075); -} -.table-primary, -.table-primary > th, -.table-primary > td { - background-color: #f6cfc6; -} -.table-primary th, -.table-primary td, -.table-primary thead th, -.table-primary tbody + tbody { - border-color: #efa695; -} -.table-hover .table-primary:hover { - background-color: #f3bcb0; -} -.table-hover .table-primary:hover > td, -.table-hover .table-primary:hover > th { - background-color: #f3bcb0; -} -.table-secondary, -.table-secondary > th, -.table-secondary > td { - background-color: #d6d8db; -} -.table-secondary th, -.table-secondary td, -.table-secondary thead th, -.table-secondary tbody + tbody { - border-color: #b3b7bb; -} -.table-hover .table-secondary:hover { - background-color: #c8cbcf; -} -.table-hover .table-secondary:hover > td, -.table-hover .table-secondary:hover > th { - background-color: #c8cbcf; -} -.table-success, -.table-success > th, -.table-success > td { - background-color: #c3e6cb; -} -.table-success th, -.table-success td, -.table-success thead th, -.table-success tbody + tbody { - border-color: #8fd19e; -} -.table-hover .table-success:hover { - background-color: #b1dfbb; -} -.table-hover .table-success:hover > td, -.table-hover .table-success:hover > th { - background-color: #b1dfbb; -} -.table-info, -.table-info > th, -.table-info > td { - background-color: #bee5eb; -} -.table-info th, -.table-info td, -.table-info thead th, -.table-info tbody + tbody { - border-color: #86cfda; -} -.table-hover .table-info:hover { - background-color: #abdde5; -} -.table-hover .table-info:hover > td, -.table-hover .table-info:hover > th { - background-color: #abdde5; -} -.table-warning, -.table-warning > th, -.table-warning > td { - background-color: #ffeeba; -} -.table-warning th, -.table-warning td, -.table-warning thead th, -.table-warning tbody + tbody { - border-color: #ffdf7e; -} -.table-hover .table-warning:hover { - background-color: #ffe8a1; -} -.table-hover .table-warning:hover > td, -.table-hover .table-warning:hover > th { - background-color: #ffe8a1; -} -.table-danger, -.table-danger > th, -.table-danger > td { - background-color: #f5c6cb; -} -.table-danger th, -.table-danger td, -.table-danger thead th, -.table-danger tbody + tbody { - border-color: #ed969e; -} -.table-hover .table-danger:hover { - background-color: #f1b0b7; -} -.table-hover .table-danger:hover > td, -.table-hover .table-danger:hover > th { - background-color: #f1b0b7; -} -.table-light, -.table-light > th, -.table-light > td { - background-color: #fdfdfe; -} -.table-light th, -.table-light td, -.table-light thead th, -.table-light tbody + tbody { - border-color: #fbfcfc; -} -.table-hover .table-light:hover { - background-color: #ececf6; -} -.table-hover .table-light:hover > td, -.table-hover .table-light:hover > th { - background-color: #ececf6; -} -.table-dark, -.table-dark > th, -.table-dark > td { - background-color: #c6c8ca; -} -.table-dark th, -.table-dark td, -.table-dark thead th, -.table-dark tbody + tbody { - border-color: #95999c; -} -.table-hover .table-dark:hover { - background-color: #b9bbbe; -} -.table-hover .table-dark:hover > td, -.table-hover .table-dark:hover > th { - background-color: #b9bbbe; -} -.table-active, -.table-active > th, -.table-active > td { - background-color: rgba(0, 0, 0, 0.075); -} -.table-hover .table-active:hover { - background-color: rgba(0, 0, 0, 0.075); -} -.table-hover .table-active:hover > td, -.table-hover .table-active:hover > th { - background-color: rgba(0, 0, 0, 0.075); -} -.table .thead-dark th { - color: #fff; - background-color: #343a40; - border-color: #454d55; -} -.table .thead-light th { - color: #495057; - background-color: #e9ecef; - border-color: #dee2e6; -} -.table-dark { - color: #fff; - background-color: #343a40; -} -.table-dark th, -.table-dark td, -.table-dark thead th { - border-color: #454d55; -} -.table-dark.table-bordered { - border: 0; -} -.table-dark.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(255, 255, 255, 0.05); -} -.table-dark.table-hover tbody tr:hover { - color: #fff; - background-color: rgba(255, 255, 255, 0.075); -} -@media (max-width: 575.98px) { - .table-responsive-sm { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-sm > .table-bordered { - border: 0; - } -} -@media (max-width: 767.98px) { - .table-responsive-md { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-md > .table-bordered { - border: 0; - } -} -@media (max-width: 991.98px) { - .table-responsive-lg { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-lg > .table-bordered { - border: 0; - } -} -@media (max-width: 1199.98px) { - .table-responsive-xl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-xl > .table-bordered { - border: 0; - } -} -.table-responsive { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; -} -.table-responsive > .table-bordered { - border: 0; -} -.form-control { - display: block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ced4da; - border-radius: 0; - -webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; - transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-control { - -webkit-transition: none; - transition: none; - } -} -.form-control::-ms-expand { - background-color: transparent; - border: 0; -} -.form-control:focus { - color: #495057; - background-color: #fff; - border-color: #f1b1a2; - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); - box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); -} -.form-control::-webkit-input-placeholder { - color: #6c757d; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #6c757d; - opacity: 1; -} -.form-control::-ms-input-placeholder { - color: #6c757d; - opacity: 1; -} -.form-control::placeholder { - color: #6c757d; - opacity: 1; -} -.form-control:disabled, -.form-control[readonly] { - background-color: #e9ecef; - opacity: 1; -} -select.form-control:focus::-ms-value { - color: #495057; - background-color: #fff; -} -.form-control-file, -.form-control-range { - display: block; - width: 100%; -} -.col-form-label { - padding-top: calc(0.375rem + 1px); - padding-bottom: calc(0.375rem + 1px); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5; -} -.col-form-label-lg { - padding-top: calc(0.5rem + 1px); - padding-bottom: calc(0.5rem + 1px); - font-size: 1.25rem; - line-height: 1.5; -} -.col-form-label-sm { - padding-top: calc(0.25rem + 1px); - padding-bottom: calc(0.25rem + 1px); - font-size: 0.875rem; - line-height: 1.5; -} -.form-control-plaintext { - display: block; - width: 100%; - padding-top: 0.375rem; - padding-bottom: 0.375rem; - margin-bottom: 0; - line-height: 1.5; - color: #212529; - background-color: transparent; - border: solid transparent; - border-width: 1px 0; -} -.form-control-plaintext.form-control-sm, -.form-control-plaintext.form-control-lg { - padding-right: 0; - padding-left: 0; -} -.form-control-sm { - height: calc(1.5em + 0.5rem + 2px); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0; -} -.form-control-lg { - height: calc(1.5em + 1rem + 2px); - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0; -} -select.form-control[size], -select.form-control[multiple] { - height: auto; -} -textarea.form-control { - height: auto; -} -.form-group { - margin-bottom: 1rem; -} -.form-text { - display: block; - margin-top: 0.25rem; -} -.form-row { - display: -webkit-box; - 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; - padding-left: 1.25rem; -} -.form-check-input { - position: absolute; - margin-top: 0.3rem; - margin-left: -1.25rem; -} -.form-check-input:disabled ~ .form-check-label { - color: #6c757d; -} -.form-check-label { - margin-bottom: 0; -} -.form-check-inline { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - padding-left: 0; - margin-right: 0.75rem; -} -.form-check-inline .form-check-input { - position: static; - margin-top: 0; - margin-right: 0.3125rem; - margin-left: 0; -} -.valid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 80%; - color: #28a745; -} -.valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(40, 167, 69, 0.9); - border-radius: 0; -} -.was-validated .form-control:valid, -.form-control.is-valid { - border-color: #28a745; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' 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-position: center right calc(0.375em + 0.1875rem); - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:valid:focus, -.form-control.is-valid:focus { - border-color: #28a745; - -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} -.was-validated .form-control:valid ~ .valid-feedback, -.was-validated .form-control:valid ~ .valid-tooltip, -.form-control.is-valid ~ .valid-feedback, -.form-control.is-valid ~ .valid-tooltip { - display: block; -} -.was-validated textarea.form-control:valid, -textarea.form-control.is-valid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} -.was-validated .custom-select:valid, -.custom-select.is-valid { - border-color: #28a745; - padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") - no-repeat right 0.75rem center/8px 10px, - url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' 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(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .custom-select:valid:focus, -.custom-select.is-valid:focus { - border-color: #28a745; - -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} -.was-validated .custom-select:valid ~ .valid-feedback, -.was-validated .custom-select:valid ~ .valid-tooltip, -.custom-select.is-valid ~ .valid-feedback, -.custom-select.is-valid ~ .valid-tooltip { - display: block; -} -.was-validated .form-control-file:valid ~ .valid-feedback, -.was-validated .form-control-file:valid ~ .valid-tooltip, -.form-control-file.is-valid ~ .valid-feedback, -.form-control-file.is-valid ~ .valid-tooltip { - display: block; -} -.was-validated .form-check-input:valid ~ .form-check-label, -.form-check-input.is-valid ~ .form-check-label { - color: #28a745; -} -.was-validated .form-check-input:valid ~ .valid-feedback, -.was-validated .form-check-input:valid ~ .valid-tooltip, -.form-check-input.is-valid ~ .valid-feedback, -.form-check-input.is-valid ~ .valid-tooltip { - display: block; -} -.was-validated .custom-control-input:valid ~ .custom-control-label, -.custom-control-input.is-valid ~ .custom-control-label { - color: #28a745; -} -.was-validated .custom-control-input:valid ~ .custom-control-label::before, -.custom-control-input.is-valid ~ .custom-control-label::before { - border-color: #28a745; -} -.was-validated .custom-control-input:valid ~ .valid-feedback, -.was-validated .custom-control-input:valid ~ .valid-tooltip, -.custom-control-input.is-valid ~ .valid-feedback, -.custom-control-input.is-valid ~ .valid-tooltip { - display: block; -} -.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, -.custom-control-input.is-valid:checked ~ .custom-control-label::before { - border-color: #34ce57; - background-color: #34ce57; -} -.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, -.custom-control-input.is-valid:focus ~ .custom-control-label::before { - -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} -.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, -.custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { - border-color: #28a745; -} -.was-validated .custom-file-input:valid ~ .custom-file-label, -.custom-file-input.is-valid ~ .custom-file-label { - border-color: #28a745; -} -.was-validated .custom-file-input:valid ~ .valid-feedback, -.was-validated .custom-file-input:valid ~ .valid-tooltip, -.custom-file-input.is-valid ~ .valid-feedback, -.custom-file-input.is-valid ~ .valid-tooltip { - display: block; -} -.was-validated .custom-file-input:valid:focus ~ .custom-file-label, -.custom-file-input.is-valid:focus ~ .custom-file-label { - border-color: #28a745; - -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} -.invalid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 80%; - color: #dc3545; -} -.invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(220, 53, 69, 0.9); - border-radius: 0; -} -.was-validated .form-control:invalid, -.form-control.is-invalid { - border-color: #dc3545; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); - background-repeat: no-repeat; - background-position: center right calc(0.375em + 0.1875rem); - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:invalid:focus, -.form-control.is-invalid:focus { - border-color: #dc3545; - -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} -.was-validated .form-control:invalid ~ .invalid-feedback, -.was-validated .form-control:invalid ~ .invalid-tooltip, -.form-control.is-invalid ~ .invalid-feedback, -.form-control.is-invalid ~ .invalid-tooltip { - display: block; -} -.was-validated textarea.form-control:invalid, -textarea.form-control.is-invalid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} -.was-validated .custom-select:invalid, -.custom-select.is-invalid { - border-color: #dc3545; - padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") - no-repeat right 0.75rem center/8px 10px, - url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") - #fff no-repeat center right 1.75rem / calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .custom-select:invalid:focus, -.custom-select.is-invalid:focus { - border-color: #dc3545; - -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} -.was-validated .custom-select:invalid ~ .invalid-feedback, -.was-validated .custom-select:invalid ~ .invalid-tooltip, -.custom-select.is-invalid ~ .invalid-feedback, -.custom-select.is-invalid ~ .invalid-tooltip { - display: block; -} -.was-validated .form-control-file:invalid ~ .invalid-feedback, -.was-validated .form-control-file:invalid ~ .invalid-tooltip, -.form-control-file.is-invalid ~ .invalid-feedback, -.form-control-file.is-invalid ~ .invalid-tooltip { - display: block; -} -.was-validated .form-check-input:invalid ~ .form-check-label, -.form-check-input.is-invalid ~ .form-check-label { - color: #dc3545; -} -.was-validated .form-check-input:invalid ~ .invalid-feedback, -.was-validated .form-check-input:invalid ~ .invalid-tooltip, -.form-check-input.is-invalid ~ .invalid-feedback, -.form-check-input.is-invalid ~ .invalid-tooltip { - display: block; -} -.was-validated .custom-control-input:invalid ~ .custom-control-label, -.custom-control-input.is-invalid ~ .custom-control-label { - color: #dc3545; -} -.was-validated .custom-control-input:invalid ~ .custom-control-label::before, -.custom-control-input.is-invalid ~ .custom-control-label::before { - border-color: #dc3545; -} -.was-validated .custom-control-input:invalid ~ .invalid-feedback, -.was-validated .custom-control-input:invalid ~ .invalid-tooltip, -.custom-control-input.is-invalid ~ .invalid-feedback, -.custom-control-input.is-invalid ~ .invalid-tooltip { - display: block; -} -.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, -.custom-control-input.is-invalid:checked ~ .custom-control-label::before { - border-color: #e4606d; - background-color: #e4606d; -} -.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, -.custom-control-input.is-invalid:focus ~ .custom-control-label::before { - -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} -.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, -.custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { - border-color: #dc3545; -} -.was-validated .custom-file-input:invalid ~ .custom-file-label, -.custom-file-input.is-invalid ~ .custom-file-label { - border-color: #dc3545; -} -.was-validated .custom-file-input:invalid ~ .invalid-feedback, -.was-validated .custom-file-input:invalid ~ .invalid-tooltip, -.custom-file-input.is-invalid ~ .invalid-feedback, -.custom-file-input.is-invalid ~ .invalid-tooltip { - display: block; -} -.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, -.custom-file-input.is-invalid:focus ~ .custom-file-label { - border-color: #dc3545; - -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} -.form-inline { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.form-inline .form-check { - width: 100%; -} -@media (min-width: 576px) { - .form-inline label { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - margin-bottom: 0; - } - .form-inline .form-group { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - margin-bottom: 0; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-plaintext { - display: inline-block; - } - .form-inline .input-group, - .form-inline .custom-select { - width: auto; - } - .form-inline .form-check { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - width: auto; - padding-left: 0; - } - .form-inline .form-check-input { - position: relative; - -ms-flex-negative: 0; - flex-shrink: 0; - margin-top: 0; - margin-right: 0.25rem; - margin-left: 0; - } - .form-inline .custom-control { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - } - .form-inline .custom-control-label { - margin-bottom: 0; - } -} -.btn { - display: inline-block; - font-weight: 400; - color: #212529; - text-align: center; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - padding: 0.375rem 0.75rem; - font-size: 1rem; - line-height: 1.5; - border-radius: 0; - -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - box-shadow 0.15s ease-in-out; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .btn { - -webkit-transition: none; - transition: none; - } -} -.btn:hover { - color: #212529; - text-decoration: none; -} -.btn:focus, -.btn.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); - box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); -} -.btn.disabled, -.btn:disabled { - opacity: 0.65; -} -a.btn.disabled, -fieldset:disabled a.btn { - pointer-events: none; -} -.btn-primary { - color: #fff; - background-color: #e05433; - border-color: #e05433; -} -.btn-primary:hover { - color: #fff; - background-color: #ce401f; - border-color: #c23d1e; -} -.btn-primary:focus, -.btn-primary.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(229, 110, 82, 0.5); - box-shadow: 0 0 0 0.2rem rgba(229, 110, 82, 0.5); -} -.btn-primary.disabled, -.btn-primary:disabled { - color: #fff; - background-color: #e05433; - border-color: #e05433; -} -.btn-primary:not(:disabled):not(.disabled):active, -.btn-primary:not(:disabled):not(.disabled).active, -.show > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #c23d1e; - border-color: #b73a1c; -} -.btn-primary:not(:disabled):not(.disabled):active:focus, -.btn-primary:not(:disabled):not(.disabled).active:focus, -.show > .btn-primary.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(229, 110, 82, 0.5); - box-shadow: 0 0 0 0.2rem rgba(229, 110, 82, 0.5); -} -.btn-secondary { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-secondary:hover { - color: #fff; - background-color: #5a6268; - border-color: #545b62; -} -.btn-secondary:focus, -.btn-secondary.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); - box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} -.btn-secondary.disabled, -.btn-secondary:disabled { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-secondary:not(:disabled):not(.disabled):active, -.btn-secondary:not(:disabled):not(.disabled).active, -.show > .btn-secondary.dropdown-toggle { - color: #fff; - background-color: #545b62; - border-color: #4e555b; -} -.btn-secondary:not(:disabled):not(.disabled):active:focus, -.btn-secondary:not(:disabled):not(.disabled).active:focus, -.show > .btn-secondary.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); - box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} -.btn-success { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-success:hover { - color: #fff; - background-color: #218838; - border-color: #1e7e34; -} -.btn-success:focus, -.btn-success.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); - box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); -} -.btn-success.disabled, -.btn-success:disabled { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-success:not(:disabled):not(.disabled):active, -.btn-success:not(:disabled):not(.disabled).active, -.show > .btn-success.dropdown-toggle { - color: #fff; - background-color: #1e7e34; - border-color: #1c7430; -} -.btn-success:not(:disabled):not(.disabled):active:focus, -.btn-success:not(:disabled):not(.disabled).active:focus, -.show > .btn-success.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); - box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); -} -.btn-info { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-info:hover { - color: #fff; - background-color: #138496; - border-color: #117a8b; -} -.btn-info:focus, -.btn-info.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); - box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); -} -.btn-info.disabled, -.btn-info:disabled { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-info:not(:disabled):not(.disabled):active, -.btn-info:not(:disabled):not(.disabled).active, -.show > .btn-info.dropdown-toggle { - color: #fff; - background-color: #117a8b; - border-color: #10707f; -} -.btn-info:not(:disabled):not(.disabled):active:focus, -.btn-info:not(:disabled):not(.disabled).active:focus, -.show > .btn-info.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); - box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); -} -.btn-warning { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-warning:hover { - color: #212529; - background-color: #e0a800; - border-color: #d39e00; -} -.btn-warning:focus, -.btn-warning.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); - box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); -} -.btn-warning.disabled, -.btn-warning:disabled { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-warning:not(:disabled):not(.disabled):active, -.btn-warning:not(:disabled):not(.disabled).active, -.show > .btn-warning.dropdown-toggle { - color: #212529; - background-color: #d39e00; - border-color: #c69500; -} -.btn-warning:not(:disabled):not(.disabled):active:focus, -.btn-warning:not(:disabled):not(.disabled).active:focus, -.show > .btn-warning.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); - box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); -} -.btn-danger { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-danger:hover { - color: #fff; - background-color: #c82333; - border-color: #bd2130; -} -.btn-danger:focus, -.btn-danger.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); - box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); -} -.btn-danger.disabled, -.btn-danger:disabled { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-danger:not(:disabled):not(.disabled):active, -.btn-danger:not(:disabled):not(.disabled).active, -.show > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #bd2130; - border-color: #b21f2d; -} -.btn-danger:not(:disabled):not(.disabled):active:focus, -.btn-danger:not(:disabled):not(.disabled).active:focus, -.show > .btn-danger.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); - box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); -} -.btn-light { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-light:hover { - color: #212529; - background-color: #e2e6ea; - border-color: #dae0e5; -} -.btn-light:focus, -.btn-light.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); - box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} -.btn-light.disabled, -.btn-light:disabled { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-light:not(:disabled):not(.disabled):active, -.btn-light:not(:disabled):not(.disabled).active, -.show > .btn-light.dropdown-toggle { - color: #212529; - background-color: #dae0e5; - border-color: #d3d9df; -} -.btn-light:not(:disabled):not(.disabled):active:focus, -.btn-light:not(:disabled):not(.disabled).active:focus, -.show > .btn-light.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); - box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} -.btn-dark { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-dark:hover { - color: #fff; - background-color: #23272b; - border-color: #1d2124; -} -.btn-dark:focus, -.btn-dark.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); - box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} -.btn-dark.disabled, -.btn-dark:disabled { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-dark:not(:disabled):not(.disabled):active, -.btn-dark:not(:disabled):not(.disabled).active, -.show > .btn-dark.dropdown-toggle { - color: #fff; - background-color: #1d2124; - border-color: #171a1d; -} -.btn-dark:not(:disabled):not(.disabled):active:focus, -.btn-dark:not(:disabled):not(.disabled).active:focus, -.show > .btn-dark.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); - box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} -.btn-outline-primary { - color: #e05433; - border-color: #e05433; -} -.btn-outline-primary:hover { - color: #fff; - background-color: #e05433; - border-color: #e05433; -} -.btn-outline-primary:focus, -.btn-outline-primary.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5); - box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5); -} -.btn-outline-primary.disabled, -.btn-outline-primary:disabled { - color: #e05433; - background-color: transparent; -} -.btn-outline-primary:not(:disabled):not(.disabled):active, -.btn-outline-primary:not(:disabled):not(.disabled).active, -.show > .btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #e05433; - border-color: #e05433; -} -.btn-outline-primary:not(:disabled):not(.disabled):active:focus, -.btn-outline-primary:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-primary.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5); - box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5); -} -.btn-outline-secondary { - color: #6c757d; - border-color: #6c757d; -} -.btn-outline-secondary:hover { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-outline-secondary:focus, -.btn-outline-secondary.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} -.btn-outline-secondary.disabled, -.btn-outline-secondary:disabled { - color: #6c757d; - background-color: transparent; -} -.btn-outline-secondary:not(:disabled):not(.disabled):active, -.btn-outline-secondary:not(:disabled):not(.disabled).active, -.show > .btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, -.btn-outline-secondary:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-secondary.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} -.btn-outline-success { - color: #28a745; - border-color: #28a745; -} -.btn-outline-success:hover { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-outline-success:focus, -.btn-outline-success.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} -.btn-outline-success.disabled, -.btn-outline-success:disabled { - color: #28a745; - background-color: transparent; -} -.btn-outline-success:not(:disabled):not(.disabled):active, -.btn-outline-success:not(:disabled):not(.disabled).active, -.show > .btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-outline-success:not(:disabled):not(.disabled):active:focus, -.btn-outline-success:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-success.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} -.btn-outline-info { - color: #17a2b8; - border-color: #17a2b8; -} -.btn-outline-info:hover { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-outline-info:focus, -.btn-outline-info.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} -.btn-outline-info.disabled, -.btn-outline-info:disabled { - color: #17a2b8; - background-color: transparent; -} -.btn-outline-info:not(:disabled):not(.disabled):active, -.btn-outline-info:not(:disabled):not(.disabled).active, -.show > .btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-outline-info:not(:disabled):not(.disabled):active:focus, -.btn-outline-info:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-info.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} -.btn-outline-warning { - color: #ffc107; - border-color: #ffc107; -} -.btn-outline-warning:hover { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-outline-warning:focus, -.btn-outline-warning.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} -.btn-outline-warning.disabled, -.btn-outline-warning:disabled { - color: #ffc107; - background-color: transparent; -} -.btn-outline-warning:not(:disabled):not(.disabled):active, -.btn-outline-warning:not(:disabled):not(.disabled).active, -.show > .btn-outline-warning.dropdown-toggle { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-outline-warning:not(:disabled):not(.disabled):active:focus, -.btn-outline-warning:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-warning.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} -.btn-outline-danger { - color: #dc3545; - border-color: #dc3545; -} -.btn-outline-danger:hover { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-outline-danger:focus, -.btn-outline-danger.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} -.btn-outline-danger.disabled, -.btn-outline-danger:disabled { - color: #dc3545; - background-color: transparent; -} -.btn-outline-danger:not(:disabled):not(.disabled):active, -.btn-outline-danger:not(:disabled):not(.disabled).active, -.show > .btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-outline-danger:not(:disabled):not(.disabled):active:focus, -.btn-outline-danger:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-danger.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} -.btn-outline-light { - color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-outline-light:hover { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-outline-light:focus, -.btn-outline-light.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} -.btn-outline-light.disabled, -.btn-outline-light:disabled { - color: #f8f9fa; - background-color: transparent; -} -.btn-outline-light:not(:disabled):not(.disabled):active, -.btn-outline-light:not(:disabled):not(.disabled).active, -.show > .btn-outline-light.dropdown-toggle { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-outline-light:not(:disabled):not(.disabled):active:focus, -.btn-outline-light:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-light.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} -.btn-outline-dark { - color: #343a40; - border-color: #343a40; -} -.btn-outline-dark:hover { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-outline-dark:focus, -.btn-outline-dark.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} -.btn-outline-dark.disabled, -.btn-outline-dark:disabled { - color: #343a40; - background-color: transparent; -} -.btn-outline-dark:not(:disabled):not(.disabled):active, -.btn-outline-dark:not(:disabled):not(.disabled).active, -.show > .btn-outline-dark.dropdown-toggle { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-outline-dark:not(:disabled):not(.disabled):active:focus, -.btn-outline-dark:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-dark.dropdown-toggle:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} -.btn-link { - font-weight: 400; - color: #e05433; - text-decoration: none; -} -.btn-link:hover { - color: #ac361a; - text-decoration: underline; -} -.btn-link:focus, -.btn-link.focus { - text-decoration: underline; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link:disabled, -.btn-link.disabled { - color: #6c757d; - pointer-events: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 0.5rem; -} -input[type='submit'].btn-block, -input[type='reset'].btn-block, -input[type='button'].btn-block { - width: 100%; -} -.fade { - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -@media (prefers-reduced-motion: reduce) { - .fade { - -webkit-transition: none; - transition: none; - } -} -.fade:not(.show) { - opacity: 0; -} -.collapse:not(.show) { - display: none; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - transition: height 0.35s ease; -} -@media (prefers-reduced-motion: reduce) { - .collapsing { - -webkit-transition: none; - transition: none; - } -} -.dropup, -.dropright, -.dropdown, -.dropleft { - position: relative; -} -.dropdown-toggle { - white-space: nowrap; -} -.dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ''; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; -} -.dropdown-toggle:empty::after { - margin-left: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: 0.5rem 0; - margin: 0.125rem 0 0; - font-size: 1rem; - color: #212529; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -@media (min-width: 576px) { - .dropdown-menu-sm-left { - right: auto; - left: 0; - } - .dropdown-menu-sm-right { - right: 0; - left: auto; - } -} -@media (min-width: 768px) { - .dropdown-menu-md-left { - right: auto; - left: 0; - } - .dropdown-menu-md-right { - right: 0; - left: auto; - } -} -@media (min-width: 992px) { - .dropdown-menu-lg-left { - right: auto; - left: 0; - } - .dropdown-menu-lg-right { - right: 0; - left: auto; - } -} -@media (min-width: 1200px) { - .dropdown-menu-xl-left { - right: auto; - left: 0; - } - .dropdown-menu-xl-right { - right: 0; - left: auto; - } -} -.dropup .dropdown-menu { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: 0.125rem; -} -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ''; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; -} -.dropup .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropright .dropdown-menu { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: 0.125rem; -} -.dropright .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ''; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; -} -.dropright .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropright .dropdown-toggle::after { - vertical-align: 0; -} -.dropleft .dropdown-menu { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: 0.125rem; -} -.dropleft .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ''; -} -.dropleft .dropdown-toggle::after { - display: none; -} -.dropleft .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ''; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; -} -.dropleft .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropleft .dropdown-toggle::before { - vertical-align: 0; -} -.dropdown-menu[x-placement^='top'], -.dropdown-menu[x-placement^='right'], -.dropdown-menu[x-placement^='bottom'], -.dropdown-menu[x-placement^='left'] { - right: auto; - bottom: auto; -} -.dropdown-divider { - height: 0; - margin: 0.5rem 0; - overflow: hidden; - border-top: 1px solid #e9ecef; -} -.dropdown-item { - display: block; - width: 100%; - padding: 0.25rem 1.5rem; - clear: both; - font-weight: 400; - color: #212529; - text-align: inherit; - white-space: nowrap; - background-color: transparent; - border: 0; -} -.dropdown-item:hover, -.dropdown-item:focus { - color: #16181b; - text-decoration: none; - background-color: #f8f9fa; -} -.dropdown-item.active, -.dropdown-item:active { - color: #fff; - text-decoration: none; - background-color: #e05433; -} -.dropdown-item.disabled, -.dropdown-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: transparent; -} -.dropdown-menu.show { - display: block; -} -.dropdown-header { - display: block; - padding: 0.5rem 1.5rem; - margin-bottom: 0; - font-size: 0.875rem; - color: #6c757d; - white-space: nowrap; -} -.dropdown-item-text { - display: block; - padding: 0.25rem 1.5rem; - color: #212529; -} -.btn-group, -.btn-group-vertical { - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - -webkit-box-flex: 1; - -ms-flex: 1 1 auto; - flex: 1 1 auto; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover { - z-index: 1; -} -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 1; -} -.btn-toolbar { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; -} -.btn-toolbar .input-group { - width: auto; -} -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) { - margin-left: -1px; -} -.btn-group > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.dropdown-toggle-split { - padding-right: 0.5625rem; - padding-left: 0.5625rem; -} -.dropdown-toggle-split::after, -.dropup .dropdown-toggle-split::after, -.dropright .dropdown-toggle-split::after { - margin-left: 0; -} -.dropleft .dropdown-toggle-split::before { - margin-right: 0; -} -.btn-sm + .dropdown-toggle-split, -.btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; -} -.btn-lg + .dropdown-toggle-split, -.btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; -} -.btn-group-vertical { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { - width: 100%; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) { - margin-top: -1px; -} -.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group-vertical > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) > .btn { - 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='radio'], -.btn-group-toggle > .btn input[type='checkbox'], -.btn-group-toggle > .btn-group > .btn input[type='radio'], -.btn-group-toggle > .btn-group > .btn input[type='checkbox'] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.input-group { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - width: 100%; -} -.input-group > .form-control, -.input-group > .form-control-plaintext, -.input-group > .custom-select, -.input-group > .custom-file { - position: relative; - -webkit-box-flex: 1; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - width: 1%; - margin-bottom: 0; -} -.input-group > .form-control + .form-control, -.input-group > .form-control + .custom-select, -.input-group > .form-control + .custom-file, -.input-group > .form-control-plaintext + .form-control, -.input-group > .form-control-plaintext + .custom-select, -.input-group > .form-control-plaintext + .custom-file, -.input-group > .custom-select + .form-control, -.input-group > .custom-select + .custom-select, -.input-group > .custom-select + .custom-file, -.input-group > .custom-file + .form-control, -.input-group > .custom-file + .custom-select, -.input-group > .custom-file + .custom-file { - margin-left: -1px; -} -.input-group > .form-control:focus, -.input-group > .custom-select:focus, -.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { - z-index: 3; -} -.input-group > .custom-file .custom-file-input:focus { - z-index: 4; -} -.input-group > .form-control:not(:last-child), -.input-group > .custom-select:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group > .form-control:not(:first-child), -.input-group > .custom-select:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group > .custom-file { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.input-group > .custom-file:not(:last-child) .custom-file-label, -.input-group > .custom-file:not(:last-child) .custom-file-label::after { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group > .custom-file:not(:first-child) .custom-file-label { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-prepend, -.input-group-append { - display: -webkit-box; - display: -ms-flexbox; - display: flex; -} -.input-group-prepend .btn, -.input-group-append .btn { - position: relative; - z-index: 2; -} -.input-group-prepend .btn:focus, -.input-group-append .btn:focus { - z-index: 3; -} -.input-group-prepend .btn + .btn, -.input-group-prepend .btn + .input-group-text, -.input-group-prepend .input-group-text + .input-group-text, -.input-group-prepend .input-group-text + .btn, -.input-group-append .btn + .btn, -.input-group-append .btn + .input-group-text, -.input-group-append .input-group-text + .input-group-text, -.input-group-append .input-group-text + .btn { - margin-left: -1px; -} -.input-group-prepend { - margin-right: -1px; -} -.input-group-append { - margin-left: -1px; -} -.input-group-text { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - padding: 0.375rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - text-align: center; - white-space: nowrap; - background-color: #e9ecef; - border: 1px solid #ced4da; - border-radius: 0; -} -.input-group-text input[type='radio'], -.input-group-text input[type='checkbox'] { - margin-top: 0; -} -.input-group-lg > .form-control:not(textarea), -.input-group-lg > .custom-select { - height: calc(1.5em + 1rem + 2px); -} -.input-group-lg > .form-control, -.input-group-lg > .custom-select, -.input-group-lg > .input-group-prepend > .input-group-text, -.input-group-lg > .input-group-append > .input-group-text, -.input-group-lg > .input-group-prepend > .btn, -.input-group-lg > .input-group-append > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0; -} -.input-group-sm > .form-control:not(textarea), -.input-group-sm > .custom-select { - height: calc(1.5em + 0.5rem + 2px); -} -.input-group-sm > .form-control, -.input-group-sm > .custom-select, -.input-group-sm > .input-group-prepend > .input-group-text, -.input-group-sm > .input-group-append > .input-group-text, -.input-group-sm > .input-group-prepend > .btn, -.input-group-sm > .input-group-append > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0; -} -.input-group-lg > .custom-select, -.input-group-sm > .custom-select { - padding-right: 1.75rem; -} -.input-group > .input-group-prepend > .btn, -.input-group > .input-group-prepend > .input-group-text, -.input-group > .input-group-append:not(:last-child) > .btn, -.input-group > .input-group-append:not(:last-child) > .input-group-text, -.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group > .input-group-append > .btn, -.input-group > .input-group-append > .input-group-text, -.input-group > .input-group-prepend:not(:first-child) > .btn, -.input-group > .input-group-prepend:not(:first-child) > .input-group-text, -.input-group > .input-group-prepend:first-child > .btn:not(:first-child), -.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.custom-control { - position: relative; - display: block; - min-height: 1.5rem; - padding-left: 1.5rem; -} -.custom-control-inline { - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - margin-right: 1rem; -} -.custom-control-input { - position: absolute; - z-index: -1; - opacity: 0; -} -.custom-control-input:checked ~ .custom-control-label::before { - color: #fff; - border-color: #e05433; - background-color: #e05433; -} -.custom-control-input:focus ~ .custom-control-label::before { - -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); - box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); -} -.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { - border-color: #f1b1a2; -} -.custom-control-input:not(:disabled):active ~ .custom-control-label::before { - color: #fff; - background-color: #f8d6ce; - border-color: #f8d6ce; -} -.custom-control-input:disabled ~ .custom-control-label { - color: #6c757d; -} -.custom-control-input:disabled ~ .custom-control-label::before { - background-color: #e9ecef; -} -.custom-control-label { - position: relative; - margin-bottom: 0; - vertical-align: top; -} -.custom-control-label::before { - position: absolute; - top: 0.25rem; - left: -1.5rem; - display: block; - width: 1rem; - height: 1rem; - pointer-events: none; - content: ''; - background-color: #fff; - border: #adb5bd solid 1px; -} -.custom-control-label::after { - position: absolute; - top: 0.25rem; - left: -1.5rem; - display: block; - width: 1rem; - height: 1rem; - content: ''; - background: no-repeat 50% / 50% 50%; -} -.custom-checkbox .custom-control-label::before { - border-radius: 0; -} -.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' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); -} -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { - border-color: #e05433; - background-color: #e05433; -} -.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' 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(224, 84, 51, 0.5); -} -.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { - background-color: rgba(224, 84, 51, 0.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' 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(224, 84, 51, 0.5); -} -.custom-switch { - padding-left: 2.25rem; -} -.custom-switch .custom-control-label::before { - left: -2.25rem; - width: 1.75rem; - pointer-events: all; - border-radius: 0.5rem; -} -.custom-switch .custom-control-label::after { - top: calc(0.25rem + 2px); - left: calc(-2.25rem + 2px); - width: calc(1rem - 4px); - height: calc(1rem - 4px); - background-color: #adb5bd; - border-radius: 0.5rem; - -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - box-shadow 0.15s ease-in-out; - transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .custom-switch .custom-control-label::after { - -webkit-transition: none; - transition: none; - } -} -.custom-switch .custom-control-input:checked ~ .custom-control-label::after { - background-color: #fff; - -webkit-transform: translateX(0.75rem); - transform: translateX(0.75rem); -} -.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(224, 84, 51, 0.5); -} -.custom-select { - display: inline-block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 1.75rem 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - vertical-align: middle; - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") - no-repeat right 0.75rem center/8px 10px; - background-color: #fff; - border: 1px solid #ced4da; - border-radius: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} -.custom-select:focus { - border-color: #f1b1a2; - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); - box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); -} -.custom-select:focus::-ms-value { - color: #495057; - background-color: #fff; -} -.custom-select[multiple], -.custom-select[size]:not([size='1']) { - height: auto; - padding-right: 0.75rem; - background-image: none; -} -.custom-select:disabled { - color: #6c757d; - background-color: #e9ecef; -} -.custom-select::-ms-expand { - display: none; -} -.custom-select-sm { - height: calc(1.5em + 0.5rem + 2px); - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - font-size: 0.875rem; -} -.custom-select-lg { - height: calc(1.5em + 1rem + 2px); - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1.25rem; -} -.custom-file { - position: relative; - display: inline-block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - margin-bottom: 0; -} -.custom-file-input { - position: relative; - z-index: 2; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - margin: 0; - opacity: 0; -} -.custom-file-input:focus ~ .custom-file-label { - border-color: #f1b1a2; - -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); - box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); -} -.custom-file-input:disabled ~ .custom-file-label { - background-color: #e9ecef; -} -.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 { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 1; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 0.75rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - background-color: #fff; - border: 1px solid #ced4da; - border-radius: 0; -} -.custom-file-label::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - z-index: 3; - display: block; - height: calc(1.5em + 0.75rem); - padding: 0.375rem 0.75rem; - line-height: 1.5; - color: #495057; - content: 'Browse'; - background-color: #e9ecef; - border-left: inherit; - border-radius: 0 0 0 0; -} -.custom-range { - width: 100%; - height: calc(1rem + 0.4rem); - padding: 0; - background-color: transparent; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} -.custom-range:focus { - outline: none; -} -.custom-range:focus::-webkit-slider-thumb { - -webkit-box-shadow: 0 0 0 1px #f8f9fa, 0 0 0 0.2rem rgba(224, 84, 51, 0.25); - box-shadow: 0 0 0 1px #f8f9fa, 0 0 0 0.2rem rgba(224, 84, 51, 0.25); -} -.custom-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #f8f9fa, 0 0 0 0.2rem rgba(224, 84, 51, 0.25); -} -.custom-range:focus::-ms-thumb { - box-shadow: 0 0 0 1px #f8f9fa, 0 0 0 0.2rem rgba(224, 84, 51, 0.25); -} -.custom-range::-moz-focus-outer { - border: 0; -} -.custom-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -0.25rem; - background-color: #e05433; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, - -webkit-box-shadow 0.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: #f8d6ce; -} -.custom-range::-webkit-slider-runnable-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; -} -.custom-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - background-color: #e05433; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - -moz-appearance: none; - appearance: none; -} -@media (prefers-reduced-motion: reduce) { - .custom-range::-moz-range-thumb { - -webkit-transition: none; - transition: none; - } -} -.custom-range::-moz-range-thumb:active { - background-color: #f8d6ce; -} -.custom-range::-moz-range-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; -} -.custom-range::-ms-thumb { - width: 1rem; - height: 1rem; - margin-top: 0; - margin-right: 0.2rem; - margin-left: 0.2rem; - background-color: #e05433; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - appearance: none; -} -@media (prefers-reduced-motion: reduce) { - .custom-range::-ms-thumb { - -webkit-transition: none; - transition: none; - } -} -.custom-range::-ms-thumb:active { - background-color: #f8d6ce; -} -.custom-range::-ms-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: transparent; - border-color: transparent; - border-width: 0.5rem; -} -.custom-range::-ms-fill-lower { - background-color: #dee2e6; - border-radius: 1rem; -} -.custom-range::-ms-fill-upper { - margin-right: 15px; - background-color: #dee2e6; - border-radius: 1rem; -} -.custom-range:disabled::-webkit-slider-thumb { - background-color: #adb5bd; -} -.custom-range:disabled::-webkit-slider-runnable-track { - cursor: default; -} -.custom-range:disabled::-moz-range-thumb { - background-color: #adb5bd; -} -.custom-range:disabled::-moz-range-track { - cursor: default; -} -.custom-range:disabled::-ms-thumb { - background-color: #adb5bd; -} -.custom-control-label::before, -.custom-file-label, -.custom-select { - -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .custom-control-label::before, - .custom-file-label, - .custom-select { - -webkit-transition: none; - transition: none; - } -} -.nav { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav-link { - display: block; - padding: 0.5rem 1rem; -} -.nav-link:hover, -.nav-link:focus { - text-decoration: none; -} -.nav-link.disabled { - color: #6c757d; - pointer-events: none; - cursor: default; -} -.nav-tabs { - border-bottom: 1px solid #dee2e6; -} -.nav-tabs .nav-item { - margin-bottom: -1px; -} -.nav-tabs .nav-link { - border: 1px solid transparent; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.nav-tabs .nav-link:hover, -.nav-tabs .nav-link:focus { - border-color: #e9ecef #e9ecef #dee2e6; -} -.nav-tabs .nav-link.disabled { - color: #6c757d; - background-color: transparent; - border-color: transparent; -} -.nav-tabs .nav-link.active, -.nav-tabs .nav-item.show .nav-link { - color: #495057; - background-color: #f8f9fa; - border-color: #dee2e6 #dee2e6 #f8f9fa; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.nav-pills .nav-link { - border-radius: 0; -} -.nav-pills .nav-link.active, -.nav-pills .show > .nav-link { - color: #fff; - background-color: #e05433; -} -.nav-fill .nav-item { - -webkit-box-flex: 1; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - text-align: center; -} -.nav-justified .nav-item { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - text-align: center; -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.navbar { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - padding: 0.5rem 1rem; -} -.navbar > .container, -.navbar > .container-fluid { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; -} -.navbar-brand { - display: inline-block; - padding-top: 0.3125rem; - padding-bottom: 0.3125rem; - margin-right: 1rem; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -.navbar-nav { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} -.navbar-nav .dropdown-menu { - position: static; - float: none; -} -.navbar-text { - display: inline-block; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} -.navbar-collapse { - -ms-flex-preferred-size: 100%; - flex-basis: 100%; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} -.navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.25rem; - line-height: 1; - background-color: transparent; - border: 1px solid transparent; - border-radius: 0; -} -.navbar-toggler:hover, -.navbar-toggler:focus { - 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 { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 576px) { - .navbar-expand-sm { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - } - .navbar-expand-sm .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -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: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-sm > .container, - .navbar-expand-sm > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - } - .navbar-expand-sm .navbar-collapse { - display: -webkit-box !important; - 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 { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 768px) { - .navbar-expand-md { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - } - .navbar-expand-md .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -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: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-md > .container, - .navbar-expand-md > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - } - .navbar-expand-md .navbar-collapse { - display: -webkit-box !important; - 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 { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 992px) { - .navbar-expand-lg { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - } - .navbar-expand-lg .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -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: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-lg > .container, - .navbar-expand-lg > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - } - .navbar-expand-lg .navbar-collapse { - display: -webkit-box !important; - 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 { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 1200px) { - .navbar-expand-xl { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - } - .navbar-expand-xl .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -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: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-xl > .container, - .navbar-expand-xl > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - } - .navbar-expand-xl .navbar-collapse { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto; - } - .navbar-expand-xl .navbar-toggler { - display: none; - } -} -.navbar-expand { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; -} -.navbar-expand > .container, -.navbar-expand > .container-fluid { - padding-right: 0; - padding-left: 0; -} -.navbar-expand .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; -} -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} -.navbar-expand .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; -} -.navbar-expand > .container, -.navbar-expand > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; -} -.navbar-expand .navbar-collapse { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto; -} -.navbar-expand .navbar-toggler { - display: none; -} -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-brand:hover, -.navbar-light .navbar-brand:focus { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, 0.5); -} -.navbar-light .navbar-nav .nav-link:hover, -.navbar-light .navbar-nav .nav-link:focus { - color: rgba(0, 0, 0, 0.7); -} -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, 0.3); -} -.navbar-light .navbar-nav .show > .nav-link, -.navbar-light .navbar-nav .active > .nav-link, -.navbar-light .navbar-nav .nav-link.show, -.navbar-light .navbar-nav .nav-link.active { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, 0.5); - border-color: rgba(0, 0, 0, 0.1); -} -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0,0,0,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-light .navbar-text { - color: rgba(0, 0, 0, 0.5); -} -.navbar-light .navbar-text a { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-text a:hover, -.navbar-light .navbar-text a:focus { - color: rgba(0, 0, 0, 0.9); -} -.navbar-dark .navbar-brand { - color: #fff; -} -.navbar-dark .navbar-brand:hover, -.navbar-dark .navbar-brand:focus { - color: #fff; -} -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, 0.5); -} -.navbar-dark .navbar-nav .nav-link:hover, -.navbar-dark .navbar-nav .nav-link:focus { - color: rgba(255, 255, 255, 0.75); -} -.navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, 0.25); -} -.navbar-dark .navbar-nav .show > .nav-link, -.navbar-dark .navbar-nav .active > .nav-link, -.navbar-dark .navbar-nav .nav-link.show, -.navbar-dark .navbar-nav .nav-link.active { - color: #fff; -} -.navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, 0.5); - border-color: rgba(255, 255, 255, 0.1); -} -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255,255,255,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-dark .navbar-text { - color: rgba(255, 255, 255, 0.5); -} -.navbar-dark .navbar-text a { - color: #fff; -} -.navbar-dark .navbar-text a:hover, -.navbar-dark .navbar-text a:focus { - color: #fff; -} -.card { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - min-width: 0; - word-wrap: break-word; - background-color: #fff; - background-clip: border-box; - border: 1px solid rgba(0, 0, 0, 0.125); - border-radius: 0; -} -.card > hr { - margin-right: 0; - margin-left: 0; -} -.card > .list-group:first-child .list-group-item:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.card > .list-group:last-child .list-group-item:last-child { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.card-body { - -webkit-box-flex: 1; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - padding: 1.25rem; -} -.card-title { - margin-bottom: 0.75rem; -} -.card-subtitle { - margin-top: -0.375rem; - margin-bottom: 0; -} -.card-text:last-child { - margin-bottom: 0; -} -.card-link:hover { - text-decoration: none; -} -.card-link + .card-link { - margin-left: 1.25rem; -} -.card-header { - padding: 0.75rem 1.25rem; - margin-bottom: 0; - background-color: rgba(0, 0, 0, 0.03); - border-bottom: 1px solid rgba(0, 0, 0, 0.125); -} -.card-header:first-child { - border-radius: calc(0 - 1px) calc(0 - 1px) 0 0; -} -.card-header + .list-group .list-group-item:first-child { - border-top: 0; -} -.card-footer { - padding: 0.75rem 1.25rem; - background-color: rgba(0, 0, 0, 0.03); - border-top: 1px solid rgba(0, 0, 0, 0.125); -} -.card-footer:last-child { - border-radius: 0 0 calc(0 - 1px) calc(0 - 1px); -} -.card-header-tabs { - margin-right: -0.625rem; - margin-bottom: -0.75rem; - margin-left: -0.625rem; - border-bottom: 0; -} -.card-header-pills { - margin-right: -0.625rem; - margin-left: -0.625rem; -} -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem; -} -.card-img { - width: 100%; - border-radius: calc(0 - 1px); -} -.card-img-top { - width: 100%; - border-top-left-radius: calc(0 - 1px); - border-top-right-radius: calc(0 - 1px); -} -.card-img-bottom { - width: 100%; - border-bottom-right-radius: calc(0 - 1px); - border-bottom-left-radius: calc(0 - 1px); -} -.card-deck { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} -.card-deck .card { - margin-bottom: 15px; -} -@media (min-width: 576px) { - .card-deck { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - margin-right: -15px; - margin-left: -15px; - } - .card-deck .card { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex: 1 0 0%; - flex: 1 0 0%; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - margin-right: 15px; - margin-bottom: 0; - margin-left: 15px; - } -} -.card-group { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} -.card-group > .card { - margin-bottom: 15px; -} -@media (min-width: 576px) { - .card-group { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - } - .card-group > .card { - -webkit-box-flex: 1; - -ms-flex: 1 0 0%; - flex: 1 0 0%; - margin-bottom: 0; - } - .card-group > .card + .card { - margin-left: 0; - border-left: 0; - } - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - .card-group > .card:not(:last-child) .card-img-top, - .card-group > .card:not(:last-child) .card-header { - border-top-right-radius: 0; - } - .card-group > .card:not(:last-child) .card-img-bottom, - .card-group > .card:not(:last-child) .card-footer { - 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-img-top, - .card-group > .card:not(:first-child) .card-header { - border-top-left-radius: 0; - } - .card-group > .card:not(:first-child) .card-img-bottom, - .card-group > .card:not(:first-child) .card-footer { - border-bottom-left-radius: 0; - } -} -.card-columns .card { - margin-bottom: 0.75rem; -} -@media (min-width: 576px) { - .card-columns { - -webkit-column-count: 3; - column-count: 3; - -webkit-column-gap: 1.25rem; - column-gap: 1.25rem; - orphans: 1; - widows: 1; - } - .card-columns .card { - display: inline-block; - width: 100%; - } -} -.accordion > .card { - overflow: hidden; -} -.accordion > .card:not(:first-of-type) .card-header:first-child { - border-radius: 0; -} -.accordion > .card:not(:first-of-type):not(:last-of-type) { - border-bottom: 0; - border-radius: 0; -} -.accordion > .card:first-of-type { - border-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.accordion > .card:last-of-type { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.accordion > .card .card-header { - margin-bottom: -1px; -} -.breadcrumb { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - padding: 0.75rem 1rem; - margin-bottom: 1rem; - list-style: none; - background-color: #e9ecef; - border-radius: 0; -} -.breadcrumb-item + .breadcrumb-item { - padding-left: 0.5rem; -} -.breadcrumb-item + .breadcrumb-item::before { - display: inline-block; - padding-right: 0.5rem; - color: #6c757d; - content: '/'; -} -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: underline; -} -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: none; -} -.breadcrumb-item.active { - color: #6c757d; -} -.pagination { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - padding-left: 0; - list-style: none; - border-radius: 0; -} -.page-link { - position: relative; - display: block; - padding: 0.5rem 0.75rem; - margin-left: -1px; - line-height: 1.25; - color: #e05433; - background-color: #fff; - border: 1px solid #dee2e6; -} -.page-link:hover { - z-index: 2; - color: #ac361a; - text-decoration: none; - background-color: #e9ecef; - border-color: #dee2e6; -} -.page-link:focus { - z-index: 2; - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); - box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25); -} -.page-item:first-child .page-link { - margin-left: 0; - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.page-item:last-child .page-link { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.page-item.active .page-link { - z-index: 1; - color: #fff; - background-color: #e05433; - border-color: #e05433; -} -.page-item.disabled .page-link { - color: #6c757d; - pointer-events: none; - cursor: auto; - background-color: #fff; - border-color: #dee2e6; -} -.pagination-lg .page-link { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; - line-height: 1.5; -} -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.pagination-sm .page-link { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; -} -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.badge { - display: inline-block; - padding: 0.25em 0.4em; - font-size: 75%; - font-weight: 700; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: 0; - -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - -webkit-box-shadow 0.15s ease-in-out; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - box-shadow 0.15s ease-in-out; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, - box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .badge { - -webkit-transition: none; - transition: none; - } -} -a.badge:hover, -a.badge:focus { - text-decoration: none; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.badge-pill { - padding-right: 0.6em; - padding-left: 0.6em; - border-radius: 10rem; -} -.badge-primary { - color: #fff; - background-color: #e05433; -} -a.badge-primary:hover, -a.badge-primary:focus { - color: #fff; - background-color: #c23d1e; -} -a.badge-primary:focus, -a.badge-primary.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5); - box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5); -} -.badge-secondary { - color: #fff; - background-color: #6c757d; -} -a.badge-secondary:hover, -a.badge-secondary:focus { - color: #fff; - background-color: #545b62; -} -a.badge-secondary:focus, -a.badge-secondary.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} -.badge-success { - color: #fff; - background-color: #28a745; -} -a.badge-success:hover, -a.badge-success:focus { - color: #fff; - background-color: #1e7e34; -} -a.badge-success:focus, -a.badge-success.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} -.badge-info { - color: #fff; - background-color: #17a2b8; -} -a.badge-info:hover, -a.badge-info:focus { - color: #fff; - background-color: #117a8b; -} -a.badge-info:focus, -a.badge-info.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} -.badge-warning { - color: #212529; - background-color: #ffc107; -} -a.badge-warning:hover, -a.badge-warning:focus { - color: #212529; - background-color: #d39e00; -} -a.badge-warning:focus, -a.badge-warning.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} -.badge-danger { - color: #fff; - background-color: #dc3545; -} -a.badge-danger:hover, -a.badge-danger:focus { - color: #fff; - background-color: #bd2130; -} -a.badge-danger:focus, -a.badge-danger.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} -.badge-light { - color: #212529; - background-color: #f8f9fa; -} -a.badge-light:hover, -a.badge-light:focus { - color: #212529; - background-color: #dae0e5; -} -a.badge-light:focus, -a.badge-light.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} -.badge-dark { - color: #fff; - background-color: #343a40; -} -a.badge-dark:hover, -a.badge-dark:focus { - color: #fff; - background-color: #1d2124; -} -a.badge-dark:focus, -a.badge-dark.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} -.jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #e9ecef; - border-radius: 0; -} -@media (min-width: 576px) { - .jumbotron { - padding: 4rem 2rem; - } -} -.jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0; -} -.alert { - position: relative; - padding: 0.75rem 1.25rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0; -} -.alert-heading { - color: inherit; -} -.alert-link { - font-weight: 700; -} -.alert-dismissible { - padding-right: 4rem; -} -.alert-dismissible .close { - position: absolute; - top: 0; - right: 0; - padding: 0.75rem 1.25rem; - color: inherit; -} -.alert-primary { - color: #742c1b; - background-color: #f9ddd6; - border-color: #f6cfc6; -} -.alert-primary hr { - border-top-color: #f3bcb0; -} -.alert-primary .alert-link { - color: #4b1c11; -} -.alert-secondary { - color: #383d41; - background-color: #e2e3e5; - border-color: #d6d8db; -} -.alert-secondary hr { - border-top-color: #c8cbcf; -} -.alert-secondary .alert-link { - color: #202326; -} -.alert-success { - color: #155724; - background-color: #d4edda; - border-color: #c3e6cb; -} -.alert-success hr { - border-top-color: #b1dfbb; -} -.alert-success .alert-link { - color: #0b2e13; -} -.alert-info { - color: #0c5460; - background-color: #d1ecf1; - border-color: #bee5eb; -} -.alert-info hr { - border-top-color: #abdde5; -} -.alert-info .alert-link { - color: #062c33; -} -.alert-warning { - color: #856404; - background-color: #fff3cd; - border-color: #ffeeba; -} -.alert-warning hr { - border-top-color: #ffe8a1; -} -.alert-warning .alert-link { - color: #533f03; -} -.alert-danger { - color: #721c24; - background-color: #f8d7da; - border-color: #f5c6cb; -} -.alert-danger hr { - border-top-color: #f1b0b7; -} -.alert-danger .alert-link { - color: #491217; -} -.alert-light { - color: #818182; - background-color: #fefefe; - border-color: #fdfdfe; -} -.alert-light hr { - border-top-color: #ececf6; -} -.alert-light .alert-link { - color: #686868; -} -.alert-dark { - color: #1b1e21; - background-color: #d6d8d9; - border-color: #c6c8ca; -} -.alert-dark hr { - border-top-color: #b9bbbe; -} -.alert-dark .alert-link { - color: #040505; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} -.progress { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - height: 1rem; - overflow: hidden; - font-size: 0.75rem; - background-color: #e9ecef; - border-radius: 0; -} -.progress-bar { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - color: #fff; - text-align: center; - white-space: nowrap; - background-color: #e05433; - -webkit-transition: width 0.6s ease; - transition: width 0.6s ease; -} -@media (prefers-reduced-motion: reduce) { - .progress-bar { - -webkit-transition: none; - transition: none; - } -} -.progress-bar-striped { - background-image: linear-gradient( - 45deg, - rgba(255, 255, 255, 0.15) 25%, - transparent 25%, - transparent 50%, - rgba(255, 255, 255, 0.15) 50%, - rgba(255, 255, 255, 0.15) 75%, - transparent 75%, - transparent - ); - background-size: 1rem 1rem; -} -.progress-bar-animated { - -webkit-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite; -} -@media (prefers-reduced-motion: reduce) { - .progress-bar-animated { - -webkit-animation: none; - animation: none; - } -} -.media { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; -} -.media-body { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; -} -.list-group { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; -} -.list-group-item-action { - width: 100%; - color: #495057; - text-align: inherit; -} -.list-group-item-action:hover, -.list-group-item-action:focus { - z-index: 1; - color: #495057; - text-decoration: none; - background-color: #f8f9fa; -} -.list-group-item-action:active { - color: #212529; - background-color: #e9ecef; -} -.list-group-item { - position: relative; - display: block; - padding: 0.75rem 1.25rem; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); -} -.list-group-item:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.list-group-item.disabled, -.list-group-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: #fff; -} -.list-group-item.active { - z-index: 2; - color: #fff; - background-color: #e05433; - border-color: #e05433; -} -.list-group-horizontal { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; -} -.list-group-horizontal .list-group-item { - margin-right: -1px; - margin-bottom: 0; -} -.list-group-horizontal .list-group-item:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-top-right-radius: 0; -} -.list-group-horizontal .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -@media (min-width: 576px) { - .list-group-horizontal-sm { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; - } - .list-group-horizontal-sm .list-group-item { - margin-right: -1px; - margin-bottom: 0; - } - .list-group-horizontal-sm .list-group-item:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-top-right-radius: 0; - } - .list-group-horizontal-sm .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; - } -} -@media (min-width: 768px) { - .list-group-horizontal-md { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; - } - .list-group-horizontal-md .list-group-item { - margin-right: -1px; - margin-bottom: 0; - } - .list-group-horizontal-md .list-group-item:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-top-right-radius: 0; - } - .list-group-horizontal-md .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; - } -} -@media (min-width: 992px) { - .list-group-horizontal-lg { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; - } - .list-group-horizontal-lg .list-group-item { - margin-right: -1px; - margin-bottom: 0; - } - .list-group-horizontal-lg .list-group-item:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-top-right-radius: 0; - } - .list-group-horizontal-lg .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; - } -} -@media (min-width: 1200px) { - .list-group-horizontal-xl { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; - } - .list-group-horizontal-xl .list-group-item { - margin-right: -1px; - margin-bottom: 0; - } - .list-group-horizontal-xl .list-group-item:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-top-right-radius: 0; - } - .list-group-horizontal-xl .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; - } -} -.list-group-flush .list-group-item { - border-right: 0; - border-left: 0; - border-radius: 0; -} -.list-group-flush .list-group-item:last-child { - margin-bottom: -1px; -} -.list-group-flush:first-child .list-group-item:first-child { - border-top: 0; -} -.list-group-flush:last-child .list-group-item:last-child { - margin-bottom: 0; - border-bottom: 0; -} -.list-group-item-primary { - color: #742c1b; - background-color: #f6cfc6; -} -.list-group-item-primary.list-group-item-action:hover, -.list-group-item-primary.list-group-item-action:focus { - color: #742c1b; - background-color: #f3bcb0; -} -.list-group-item-primary.list-group-item-action.active { - color: #fff; - background-color: #742c1b; - border-color: #742c1b; -} -.list-group-item-secondary { - color: #383d41; - background-color: #d6d8db; -} -.list-group-item-secondary.list-group-item-action:hover, -.list-group-item-secondary.list-group-item-action:focus { - color: #383d41; - background-color: #c8cbcf; -} -.list-group-item-secondary.list-group-item-action.active { - color: #fff; - background-color: #383d41; - border-color: #383d41; -} -.list-group-item-success { - color: #155724; - background-color: #c3e6cb; -} -.list-group-item-success.list-group-item-action:hover, -.list-group-item-success.list-group-item-action:focus { - color: #155724; - background-color: #b1dfbb; -} -.list-group-item-success.list-group-item-action.active { - color: #fff; - background-color: #155724; - border-color: #155724; -} -.list-group-item-info { - color: #0c5460; - background-color: #bee5eb; -} -.list-group-item-info.list-group-item-action:hover, -.list-group-item-info.list-group-item-action:focus { - color: #0c5460; - background-color: #abdde5; -} -.list-group-item-info.list-group-item-action.active { - color: #fff; - background-color: #0c5460; - border-color: #0c5460; -} -.list-group-item-warning { - color: #856404; - background-color: #ffeeba; -} -.list-group-item-warning.list-group-item-action:hover, -.list-group-item-warning.list-group-item-action:focus { - color: #856404; - background-color: #ffe8a1; -} -.list-group-item-warning.list-group-item-action.active { - color: #fff; - background-color: #856404; - border-color: #856404; -} -.list-group-item-danger { - color: #721c24; - background-color: #f5c6cb; -} -.list-group-item-danger.list-group-item-action:hover, -.list-group-item-danger.list-group-item-action:focus { - color: #721c24; - background-color: #f1b0b7; -} -.list-group-item-danger.list-group-item-action.active { - color: #fff; - background-color: #721c24; - border-color: #721c24; -} -.list-group-item-light { - color: #818182; - background-color: #fdfdfe; -} -.list-group-item-light.list-group-item-action:hover, -.list-group-item-light.list-group-item-action:focus { - color: #818182; - background-color: #ececf6; -} -.list-group-item-light.list-group-item-action.active { - color: #fff; - background-color: #818182; - border-color: #818182; -} -.list-group-item-dark { - color: #1b1e21; - background-color: #c6c8ca; -} -.list-group-item-dark.list-group-item-action:hover, -.list-group-item-dark.list-group-item-action:focus { - color: #1b1e21; - background-color: #b9bbbe; -} -.list-group-item-dark.list-group-item-action.active { - color: #fff; - background-color: #1b1e21; - border-color: #1b1e21; -} -.close { - float: right; - font-size: 1.5rem; - font-weight: 700; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: 0.5; -} -.close:hover { - color: #000; - text-decoration: none; -} -.close:not(:disabled):not(.disabled):hover, -.close:not(:disabled):not(.disabled):focus { - opacity: 0.75; -} -button.close { - padding: 0; - background-color: transparent; - border: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} -a.close.disabled { - pointer-events: none; -} -.toast { - max-width: 350px; - overflow: hidden; - font-size: 0.875rem; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.1); - -webkit-box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); - box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); - opacity: 0; - border-radius: 0.25rem; -} -.toast:not(:last-child) { - margin-bottom: 0.75rem; -} -.toast.showing { - opacity: 1; -} -.toast.show { - display: block; - opacity: 1; -} -.toast.hide { - display: none; -} -.toast-header { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - padding: 0.25rem 0.75rem; - color: #6c757d; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); -} -.toast-body { - padding: 0.75rem; -} -.modal-open { - overflow: hidden; -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal { - position: fixed; - top: 0; - left: 0; - z-index: 1050; - display: none; - width: 100%; - height: 100%; - overflow: hidden; - outline: 0; -} -.modal-dialog { - position: relative; - width: auto; - margin: 0.5rem; - pointer-events: none; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform 0.3s ease-out; - transition: -webkit-transform 0.3s ease-out; - transition: transform 0.3s ease-out; - transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; - -webkit-transform: translate(0, -50px); - transform: translate(0, -50px); -} -@media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - -webkit-transition: none; - transition: none; - } -} -.modal.show .modal-dialog { - -webkit-transform: none; - transform: none; -} -.modal-dialog-scrollable { - display: -webkit-box; - display: -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-header, -.modal-dialog-scrollable .modal-footer { - -ms-flex-negative: 0; - flex-shrink: 0; -} -.modal-dialog-scrollable .modal-body { - overflow-y: auto; -} -.modal-dialog-centered { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - min-height: calc(100% - 1rem); -} -.modal-dialog-centered::before { - display: block; - height: calc(100vh - 1rem); - content: ''; -} -.modal-dialog-centered.modal-dialog-scrollable { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-pack: center; - -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: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - width: 100%; - pointer-events: auto; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0; - outline: 0; -} -.modal-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop.show { - opacity: 0.5; -} -.modal-header { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - padding: 1rem 1rem; - border-bottom: 1px solid #dee2e6; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.modal-header .close { - padding: 1rem 1rem; - margin: -1rem -1rem -1rem auto; -} -.modal-title { - margin-bottom: 0; - line-height: 1.5; -} -.modal-body { - position: relative; - -webkit-box-flex: 1; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - padding: 1rem; -} -.modal-footer { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - padding: 1rem; - border-top: 1px solid #dee2e6; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.modal-footer > :not(:first-child) { - margin-left: 0.25rem; -} -.modal-footer > :not(:last-child) { - margin-right: 0.25rem; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 576px) { - .modal-dialog { - max-width: 500px; - margin: 1.75rem auto; - } - .modal-dialog-scrollable { - max-height: calc(100% - 3.5rem); - } - .modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 3.5rem); - } - .modal-dialog-centered { - min-height: calc(100% - 3.5rem); - } - .modal-dialog-centered::before { - height: calc(100vh - 3.5rem); - } - .modal-sm { - max-width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg, - .modal-xl { - max-width: 800px; - } -} -@media (min-width: 1200px) { - .modal-xl { - max-width: 1140px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - font-style: normal; - font-weight: 400; - line-height: 1.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: 0.875rem; - word-wrap: break-word; - opacity: 0; -} -.tooltip.show { - opacity: 0.9; -} -.tooltip .arrow { - position: absolute; - display: block; - width: 0.8rem; - height: 0.4rem; -} -.tooltip .arrow::before { - position: absolute; - content: ''; - border-color: transparent; - border-style: solid; -} -.bs-tooltip-top, -.bs-tooltip-auto[x-placement^='top'] { - padding: 0.4rem 0; -} -.bs-tooltip-top .arrow, -.bs-tooltip-auto[x-placement^='top'] .arrow { - bottom: 0; -} -.bs-tooltip-top .arrow::before, -.bs-tooltip-auto[x-placement^='top'] .arrow::before { - top: 0; - border-width: 0.4rem 0.4rem 0; - border-top-color: #000; -} -.bs-tooltip-right, -.bs-tooltip-auto[x-placement^='right'] { - padding: 0 0.4rem; -} -.bs-tooltip-right .arrow, -.bs-tooltip-auto[x-placement^='right'] .arrow { - left: 0; - width: 0.4rem; - height: 0.8rem; -} -.bs-tooltip-right .arrow::before, -.bs-tooltip-auto[x-placement^='right'] .arrow::before { - right: 0; - border-width: 0.4rem 0.4rem 0.4rem 0; - border-right-color: #000; -} -.bs-tooltip-bottom, -.bs-tooltip-auto[x-placement^='bottom'] { - padding: 0.4rem 0; -} -.bs-tooltip-bottom .arrow, -.bs-tooltip-auto[x-placement^='bottom'] .arrow { - top: 0; -} -.bs-tooltip-bottom .arrow::before, -.bs-tooltip-auto[x-placement^='bottom'] .arrow::before { - bottom: 0; - border-width: 0 0.4rem 0.4rem; - border-bottom-color: #000; -} -.bs-tooltip-left, -.bs-tooltip-auto[x-placement^='left'] { - padding: 0 0.4rem; -} -.bs-tooltip-left .arrow, -.bs-tooltip-auto[x-placement^='left'] .arrow { - right: 0; - width: 0.4rem; - height: 0.8rem; -} -.bs-tooltip-left .arrow::before, -.bs-tooltip-auto[x-placement^='left'] .arrow::before { - left: 0; - border-width: 0.4rem 0 0.4rem 0.4rem; - border-left-color: #000; -} -.tooltip-inner { - max-width: 200px; - padding: 0.25rem 0.5rem; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 0; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - font-style: normal; - font-weight: 400; - line-height: 1.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: 0.875rem; - word-wrap: break-word; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0; -} -.popover .arrow { - position: absolute; - display: block; - width: 1rem; - height: 0.5rem; - margin: 0 0; -} -.popover .arrow::before, -.popover .arrow::after { - position: absolute; - display: block; - content: ''; - border-color: transparent; - border-style: solid; -} -.bs-popover-top, -.bs-popover-auto[x-placement^='top'] { - margin-bottom: 0.5rem; -} -.bs-popover-top > .arrow, -.bs-popover-auto[x-placement^='top'] > .arrow { - bottom: calc((0.5rem + 1px) * -1); -} -.bs-popover-top > .arrow::before, -.bs-popover-auto[x-placement^='top'] > .arrow::before { - bottom: 0; - border-width: 0.5rem 0.5rem 0; - border-top-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-top > .arrow::after, -.bs-popover-auto[x-placement^='top'] > .arrow::after { - bottom: 1px; - border-width: 0.5rem 0.5rem 0; - border-top-color: #fff; -} -.bs-popover-right, -.bs-popover-auto[x-placement^='right'] { - margin-left: 0.5rem; -} -.bs-popover-right > .arrow, -.bs-popover-auto[x-placement^='right'] > .arrow { - left: calc((0.5rem + 1px) * -1); - width: 0.5rem; - height: 1rem; - margin: 0 0; -} -.bs-popover-right > .arrow::before, -.bs-popover-auto[x-placement^='right'] > .arrow::before { - left: 0; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-right > .arrow::after, -.bs-popover-auto[x-placement^='right'] > .arrow::after { - left: 1px; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: #fff; -} -.bs-popover-bottom, -.bs-popover-auto[x-placement^='bottom'] { - margin-top: 0.5rem; -} -.bs-popover-bottom > .arrow, -.bs-popover-auto[x-placement^='bottom'] > .arrow { - top: calc((0.5rem + 1px) * -1); -} -.bs-popover-bottom > .arrow::before, -.bs-popover-auto[x-placement^='bottom'] > .arrow::before { - top: 0; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-bottom > .arrow::after, -.bs-popover-auto[x-placement^='bottom'] > .arrow::after { - top: 1px; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: #fff; -} -.bs-popover-bottom .popover-header::before, -.bs-popover-auto[x-placement^='bottom'] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 1rem; - margin-left: -0.5rem; - content: ''; - border-bottom: 1px solid #f7f7f7; -} -.bs-popover-left, -.bs-popover-auto[x-placement^='left'] { - margin-right: 0.5rem; -} -.bs-popover-left > .arrow, -.bs-popover-auto[x-placement^='left'] > .arrow { - right: calc((0.5rem + 1px) * -1); - width: 0.5rem; - height: 1rem; - margin: 0 0; -} -.bs-popover-left > .arrow::before, -.bs-popover-auto[x-placement^='left'] > .arrow::before { - right: 0; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-left > .arrow::after, -.bs-popover-auto[x-placement^='left'] > .arrow::after { - right: 1px; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: #fff; -} -.popover-header { - padding: 0.5rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-top-left-radius: calc(0 - 1px); - border-top-right-radius: calc(0 - 1px); -} -.popover-header:empty { - display: none; -} -.popover-body { - padding: 0.5rem 0.75rem; - color: #212529; -} -.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; - -webkit-transition: -webkit-transform 0.6s ease-in-out; - transition: -webkit-transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .carousel-item { - -webkit-transition: none; - transition: none; - } -} -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} -.carousel-item-next:not(.carousel-item-left), -.active.carousel-item-right { - -webkit-transform: translateX(100%); - transform: translateX(100%); -} -.carousel-item-prev:not(.carousel-item-right), -.active.carousel-item-left { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); -} -.carousel-fade .carousel-item { - opacity: 0; - -webkit-transition-property: opacity; - transition-property: opacity; - -webkit-transform: none; - transform: none; -} -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-left, -.carousel-fade .carousel-item-prev.carousel-item-right { - z-index: 1; - opacity: 1; -} -.carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-right { - z-index: 0; - opacity: 0; - -webkit-transition: 0s 0.6s opacity; - transition: 0s 0.6s opacity; -} -@media (prefers-reduced-motion: reduce) { - .carousel-fade .active.carousel-item-left, - .carousel-fade .active.carousel-item-right { - -webkit-transition: none; - transition: none; - } -} -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - width: 15%; - color: #fff; - text-align: center; - opacity: 0.5; - -webkit-transition: opacity 0.15s ease; - transition: opacity 0.15s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-control-prev, - .carousel-control-next { - -webkit-transition: none; - transition: none; - } -} -.carousel-control-prev:hover, -.carousel-control-prev:focus, -.carousel-control-next:hover, -.carousel-control-next:focus { - color: #fff; - text-decoration: none; - outline: 0; - opacity: 0.9; -} -.carousel-control-prev { - left: 0; -} -.carousel-control-next { - right: 0; -} -.carousel-control-prev-icon, -.carousel-control-next-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' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%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' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); -} -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 15; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - padding-left: 0; - margin-right: 15%; - margin-left: 15%; - list-style: none; -} -.carousel-indicators li { - -webkit-box-sizing: content-box; - box-sizing: content-box; - -webkit-box-flex: 0; - -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: 0.5; - -webkit-transition: opacity 0.6s ease; - transition: opacity 0.6s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-indicators li { - -webkit-transition: none; - transition: none; - } -} -.carousel-indicators .active { - opacity: 1; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; -} -@-webkit-keyframes spinner-border { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes spinner-border { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -.spinner-border { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - border: 0.25em solid currentColor; - border-right-color: transparent; - border-radius: 50%; - -webkit-animation: spinner-border 0.75s linear infinite; - animation: spinner-border 0.75s linear infinite; -} -.spinner-border-sm { - width: 1rem; - height: 1rem; - border-width: 0.2em; -} -@-webkit-keyframes spinner-grow { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - 50% { - opacity: 1; - } -} -@keyframes spinner-grow { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - 50% { - opacity: 1; - } -} -.spinner-grow { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - background-color: currentColor; - border-radius: 50%; - opacity: 0; - -webkit-animation: spinner-grow 0.75s linear infinite; - animation: spinner-grow 0.75s linear infinite; -} -.spinner-grow-sm { - width: 1rem; - height: 1rem; -} -.align-baseline { - vertical-align: baseline !important; -} -.align-top { - vertical-align: top !important; -} -.align-middle { - vertical-align: middle !important; -} -.align-bottom { - vertical-align: bottom !important; -} -.align-text-bottom { - vertical-align: text-bottom !important; -} -.align-text-top { - vertical-align: text-top !important; -} -.bg-primary { - background-color: #e05433 !important; -} -a.bg-primary:hover, -a.bg-primary:focus, -button.bg-primary:hover, -button.bg-primary:focus { - background-color: #c23d1e !important; -} -.bg-secondary { - background-color: #6c757d !important; -} -a.bg-secondary:hover, -a.bg-secondary:focus, -button.bg-secondary:hover, -button.bg-secondary:focus { - background-color: #545b62 !important; -} -.bg-success { - background-color: #28a745 !important; -} -a.bg-success:hover, -a.bg-success:focus, -button.bg-success:hover, -button.bg-success:focus { - background-color: #1e7e34 !important; -} -.bg-info { - background-color: #17a2b8 !important; -} -a.bg-info:hover, -a.bg-info:focus, -button.bg-info:hover, -button.bg-info:focus { - background-color: #117a8b !important; -} -.bg-warning { - background-color: #ffc107 !important; -} -a.bg-warning:hover, -a.bg-warning:focus, -button.bg-warning:hover, -button.bg-warning:focus { - background-color: #d39e00 !important; -} -.bg-danger { - background-color: #dc3545 !important; -} -a.bg-danger:hover, -a.bg-danger:focus, -button.bg-danger:hover, -button.bg-danger:focus { - background-color: #bd2130 !important; -} -.bg-light { - background-color: #f8f9fa !important; -} -a.bg-light:hover, -a.bg-light:focus, -button.bg-light:hover, -button.bg-light:focus { - background-color: #dae0e5 !important; -} -.bg-dark { - background-color: #343a40 !important; -} -a.bg-dark:hover, -a.bg-dark:focus, -button.bg-dark:hover, -button.bg-dark:focus { - background-color: #1d2124 !important; -} -.bg-white { - background-color: #fff !important; -} -.bg-transparent { - background-color: transparent !important; -} -.border { - border: 1px solid #dee2e6 !important; -} -.border-top { - border-top: 1px solid #dee2e6 !important; -} -.border-right { - border-right: 1px solid #dee2e6 !important; -} -.border-bottom { - border-bottom: 1px solid #dee2e6 !important; -} -.border-left { - border-left: 1px solid #dee2e6 !important; -} -.border-0 { - border: 0 !important; -} -.border-top-0 { - border-top: 0 !important; -} -.border-right-0 { - border-right: 0 !important; -} -.border-bottom-0 { - border-bottom: 0 !important; -} -.border-left-0 { - border-left: 0 !important; -} -.border-primary { - border-color: #e05433 !important; -} -.border-secondary { - border-color: #6c757d !important; -} -.border-success { - border-color: #28a745 !important; -} -.border-info { - border-color: #17a2b8 !important; -} -.border-warning { - border-color: #ffc107 !important; -} -.border-danger { - border-color: #dc3545 !important; -} -.border-light { - border-color: #f8f9fa !important; -} -.border-dark { - border-color: #343a40 !important; -} -.border-white { - border-color: #fff !important; -} -.rounded-sm { - border-radius: 0 !important; -} -.rounded { - border-radius: 0 !important; -} -.rounded-top { - border-top-left-radius: 0 !important; - border-top-right-radius: 0 !important; -} -.rounded-right { - border-top-right-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} -.rounded-bottom { - border-bottom-right-radius: 0 !important; - border-bottom-left-radius: 0 !important; -} -.rounded-left { - border-top-left-radius: 0 !important; - border-bottom-left-radius: 0 !important; -} -.rounded-lg { - border-radius: 0 !important; -} -.rounded-circle { - border-radius: 50% !important; -} -.rounded-pill { - border-radius: 50rem !important; -} -.rounded-0 { - border-radius: 0 !important; -} -.clearfix::after { - display: block; - clear: both; - content: ''; -} -.d-none { - display: none !important; -} -.d-inline { - display: inline !important; -} -.d-inline-block { - display: inline-block !important; -} -.d-block { - display: block !important; -} -.d-table { - display: table !important; -} -.d-table-row { - display: table-row !important; -} -.d-table-cell { - display: table-cell !important; -} -.d-flex { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; -} -.d-inline-flex { - display: -webkit-inline-box !important; - 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: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } - .d-sm-inline-flex { - display: -webkit-inline-box !important; - 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: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } - .d-md-inline-flex { - display: -webkit-inline-box !important; - 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: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } - .d-lg-inline-flex { - display: -webkit-inline-box !important; - 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: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } - .d-xl-inline-flex { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} -@media print { - .d-print-none { - display: none !important; - } - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-table { - display: table !important; - } - .d-print-table-row { - display: table-row !important; - } - .d-print-table-cell { - display: table-cell !important; - } - .d-print-flex { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - } - .d-print-inline-flex { - display: -webkit-inline-box !important; - 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 iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.embed-responsive-21by9::before { - padding-top: 42.85714%; -} -.embed-responsive-16by9::before { - padding-top: 56.25%; -} -.embed-responsive-4by3::before { - padding-top: 75%; -} -.embed-responsive-1by1::before { - padding-top: 100%; -} -.flex-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: row !important; - flex-direction: row !important; -} -.flex-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: column !important; - flex-direction: column !important; -} -.flex-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; -} -.flex-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -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 { - -webkit-box-flex: 1 !important; - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; -} -.flex-grow-0 { - -webkit-box-flex: 0 !important; - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; -} -.flex-grow-1 { - -webkit-box-flex: 1 !important; - -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 { - -webkit-box-pack: start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important; -} -.justify-content-end { - -webkit-box-pack: end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important; -} -.justify-content-center { - -webkit-box-pack: center !important; - -ms-flex-pack: center !important; - justify-content: center !important; -} -.justify-content-between { - -webkit-box-pack: justify !important; - -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 { - -webkit-box-align: start !important; - -ms-flex-align: start !important; - align-items: flex-start !important; -} -.align-items-end { - -webkit-box-align: end !important; - -ms-flex-align: end !important; - align-items: flex-end !important; -} -.align-items-center { - -webkit-box-align: center !important; - -ms-flex-align: center !important; - align-items: center !important; -} -.align-items-baseline { - -webkit-box-align: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important; -} -.align-items-stretch { - -webkit-box-align: stretch !important; - -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; - -ms-grid-row-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; - -ms-grid-row-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; - -ms-grid-row-align: stretch !important; - align-self: stretch !important; -} -@media (min-width: 576px) { - .flex-sm-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-sm-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-sm-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -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 { - -webkit-box-flex: 1 !important; - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-sm-grow-0 { - -webkit-box-flex: 0 !important; - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-sm-grow-1 { - -webkit-box-flex: 1 !important; - -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 { - -webkit-box-pack: start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-sm-end { - -webkit-box-pack: end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-sm-center { - -webkit-box-pack: center !important; - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-sm-between { - -webkit-box-pack: justify !important; - -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 { - -webkit-box-align: start !important; - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-sm-end { - -webkit-box-align: end !important; - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-sm-center { - -webkit-box-align: center !important; - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-sm-baseline { - -webkit-box-align: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-sm-stretch { - -webkit-box-align: stretch !important; - -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; - -ms-grid-row-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; - -ms-grid-row-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; - -ms-grid-row-align: stretch !important; - align-self: stretch !important; - } -} -@media (min-width: 768px) { - .flex-md-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-md-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-md-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -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 { - -webkit-box-flex: 1 !important; - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-md-grow-0 { - -webkit-box-flex: 0 !important; - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-md-grow-1 { - -webkit-box-flex: 1 !important; - -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 { - -webkit-box-pack: start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-md-end { - -webkit-box-pack: end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-md-center { - -webkit-box-pack: center !important; - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-md-between { - -webkit-box-pack: justify !important; - -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 { - -webkit-box-align: start !important; - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-md-end { - -webkit-box-align: end !important; - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-md-center { - -webkit-box-align: center !important; - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-md-baseline { - -webkit-box-align: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-md-stretch { - -webkit-box-align: stretch !important; - -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; - -ms-grid-row-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; - -ms-grid-row-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; - -ms-grid-row-align: stretch !important; - align-self: stretch !important; - } -} -@media (min-width: 992px) { - .flex-lg-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-lg-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-lg-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -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 { - -webkit-box-flex: 1 !important; - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-lg-grow-0 { - -webkit-box-flex: 0 !important; - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-lg-grow-1 { - -webkit-box-flex: 1 !important; - -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 { - -webkit-box-pack: start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-lg-end { - -webkit-box-pack: end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-lg-center { - -webkit-box-pack: center !important; - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-lg-between { - -webkit-box-pack: justify !important; - -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 { - -webkit-box-align: start !important; - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-lg-end { - -webkit-box-align: end !important; - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-lg-center { - -webkit-box-align: center !important; - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-lg-baseline { - -webkit-box-align: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-lg-stretch { - -webkit-box-align: stretch !important; - -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; - -ms-grid-row-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; - -ms-grid-row-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; - -ms-grid-row-align: stretch !important; - align-self: stretch !important; - } -} -@media (min-width: 1200px) { - .flex-xl-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-xl-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-xl-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -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 { - -webkit-box-flex: 1 !important; - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-xl-grow-0 { - -webkit-box-flex: 0 !important; - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-xl-grow-1 { - -webkit-box-flex: 1 !important; - -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 { - -webkit-box-pack: start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-xl-end { - -webkit-box-pack: end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-xl-center { - -webkit-box-pack: center !important; - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-xl-between { - -webkit-box-pack: justify !important; - -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 { - -webkit-box-align: start !important; - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-xl-end { - -webkit-box-align: end !important; - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-xl-center { - -webkit-box-align: center !important; - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-xl-baseline { - -webkit-box-align: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-xl-stretch { - -webkit-box-align: stretch !important; - -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; - -ms-grid-row-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; - -ms-grid-row-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; - -ms-grid-row-align: stretch !important; - align-self: stretch !important; - } -} -.float-left { - float: left !important; -} -.float-right { - float: right !important; -} -.float-none { - float: none !important; -} -@media (min-width: 576px) { - .float-sm-left { - float: left !important; - } - .float-sm-right { - float: right !important; - } - .float-sm-none { - float: none !important; - } -} -@media (min-width: 768px) { - .float-md-left { - float: left !important; - } - .float-md-right { - float: right !important; - } - .float-md-none { - float: none !important; - } -} -@media (min-width: 992px) { - .float-lg-left { - float: left !important; - } - .float-lg-right { - float: right !important; - } - .float-lg-none { - float: none !important; - } -} -@media (min-width: 1200px) { - .float-xl-left { - float: left !important; - } - .float-xl-right { - float: right !important; - } - .float-xl-none { - float: none !important; - } -} -.overflow-auto { - overflow: auto !important; -} -.overflow-hidden { - overflow: hidden !important; -} -.position-static { - position: static !important; -} -.position-relative { - position: relative !important; -} -.position-absolute { - position: absolute !important; -} -.position-fixed { - position: fixed !important; -} -.position-sticky { - position: -webkit-sticky !important; - position: sticky !important; -} -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} -@supports ((position: -webkit-sticky) or (position: sticky)) { - .sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; - } -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - overflow: visible; - clip: auto; - white-space: normal; -} -.shadow-sm { - -webkit-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; - box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; -} -.shadow { - -webkit-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; -} -.shadow-lg { - -webkit-box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; - box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; -} -.shadow-none { - -webkit-box-shadow: none !important; - box-shadow: none !important; -} -.w-25 { - width: 25% !important; -} -.w-50 { - width: 50% !important; -} -.w-75 { - width: 75% !important; -} -.w-100 { - width: 100% !important; -} -.w-auto { - width: auto !important; -} -.h-25 { - height: 25% !important; -} -.h-50 { - height: 50% !important; -} -.h-75 { - height: 75% !important; -} -.h-100 { - height: 100% !important; -} -.h-auto { - height: auto !important; -} -.mw-100 { - max-width: 100% !important; -} -.mh-100 { - max-height: 100% !important; -} -.min-vw-100 { - min-width: 100vw !important; -} -.min-vh-100 { - min-height: 100vh !important; -} -.vw-100 { - width: 100vw !important; -} -.vh-100 { - height: 100vh !important; -} -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - pointer-events: auto; - content: ''; - background-color: rgba(0, 0, 0, 0); -} -.m-0 { - margin: 0 !important; -} -.mt-0, -.my-0 { - margin-top: 0 !important; -} -.mr-0, -.mx-0 { - margin-right: 0 !important; -} -.mb-0, -.my-0 { - margin-bottom: 0 !important; -} -.ml-0, -.mx-0 { - margin-left: 0 !important; -} -.m-1 { - margin: 0.25rem !important; -} -.mt-1, -.my-1 { - margin-top: 0.25rem !important; -} -.mr-1, -.mx-1 { - margin-right: 0.25rem !important; -} -.mb-1, -.my-1 { - margin-bottom: 0.25rem !important; -} -.ml-1, -.mx-1 { - margin-left: 0.25rem !important; -} -.m-2 { - margin: 0.5rem !important; -} -.mt-2, -.my-2 { - margin-top: 0.5rem !important; -} -.mr-2, -.mx-2 { - margin-right: 0.5rem !important; -} -.mb-2, -.my-2 { - margin-bottom: 0.5rem !important; -} -.ml-2, -.mx-2 { - margin-left: 0.5rem !important; -} -.m-3 { - margin: 1rem !important; -} -.mt-3, -.my-3 { - margin-top: 1rem !important; -} -.mr-3, -.mx-3 { - margin-right: 1rem !important; -} -.mb-3, -.my-3 { - margin-bottom: 1rem !important; -} -.ml-3, -.mx-3 { - margin-left: 1rem !important; -} -.m-4 { - margin: 1.5rem !important; -} -.mt-4, -.my-4 { - margin-top: 1.5rem !important; -} -.mr-4, -.mx-4 { - margin-right: 1.5rem !important; -} -.mb-4, -.my-4 { - margin-bottom: 1.5rem !important; -} -.ml-4, -.mx-4 { - margin-left: 1.5rem !important; -} -.m-5 { - margin: 3rem !important; -} -.mt-5, -.my-5 { - margin-top: 3rem !important; -} -.mr-5, -.mx-5 { - margin-right: 3rem !important; -} -.mb-5, -.my-5 { - margin-bottom: 3rem !important; -} -.ml-5, -.mx-5 { - margin-left: 3rem !important; -} -.p-0 { - padding: 0 !important; -} -.pt-0, -.py-0 { - padding-top: 0 !important; -} -.pr-0, -.px-0 { - padding-right: 0 !important; -} -.pb-0, -.py-0 { - padding-bottom: 0 !important; -} -.pl-0, -.px-0 { - padding-left: 0 !important; -} -.p-1 { - padding: 0.25rem !important; -} -.pt-1, -.py-1 { - padding-top: 0.25rem !important; -} -.pr-1, -.px-1 { - padding-right: 0.25rem !important; -} -.pb-1, -.py-1 { - padding-bottom: 0.25rem !important; -} -.pl-1, -.px-1 { - padding-left: 0.25rem !important; -} -.p-2 { - padding: 0.5rem !important; -} -.pt-2, -.py-2 { - padding-top: 0.5rem !important; -} -.pr-2, -.px-2 { - padding-right: 0.5rem !important; -} -.pb-2, -.py-2 { - padding-bottom: 0.5rem !important; -} -.pl-2, -.px-2 { - padding-left: 0.5rem !important; -} -.p-3 { - padding: 1rem !important; -} -.pt-3, -.py-3 { - padding-top: 1rem !important; -} -.pr-3, -.px-3 { - padding-right: 1rem !important; -} -.pb-3, -.py-3 { - padding-bottom: 1rem !important; -} -.pl-3, -.px-3 { - padding-left: 1rem !important; -} -.p-4 { - padding: 1.5rem !important; -} -.pt-4, -.py-4 { - padding-top: 1.5rem !important; -} -.pr-4, -.px-4 { - padding-right: 1.5rem !important; -} -.pb-4, -.py-4 { - padding-bottom: 1.5rem !important; -} -.pl-4, -.px-4 { - padding-left: 1.5rem !important; -} -.p-5 { - padding: 3rem !important; -} -.pt-5, -.py-5 { - padding-top: 3rem !important; -} -.pr-5, -.px-5 { - padding-right: 3rem !important; -} -.pb-5, -.py-5 { - padding-bottom: 3rem !important; -} -.pl-5, -.px-5 { - padding-left: 3rem !important; -} -.m-n1 { - margin: -0.25rem !important; -} -.mt-n1, -.my-n1 { - margin-top: -0.25rem !important; -} -.mr-n1, -.mx-n1 { - margin-right: -0.25rem !important; -} -.mb-n1, -.my-n1 { - margin-bottom: -0.25rem !important; -} -.ml-n1, -.mx-n1 { - margin-left: -0.25rem !important; -} -.m-n2 { - margin: -0.5rem !important; -} -.mt-n2, -.my-n2 { - margin-top: -0.5rem !important; -} -.mr-n2, -.mx-n2 { - margin-right: -0.5rem !important; -} -.mb-n2, -.my-n2 { - margin-bottom: -0.5rem !important; -} -.ml-n2, -.mx-n2 { - margin-left: -0.5rem !important; -} -.m-n3 { - margin: -1rem !important; -} -.mt-n3, -.my-n3 { - margin-top: -1rem !important; -} -.mr-n3, -.mx-n3 { - margin-right: -1rem !important; -} -.mb-n3, -.my-n3 { - margin-bottom: -1rem !important; -} -.ml-n3, -.mx-n3 { - margin-left: -1rem !important; -} -.m-n4 { - margin: -1.5rem !important; -} -.mt-n4, -.my-n4 { - margin-top: -1.5rem !important; -} -.mr-n4, -.mx-n4 { - margin-right: -1.5rem !important; -} -.mb-n4, -.my-n4 { - margin-bottom: -1.5rem !important; -} -.ml-n4, -.mx-n4 { - margin-left: -1.5rem !important; -} -.m-n5 { - margin: -3rem !important; -} -.mt-n5, -.my-n5 { - margin-top: -3rem !important; -} -.mr-n5, -.mx-n5 { - margin-right: -3rem !important; -} -.mb-n5, -.my-n5 { - margin-bottom: -3rem !important; -} -.ml-n5, -.mx-n5 { - margin-left: -3rem !important; -} -.m-auto { - margin: auto !important; -} -.mt-auto, -.my-auto { - margin-top: auto !important; -} -.mr-auto, -.mx-auto { - margin-right: auto !important; -} -.mb-auto, -.my-auto { - margin-bottom: auto !important; -} -.ml-auto, -.mx-auto { - margin-left: auto !important; -} -@media (min-width: 576px) { - .m-sm-0 { - margin: 0 !important; - } - .mt-sm-0, - .my-sm-0 { - margin-top: 0 !important; - } - .mr-sm-0, - .mx-sm-0 { - margin-right: 0 !important; - } - .mb-sm-0, - .my-sm-0 { - margin-bottom: 0 !important; - } - .ml-sm-0, - .mx-sm-0 { - margin-left: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .mt-sm-1, - .my-sm-1 { - margin-top: 0.25rem !important; - } - .mr-sm-1, - .mx-sm-1 { - margin-right: 0.25rem !important; - } - .mb-sm-1, - .my-sm-1 { - margin-bottom: 0.25rem !important; - } - .ml-sm-1, - .mx-sm-1 { - margin-left: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .mt-sm-2, - .my-sm-2 { - margin-top: 0.5rem !important; - } - .mr-sm-2, - .mx-sm-2 { - margin-right: 0.5rem !important; - } - .mb-sm-2, - .my-sm-2 { - margin-bottom: 0.5rem !important; - } - .ml-sm-2, - .mx-sm-2 { - margin-left: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .mt-sm-3, - .my-sm-3 { - margin-top: 1rem !important; - } - .mr-sm-3, - .mx-sm-3 { - margin-right: 1rem !important; - } - .mb-sm-3, - .my-sm-3 { - margin-bottom: 1rem !important; - } - .ml-sm-3, - .mx-sm-3 { - margin-left: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .mt-sm-4, - .my-sm-4 { - margin-top: 1.5rem !important; - } - .mr-sm-4, - .mx-sm-4 { - margin-right: 1.5rem !important; - } - .mb-sm-4, - .my-sm-4 { - margin-bottom: 1.5rem !important; - } - .ml-sm-4, - .mx-sm-4 { - margin-left: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .mt-sm-5, - .my-sm-5 { - margin-top: 3rem !important; - } - .mr-sm-5, - .mx-sm-5 { - margin-right: 3rem !important; - } - .mb-sm-5, - .my-sm-5 { - margin-bottom: 3rem !important; - } - .ml-sm-5, - .mx-sm-5 { - margin-left: 3rem !important; - } - .p-sm-0 { - padding: 0 !important; - } - .pt-sm-0, - .py-sm-0 { - padding-top: 0 !important; - } - .pr-sm-0, - .px-sm-0 { - padding-right: 0 !important; - } - .pb-sm-0, - .py-sm-0 { - padding-bottom: 0 !important; - } - .pl-sm-0, - .px-sm-0 { - padding-left: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .pt-sm-1, - .py-sm-1 { - padding-top: 0.25rem !important; - } - .pr-sm-1, - .px-sm-1 { - padding-right: 0.25rem !important; - } - .pb-sm-1, - .py-sm-1 { - padding-bottom: 0.25rem !important; - } - .pl-sm-1, - .px-sm-1 { - padding-left: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .pt-sm-2, - .py-sm-2 { - padding-top: 0.5rem !important; - } - .pr-sm-2, - .px-sm-2 { - padding-right: 0.5rem !important; - } - .pb-sm-2, - .py-sm-2 { - padding-bottom: 0.5rem !important; - } - .pl-sm-2, - .px-sm-2 { - padding-left: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .pt-sm-3, - .py-sm-3 { - padding-top: 1rem !important; - } - .pr-sm-3, - .px-sm-3 { - padding-right: 1rem !important; - } - .pb-sm-3, - .py-sm-3 { - padding-bottom: 1rem !important; - } - .pl-sm-3, - .px-sm-3 { - padding-left: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .pt-sm-4, - .py-sm-4 { - padding-top: 1.5rem !important; - } - .pr-sm-4, - .px-sm-4 { - padding-right: 1.5rem !important; - } - .pb-sm-4, - .py-sm-4 { - padding-bottom: 1.5rem !important; - } - .pl-sm-4, - .px-sm-4 { - padding-left: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .pt-sm-5, - .py-sm-5 { - padding-top: 3rem !important; - } - .pr-sm-5, - .px-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-5, - .py-sm-5 { - padding-bottom: 3rem !important; - } - .pl-sm-5, - .px-sm-5 { - padding-left: 3rem !important; - } - .m-sm-n1 { - margin: -0.25rem !important; - } - .mt-sm-n1, - .my-sm-n1 { - margin-top: -0.25rem !important; - } - .mr-sm-n1, - .mx-sm-n1 { - margin-right: -0.25rem !important; - } - .mb-sm-n1, - .my-sm-n1 { - margin-bottom: -0.25rem !important; - } - .ml-sm-n1, - .mx-sm-n1 { - margin-left: -0.25rem !important; - } - .m-sm-n2 { - margin: -0.5rem !important; - } - .mt-sm-n2, - .my-sm-n2 { - margin-top: -0.5rem !important; - } - .mr-sm-n2, - .mx-sm-n2 { - margin-right: -0.5rem !important; - } - .mb-sm-n2, - .my-sm-n2 { - margin-bottom: -0.5rem !important; - } - .ml-sm-n2, - .mx-sm-n2 { - margin-left: -0.5rem !important; - } - .m-sm-n3 { - margin: -1rem !important; - } - .mt-sm-n3, - .my-sm-n3 { - margin-top: -1rem !important; - } - .mr-sm-n3, - .mx-sm-n3 { - margin-right: -1rem !important; - } - .mb-sm-n3, - .my-sm-n3 { - margin-bottom: -1rem !important; - } - .ml-sm-n3, - .mx-sm-n3 { - margin-left: -1rem !important; - } - .m-sm-n4 { - margin: -1.5rem !important; - } - .mt-sm-n4, - .my-sm-n4 { - margin-top: -1.5rem !important; - } - .mr-sm-n4, - .mx-sm-n4 { - margin-right: -1.5rem !important; - } - .mb-sm-n4, - .my-sm-n4 { - margin-bottom: -1.5rem !important; - } - .ml-sm-n4, - .mx-sm-n4 { - margin-left: -1.5rem !important; - } - .m-sm-n5 { - margin: -3rem !important; - } - .mt-sm-n5, - .my-sm-n5 { - margin-top: -3rem !important; - } - .mr-sm-n5, - .mx-sm-n5 { - margin-right: -3rem !important; - } - .mb-sm-n5, - .my-sm-n5 { - margin-bottom: -3rem !important; - } - .ml-sm-n5, - .mx-sm-n5 { - margin-left: -3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mt-sm-auto, - .my-sm-auto { - margin-top: auto !important; - } - .mr-sm-auto, - .mx-sm-auto { - margin-right: auto !important; - } - .mb-sm-auto, - .my-sm-auto { - margin-bottom: auto !important; - } - .ml-sm-auto, - .mx-sm-auto { - margin-left: auto !important; - } -} -@media (min-width: 768px) { - .m-md-0 { - margin: 0 !important; - } - .mt-md-0, - .my-md-0 { - margin-top: 0 !important; - } - .mr-md-0, - .mx-md-0 { - margin-right: 0 !important; - } - .mb-md-0, - .my-md-0 { - margin-bottom: 0 !important; - } - .ml-md-0, - .mx-md-0 { - margin-left: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .mt-md-1, - .my-md-1 { - margin-top: 0.25rem !important; - } - .mr-md-1, - .mx-md-1 { - margin-right: 0.25rem !important; - } - .mb-md-1, - .my-md-1 { - margin-bottom: 0.25rem !important; - } - .ml-md-1, - .mx-md-1 { - margin-left: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .mt-md-2, - .my-md-2 { - margin-top: 0.5rem !important; - } - .mr-md-2, - .mx-md-2 { - margin-right: 0.5rem !important; - } - .mb-md-2, - .my-md-2 { - margin-bottom: 0.5rem !important; - } - .ml-md-2, - .mx-md-2 { - margin-left: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .mt-md-3, - .my-md-3 { - margin-top: 1rem !important; - } - .mr-md-3, - .mx-md-3 { - margin-right: 1rem !important; - } - .mb-md-3, - .my-md-3 { - margin-bottom: 1rem !important; - } - .ml-md-3, - .mx-md-3 { - margin-left: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .mt-md-4, - .my-md-4 { - margin-top: 1.5rem !important; - } - .mr-md-4, - .mx-md-4 { - margin-right: 1.5rem !important; - } - .mb-md-4, - .my-md-4 { - margin-bottom: 1.5rem !important; - } - .ml-md-4, - .mx-md-4 { - margin-left: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .mt-md-5, - .my-md-5 { - margin-top: 3rem !important; - } - .mr-md-5, - .mx-md-5 { - margin-right: 3rem !important; - } - .mb-md-5, - .my-md-5 { - margin-bottom: 3rem !important; - } - .ml-md-5, - .mx-md-5 { - margin-left: 3rem !important; - } - .p-md-0 { - padding: 0 !important; - } - .pt-md-0, - .py-md-0 { - padding-top: 0 !important; - } - .pr-md-0, - .px-md-0 { - padding-right: 0 !important; - } - .pb-md-0, - .py-md-0 { - padding-bottom: 0 !important; - } - .pl-md-0, - .px-md-0 { - padding-left: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .pt-md-1, - .py-md-1 { - padding-top: 0.25rem !important; - } - .pr-md-1, - .px-md-1 { - padding-right: 0.25rem !important; - } - .pb-md-1, - .py-md-1 { - padding-bottom: 0.25rem !important; - } - .pl-md-1, - .px-md-1 { - padding-left: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .pt-md-2, - .py-md-2 { - padding-top: 0.5rem !important; - } - .pr-md-2, - .px-md-2 { - padding-right: 0.5rem !important; - } - .pb-md-2, - .py-md-2 { - padding-bottom: 0.5rem !important; - } - .pl-md-2, - .px-md-2 { - padding-left: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .pt-md-3, - .py-md-3 { - padding-top: 1rem !important; - } - .pr-md-3, - .px-md-3 { - padding-right: 1rem !important; - } - .pb-md-3, - .py-md-3 { - padding-bottom: 1rem !important; - } - .pl-md-3, - .px-md-3 { - padding-left: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .pt-md-4, - .py-md-4 { - padding-top: 1.5rem !important; - } - .pr-md-4, - .px-md-4 { - padding-right: 1.5rem !important; - } - .pb-md-4, - .py-md-4 { - padding-bottom: 1.5rem !important; - } - .pl-md-4, - .px-md-4 { - padding-left: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .pt-md-5, - .py-md-5 { - padding-top: 3rem !important; - } - .pr-md-5, - .px-md-5 { - padding-right: 3rem !important; - } - .pb-md-5, - .py-md-5 { - padding-bottom: 3rem !important; - } - .pl-md-5, - .px-md-5 { - padding-left: 3rem !important; - } - .m-md-n1 { - margin: -0.25rem !important; - } - .mt-md-n1, - .my-md-n1 { - margin-top: -0.25rem !important; - } - .mr-md-n1, - .mx-md-n1 { - margin-right: -0.25rem !important; - } - .mb-md-n1, - .my-md-n1 { - margin-bottom: -0.25rem !important; - } - .ml-md-n1, - .mx-md-n1 { - margin-left: -0.25rem !important; - } - .m-md-n2 { - margin: -0.5rem !important; - } - .mt-md-n2, - .my-md-n2 { - margin-top: -0.5rem !important; - } - .mr-md-n2, - .mx-md-n2 { - margin-right: -0.5rem !important; - } - .mb-md-n2, - .my-md-n2 { - margin-bottom: -0.5rem !important; - } - .ml-md-n2, - .mx-md-n2 { - margin-left: -0.5rem !important; - } - .m-md-n3 { - margin: -1rem !important; - } - .mt-md-n3, - .my-md-n3 { - margin-top: -1rem !important; - } - .mr-md-n3, - .mx-md-n3 { - margin-right: -1rem !important; - } - .mb-md-n3, - .my-md-n3 { - margin-bottom: -1rem !important; - } - .ml-md-n3, - .mx-md-n3 { - margin-left: -1rem !important; - } - .m-md-n4 { - margin: -1.5rem !important; - } - .mt-md-n4, - .my-md-n4 { - margin-top: -1.5rem !important; - } - .mr-md-n4, - .mx-md-n4 { - margin-right: -1.5rem !important; - } - .mb-md-n4, - .my-md-n4 { - margin-bottom: -1.5rem !important; - } - .ml-md-n4, - .mx-md-n4 { - margin-left: -1.5rem !important; - } - .m-md-n5 { - margin: -3rem !important; - } - .mt-md-n5, - .my-md-n5 { - margin-top: -3rem !important; - } - .mr-md-n5, - .mx-md-n5 { - margin-right: -3rem !important; - } - .mb-md-n5, - .my-md-n5 { - margin-bottom: -3rem !important; - } - .ml-md-n5, - .mx-md-n5 { - margin-left: -3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mt-md-auto, - .my-md-auto { - margin-top: auto !important; - } - .mr-md-auto, - .mx-md-auto { - margin-right: auto !important; - } - .mb-md-auto, - .my-md-auto { - margin-bottom: auto !important; - } - .ml-md-auto, - .mx-md-auto { - margin-left: auto !important; - } -} -@media (min-width: 992px) { - .m-lg-0 { - margin: 0 !important; - } - .mt-lg-0, - .my-lg-0 { - margin-top: 0 !important; - } - .mr-lg-0, - .mx-lg-0 { - margin-right: 0 !important; - } - .mb-lg-0, - .my-lg-0 { - margin-bottom: 0 !important; - } - .ml-lg-0, - .mx-lg-0 { - margin-left: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .mt-lg-1, - .my-lg-1 { - margin-top: 0.25rem !important; - } - .mr-lg-1, - .mx-lg-1 { - margin-right: 0.25rem !important; - } - .mb-lg-1, - .my-lg-1 { - margin-bottom: 0.25rem !important; - } - .ml-lg-1, - .mx-lg-1 { - margin-left: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .mt-lg-2, - .my-lg-2 { - margin-top: 0.5rem !important; - } - .mr-lg-2, - .mx-lg-2 { - margin-right: 0.5rem !important; - } - .mb-lg-2, - .my-lg-2 { - margin-bottom: 0.5rem !important; - } - .ml-lg-2, - .mx-lg-2 { - margin-left: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .mt-lg-3, - .my-lg-3 { - margin-top: 1rem !important; - } - .mr-lg-3, - .mx-lg-3 { - margin-right: 1rem !important; - } - .mb-lg-3, - .my-lg-3 { - margin-bottom: 1rem !important; - } - .ml-lg-3, - .mx-lg-3 { - margin-left: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .mt-lg-4, - .my-lg-4 { - margin-top: 1.5rem !important; - } - .mr-lg-4, - .mx-lg-4 { - margin-right: 1.5rem !important; - } - .mb-lg-4, - .my-lg-4 { - margin-bottom: 1.5rem !important; - } - .ml-lg-4, - .mx-lg-4 { - margin-left: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .mt-lg-5, - .my-lg-5 { - margin-top: 3rem !important; - } - .mr-lg-5, - .mx-lg-5 { - margin-right: 3rem !important; - } - .mb-lg-5, - .my-lg-5 { - margin-bottom: 3rem !important; - } - .ml-lg-5, - .mx-lg-5 { - margin-left: 3rem !important; - } - .p-lg-0 { - padding: 0 !important; - } - .pt-lg-0, - .py-lg-0 { - padding-top: 0 !important; - } - .pr-lg-0, - .px-lg-0 { - padding-right: 0 !important; - } - .pb-lg-0, - .py-lg-0 { - padding-bottom: 0 !important; - } - .pl-lg-0, - .px-lg-0 { - padding-left: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .pt-lg-1, - .py-lg-1 { - padding-top: 0.25rem !important; - } - .pr-lg-1, - .px-lg-1 { - padding-right: 0.25rem !important; - } - .pb-lg-1, - .py-lg-1 { - padding-bottom: 0.25rem !important; - } - .pl-lg-1, - .px-lg-1 { - padding-left: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .pt-lg-2, - .py-lg-2 { - padding-top: 0.5rem !important; - } - .pr-lg-2, - .px-lg-2 { - padding-right: 0.5rem !important; - } - .pb-lg-2, - .py-lg-2 { - padding-bottom: 0.5rem !important; - } - .pl-lg-2, - .px-lg-2 { - padding-left: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .pt-lg-3, - .py-lg-3 { - padding-top: 1rem !important; - } - .pr-lg-3, - .px-lg-3 { - padding-right: 1rem !important; - } - .pb-lg-3, - .py-lg-3 { - padding-bottom: 1rem !important; - } - .pl-lg-3, - .px-lg-3 { - padding-left: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .pt-lg-4, - .py-lg-4 { - padding-top: 1.5rem !important; - } - .pr-lg-4, - .px-lg-4 { - padding-right: 1.5rem !important; - } - .pb-lg-4, - .py-lg-4 { - padding-bottom: 1.5rem !important; - } - .pl-lg-4, - .px-lg-4 { - padding-left: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .pt-lg-5, - .py-lg-5 { - padding-top: 3rem !important; - } - .pr-lg-5, - .px-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-5, - .py-lg-5 { - padding-bottom: 3rem !important; - } - .pl-lg-5, - .px-lg-5 { - padding-left: 3rem !important; - } - .m-lg-n1 { - margin: -0.25rem !important; - } - .mt-lg-n1, - .my-lg-n1 { - margin-top: -0.25rem !important; - } - .mr-lg-n1, - .mx-lg-n1 { - margin-right: -0.25rem !important; - } - .mb-lg-n1, - .my-lg-n1 { - margin-bottom: -0.25rem !important; - } - .ml-lg-n1, - .mx-lg-n1 { - margin-left: -0.25rem !important; - } - .m-lg-n2 { - margin: -0.5rem !important; - } - .mt-lg-n2, - .my-lg-n2 { - margin-top: -0.5rem !important; - } - .mr-lg-n2, - .mx-lg-n2 { - margin-right: -0.5rem !important; - } - .mb-lg-n2, - .my-lg-n2 { - margin-bottom: -0.5rem !important; - } - .ml-lg-n2, - .mx-lg-n2 { - margin-left: -0.5rem !important; - } - .m-lg-n3 { - margin: -1rem !important; - } - .mt-lg-n3, - .my-lg-n3 { - margin-top: -1rem !important; - } - .mr-lg-n3, - .mx-lg-n3 { - margin-right: -1rem !important; - } - .mb-lg-n3, - .my-lg-n3 { - margin-bottom: -1rem !important; - } - .ml-lg-n3, - .mx-lg-n3 { - margin-left: -1rem !important; - } - .m-lg-n4 { - margin: -1.5rem !important; - } - .mt-lg-n4, - .my-lg-n4 { - margin-top: -1.5rem !important; - } - .mr-lg-n4, - .mx-lg-n4 { - margin-right: -1.5rem !important; - } - .mb-lg-n4, - .my-lg-n4 { - margin-bottom: -1.5rem !important; - } - .ml-lg-n4, - .mx-lg-n4 { - margin-left: -1.5rem !important; - } - .m-lg-n5 { - margin: -3rem !important; - } - .mt-lg-n5, - .my-lg-n5 { - margin-top: -3rem !important; - } - .mr-lg-n5, - .mx-lg-n5 { - margin-right: -3rem !important; - } - .mb-lg-n5, - .my-lg-n5 { - margin-bottom: -3rem !important; - } - .ml-lg-n5, - .mx-lg-n5 { - margin-left: -3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mt-lg-auto, - .my-lg-auto { - margin-top: auto !important; - } - .mr-lg-auto, - .mx-lg-auto { - margin-right: auto !important; - } - .mb-lg-auto, - .my-lg-auto { - margin-bottom: auto !important; - } - .ml-lg-auto, - .mx-lg-auto { - margin-left: auto !important; - } -} -@media (min-width: 1200px) { - .m-xl-0 { - margin: 0 !important; - } - .mt-xl-0, - .my-xl-0 { - margin-top: 0 !important; - } - .mr-xl-0, - .mx-xl-0 { - margin-right: 0 !important; - } - .mb-xl-0, - .my-xl-0 { - margin-bottom: 0 !important; - } - .ml-xl-0, - .mx-xl-0 { - margin-left: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .mt-xl-1, - .my-xl-1 { - margin-top: 0.25rem !important; - } - .mr-xl-1, - .mx-xl-1 { - margin-right: 0.25rem !important; - } - .mb-xl-1, - .my-xl-1 { - margin-bottom: 0.25rem !important; - } - .ml-xl-1, - .mx-xl-1 { - margin-left: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .mt-xl-2, - .my-xl-2 { - margin-top: 0.5rem !important; - } - .mr-xl-2, - .mx-xl-2 { - margin-right: 0.5rem !important; - } - .mb-xl-2, - .my-xl-2 { - margin-bottom: 0.5rem !important; - } - .ml-xl-2, - .mx-xl-2 { - margin-left: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .mt-xl-3, - .my-xl-3 { - margin-top: 1rem !important; - } - .mr-xl-3, - .mx-xl-3 { - margin-right: 1rem !important; - } - .mb-xl-3, - .my-xl-3 { - margin-bottom: 1rem !important; - } - .ml-xl-3, - .mx-xl-3 { - margin-left: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .mt-xl-4, - .my-xl-4 { - margin-top: 1.5rem !important; - } - .mr-xl-4, - .mx-xl-4 { - margin-right: 1.5rem !important; - } - .mb-xl-4, - .my-xl-4 { - margin-bottom: 1.5rem !important; - } - .ml-xl-4, - .mx-xl-4 { - margin-left: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .mt-xl-5, - .my-xl-5 { - margin-top: 3rem !important; - } - .mr-xl-5, - .mx-xl-5 { - margin-right: 3rem !important; - } - .mb-xl-5, - .my-xl-5 { - margin-bottom: 3rem !important; - } - .ml-xl-5, - .mx-xl-5 { - margin-left: 3rem !important; - } - .p-xl-0 { - padding: 0 !important; - } - .pt-xl-0, - .py-xl-0 { - padding-top: 0 !important; - } - .pr-xl-0, - .px-xl-0 { - padding-right: 0 !important; - } - .pb-xl-0, - .py-xl-0 { - padding-bottom: 0 !important; - } - .pl-xl-0, - .px-xl-0 { - padding-left: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .pt-xl-1, - .py-xl-1 { - padding-top: 0.25rem !important; - } - .pr-xl-1, - .px-xl-1 { - padding-right: 0.25rem !important; - } - .pb-xl-1, - .py-xl-1 { - padding-bottom: 0.25rem !important; - } - .pl-xl-1, - .px-xl-1 { - padding-left: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .pt-xl-2, - .py-xl-2 { - padding-top: 0.5rem !important; - } - .pr-xl-2, - .px-xl-2 { - padding-right: 0.5rem !important; - } - .pb-xl-2, - .py-xl-2 { - padding-bottom: 0.5rem !important; - } - .pl-xl-2, - .px-xl-2 { - padding-left: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .pt-xl-3, - .py-xl-3 { - padding-top: 1rem !important; - } - .pr-xl-3, - .px-xl-3 { - padding-right: 1rem !important; - } - .pb-xl-3, - .py-xl-3 { - padding-bottom: 1rem !important; - } - .pl-xl-3, - .px-xl-3 { - padding-left: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .pt-xl-4, - .py-xl-4 { - padding-top: 1.5rem !important; - } - .pr-xl-4, - .px-xl-4 { - padding-right: 1.5rem !important; - } - .pb-xl-4, - .py-xl-4 { - padding-bottom: 1.5rem !important; - } - .pl-xl-4, - .px-xl-4 { - padding-left: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .pt-xl-5, - .py-xl-5 { - padding-top: 3rem !important; - } - .pr-xl-5, - .px-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-5, - .py-xl-5 { - padding-bottom: 3rem !important; - } - .pl-xl-5, - .px-xl-5 { - padding-left: 3rem !important; - } - .m-xl-n1 { - margin: -0.25rem !important; - } - .mt-xl-n1, - .my-xl-n1 { - margin-top: -0.25rem !important; - } - .mr-xl-n1, - .mx-xl-n1 { - margin-right: -0.25rem !important; - } - .mb-xl-n1, - .my-xl-n1 { - margin-bottom: -0.25rem !important; - } - .ml-xl-n1, - .mx-xl-n1 { - margin-left: -0.25rem !important; - } - .m-xl-n2 { - margin: -0.5rem !important; - } - .mt-xl-n2, - .my-xl-n2 { - margin-top: -0.5rem !important; - } - .mr-xl-n2, - .mx-xl-n2 { - margin-right: -0.5rem !important; - } - .mb-xl-n2, - .my-xl-n2 { - margin-bottom: -0.5rem !important; - } - .ml-xl-n2, - .mx-xl-n2 { - margin-left: -0.5rem !important; - } - .m-xl-n3 { - margin: -1rem !important; - } - .mt-xl-n3, - .my-xl-n3 { - margin-top: -1rem !important; - } - .mr-xl-n3, - .mx-xl-n3 { - margin-right: -1rem !important; - } - .mb-xl-n3, - .my-xl-n3 { - margin-bottom: -1rem !important; - } - .ml-xl-n3, - .mx-xl-n3 { - margin-left: -1rem !important; - } - .m-xl-n4 { - margin: -1.5rem !important; - } - .mt-xl-n4, - .my-xl-n4 { - margin-top: -1.5rem !important; - } - .mr-xl-n4, - .mx-xl-n4 { - margin-right: -1.5rem !important; - } - .mb-xl-n4, - .my-xl-n4 { - margin-bottom: -1.5rem !important; - } - .ml-xl-n4, - .mx-xl-n4 { - margin-left: -1.5rem !important; - } - .m-xl-n5 { - margin: -3rem !important; - } - .mt-xl-n5, - .my-xl-n5 { - margin-top: -3rem !important; - } - .mr-xl-n5, - .mx-xl-n5 { - margin-right: -3rem !important; - } - .mb-xl-n5, - .my-xl-n5 { - margin-bottom: -3rem !important; - } - .ml-xl-n5, - .mx-xl-n5 { - margin-left: -3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mt-xl-auto, - .my-xl-auto { - margin-top: auto !important; - } - .mr-xl-auto, - .mx-xl-auto { - margin-right: auto !important; - } - .mb-xl-auto, - .my-xl-auto { - margin-bottom: auto !important; - } - .ml-xl-auto, - .mx-xl-auto { - margin-left: auto !important; - } -} -.text-monospace { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace !important; -} -.text-justify { - text-align: justify !important; -} -.text-wrap { - white-space: normal !important; -} -.text-nowrap { - white-space: nowrap !important; -} -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.text-left { - text-align: left !important; -} -.text-right { - text-align: right !important; -} -.text-center { - text-align: center !important; -} -@media (min-width: 576px) { - .text-sm-left { - text-align: left !important; - } - .text-sm-right { - text-align: right !important; - } - .text-sm-center { - text-align: center !important; - } -} -@media (min-width: 768px) { - .text-md-left { - text-align: left !important; - } - .text-md-right { - text-align: right !important; - } - .text-md-center { - text-align: center !important; - } -} -@media (min-width: 992px) { - .text-lg-left { - text-align: left !important; - } - .text-lg-right { - text-align: right !important; - } - .text-lg-center { - text-align: center !important; - } -} -@media (min-width: 1200px) { - .text-xl-left { - text-align: left !important; - } - .text-xl-right { - text-align: right !important; - } - .text-xl-center { - text-align: center !important; - } -} -.text-lowercase { - text-transform: lowercase !important; -} -.text-uppercase { - text-transform: uppercase !important; -} -.text-capitalize { - text-transform: capitalize !important; -} -.font-weight-light { - font-weight: 300 !important; -} -.font-weight-lighter { - font-weight: lighter !important; -} -.font-weight-normal { - font-weight: 400 !important; -} -.font-weight-bold { - font-weight: 700 !important; -} -.font-weight-bolder { - font-weight: bolder !important; -} -.font-italic { - font-style: italic !important; -} -.text-white { - color: #fff !important; -} -.text-primary { - color: #e05433 !important; -} -a.text-primary:hover, -a.text-primary:focus { - color: #ac361a !important; -} -.text-secondary { - color: #6c757d !important; -} -a.text-secondary:hover, -a.text-secondary:focus { - color: #494f54 !important; -} -.text-success { - color: #28a745 !important; -} -a.text-success:hover, -a.text-success:focus { - color: #19692c !important; -} -.text-info { - color: #17a2b8 !important; -} -a.text-info:hover, -a.text-info:focus { - color: #0f6674 !important; -} -.text-warning { - color: #ffc107 !important; -} -a.text-warning:hover, -a.text-warning:focus { - color: #ba8b00 !important; -} -.text-danger { - color: #dc3545 !important; -} -a.text-danger:hover, -a.text-danger:focus { - color: #a71d2a !important; -} -.text-light { - color: #f8f9fa !important; -} -a.text-light:hover, -a.text-light:focus { - color: #cbd3da !important; -} -.text-dark { - color: #343a40 !important; -} -a.text-dark:hover, -a.text-dark:focus { - color: #121416 !important; -} -.text-body { - color: #212529 !important; -} -.text-muted { - color: #6c757d !important; -} -.text-black-50 { - color: rgba(0, 0, 0, 0.5) !important; -} -.text-white-50 { - color: rgba(255, 255, 255, 0.5) !important; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.text-decoration-none { - text-decoration: none !important; -} -.text-break { - word-break: break-word !important; - overflow-wrap: break-word !important; -} -.text-reset { - color: inherit !important; -} -.visible { - visibility: visible !important; -} -.invisible { - visibility: hidden !important; -} -@media print { - *, - *::before, - *::after { - text-shadow: none !important; - -webkit-box-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; - } - pre, - blockquote { - border: 1px solid #adb5bd; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - @page { - size: a3; - } - body { - min-width: 992px !important; - } - .container { - min-width: 992px !important; - } - .navbar { - display: none; - } - .badge { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #dee2e6 !important; - } - .table-dark { - color: inherit; - } - .table-dark th, - .table-dark td, - .table-dark thead th, - .table-dark tbody + tbody { - border-color: #dee2e6; - } - .table .thead-dark th { - color: inherit; - border-color: #dee2e6; - } -} diff --git a/assets/html/css/style.css b/assets/html/css/style.css deleted file mode 100644 index deedf5a..0000000 --- a/assets/html/css/style.css +++ /dev/null @@ -1,24 +0,0 @@ -img { - width: 100%; -} -.showcase { - position: relative; - background: url('../img/showcase.jpg') no-repeat center center/cover; - min-height: 100vh; - color: #fff; -} -.showcase-inner { - text-align: center; - padding-top: 20%; - height: 100%; - width: 80%; - margin: auto; -} -.dark-overlay { - background-color: rgba(0, 0, 0, 0.6); - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} diff --git a/assets/html/index.html b/assets/html/index.html deleted file mode 100644 index 55a0784..0000000 --- a/assets/html/index.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - - -
-
-
-

Find a Code Bootcamp

-

- Find, rate and read reviews on coding bootcamps -

-
-
-
-
- -
-
-
-
- -
-
-
- -
-
-
-
- - - - - - - - - diff --git a/assets/html/js/mapbox.js b/assets/html/js/mapbox.js deleted file mode 100644 index 033c328..0000000 --- a/assets/html/js/mapbox.js +++ /dev/null @@ -1,53 +0,0 @@ -mapboxgl.accessToken = - 'pk.eyJ1IjoiYnRyYXZlcnN5IiwiYSI6ImNqenY5MThjMDBqZ3YzY3A0N3ppZTA5Y2QifQ.LrFjedgw1wG34TkWCpNtFg'; -var map = new mapboxgl.Map({ - container: 'map', - style: 'mapbox://styles/mapbox/streets-v11', - zoom: 7, - center: [-71.1054, 42.350498] - // interactive: false -}); - -map.on('load', function() { - map.addLayer({ - id: 'points', - type: 'symbol', - source: { - type: 'geojson', - data: { - type: 'FeatureCollection', - features: [ - { - type: 'Feature', - geometry: { - type: 'Point', - coordinates: [-71.1054, 42.350498] - }, - properties: { - title: 'DevWorks', - icon: 'college' - } - }, - { - type: 'Feature', - geometry: { - type: 'Point', - coordinates: [-122.414, 37.776] - }, - properties: { - title: 'Mapbox SF', - icon: 'harbor' - } - } - ] - } - }, - layout: { - 'icon-image': '{icon}-15', - 'text-field': '{title}', - 'text-font': ['Open Sans Semibold', 'Arial Unicode MS Bold'], - 'text-offset': [0, 0.6], - 'text-anchor': 'top' - } - }); -}); diff --git a/assets/html/login.html b/assets/html/login.html deleted file mode 100644 index fb60bb9..0000000 --- a/assets/html/login.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - - -
-
-
-
-
-
-

Login

-

- Log in to list your bootcamp or rate, review and favorite - bootcamps -

-
-
- - -
-
- - -
-
- -
-
-

Forgot Password? Reset Password

-
-
-
-
-
-
- - - - - - diff --git a/assets/html/manage-account.html b/assets/html/manage-account.html deleted file mode 100644 index 731fd14..0000000 --- a/assets/html/manage-account.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
-
-
-

Manage Account

-
-
- - -
-
- - -
-
-
-
- -
- -
-
-
-
-
-
-
-
- - - - - - diff --git a/assets/html/manage-bootcamp-none.html b/assets/html/manage-bootcamp-none.html deleted file mode 100644 index 0c667d4..0000000 --- a/assets/html/manage-bootcamp-none.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
-
-
-

Manage Bootcamp

-

- You have not yet added a bootcamp -

- Add Bootcamp -

- * You can only add one bootcamp per account. -

-

- * You must be affiliated with the bootcamp in some way in order - to add it to DevCamper. -

-
-
-
-
-
- - - - - - diff --git a/assets/html/manage-bootcamp.html b/assets/html/manage-bootcamp.html deleted file mode 100644 index 9e6844d..0000000 --- a/assets/html/manage-bootcamp.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
-
-
-

Manage Bootcamp

-
-
-
- ... -
-
-
-
- Devworks Bootcamp - 8.8 -
- Boston, MA -

- Web Development, UI/UX, Mobile Development -

-
-
-
-
-
-
-
- - -
-
- -
- Edit Bootcamp Details - Manage Courses - Remove Bootcamp -

- * You can only add one bootcamp per account. -

-

- * You must be affiliated with the bootcamp in some way in order - to add it to DevCamper. -

-
-
-
-
-
- - - - - - diff --git a/assets/html/manage-courses-none.html b/assets/html/manage-courses-none.html deleted file mode 100644 index bb60e93..0000000 --- a/assets/html/manage-courses-none.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
-
-
-

Manage Courses

-

- You have not yet added any courses -

- Add Your first course -
-
-
-
-
- - - - - - diff --git a/assets/html/manage-courses.html b/assets/html/manage-courses.html deleted file mode 100644 index 0f13898..0000000 --- a/assets/html/manage-courses.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
-
-
- Manage Bootcamp -

Manage Courses

-
-
-
- ... -
-
-
-
- Devworks Bootcamp - 4.9 -
- Boston, MA -

- Web Development, UI/UX, Mobile Development -

-
-
-
-
- - Add Bootcamp Course - - - - - - - - - - - - - - - - - -
Title
Front End Web Development - - -
Full Stack Web Development - - -
-
-
-
-
-
- - - - - - diff --git a/assets/html/manage-reviews.html b/assets/html/manage-reviews.html deleted file mode 100644 index 38d9a46..0000000 --- a/assets/html/manage-reviews.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
-
-
-

Manage Reviews

- - - - - - - - - - - - - - - - - - - - -
BootcampRating
DevWorks Bootcamp10 - - -
Codemasters7 - - -
-
-
-
-
-
- - - - - - diff --git a/assets/html/register.html b/assets/html/register.html deleted file mode 100644 index 2305a71..0000000 --- a/assets/html/register.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - - -
-
-
-
-
-
-

Register

-

- Register to list your bootcamp or rate, review and favorite - bootcamps -

-
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
User Role
-
- - -
-
- - -
-
-

- * You must be affiliated with the bootcamp in some way in - order to add it to DevCamper. -

-
- -
-
-
-
-
-
-
-
- - - - - - diff --git a/assets/html/reset-password.html b/assets/html/reset-password.html deleted file mode 100644 index 4b6912b..0000000 --- a/assets/html/reset-password.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
-
-
- Back to login -

Reset Password

-

Use this form to reset your password using the registered email address.

-
-
- - -
-
- -
-
- -
-
-
- -
- - - - - - diff --git a/assets/html/reviews.html b/assets/html/reviews.html deleted file mode 100644 index 1f51ebe..0000000 --- a/assets/html/reviews.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
- -
- Bootcamp Info -

DevWorks Bootcamp Reviews

- -
-
Fantastic Bootcamp
-
-
- Rating: 10 -
-

- Lorem, ipsum dolor sit amet consectetur adipisicing elit. - Commodi similique mollitia, praesentium, animi harum officia - dolores corporis ex tempore consequuntur dolorem ullam dolorum - magnam corrupti quaerat tempora repudiandae! Similique, - molestiae. Iste, blanditiis recusandae unde tenetur eius - exercitationem rerum a fuga. -

-

Writtern By Kevin Smith

-
-
- -
-
Learned a Lot
-
-
- Rating: 9 -
-

- Lorem, ipsum dolor sit amet consectetur adipisicing elit. - Commodi similique mollitia, praesentium, animi harum officia - dolores corporis ex tempore consequuntur dolorem ullam dolorum - magnam corrupti quaerat tempora repudiandae! Similique, - molestiae. Iste, blanditiis recusandae unde tenetur eius - exercitationem rerum a fuga. -

-

Writtern By Jill Samson

-
-
-
- -
- -

- 8.8 - Rating -

- - Review This Bootcamp -
-
-
-
- - - - - - diff --git a/assets/html/update-password.html b/assets/html/update-password.html deleted file mode 100644 index 55599e7..0000000 --- a/assets/html/update-password.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - DevCamper | Find a coding bootcamp - - - - - -
-
-
-
-
-

Update Password

-
-
- - -
-
- - -
-
- - -
-
- -
-
- -
-
-
- -
- - - - - - diff --git a/assets/logos/Color_Logo/dc_color_logo_jpg.jpg b/assets/logos/Color_Logo/dc_color_logo_jpg.jpg deleted file mode 100644 index 2729ec6..0000000 Binary files a/assets/logos/Color_Logo/dc_color_logo_jpg.jpg and /dev/null differ diff --git a/assets/logos/Color_Logo/dc_color_logo_pdf.pdf b/assets/logos/Color_Logo/dc_color_logo_pdf.pdf deleted file mode 100644 index 020aace..0000000 Binary files a/assets/logos/Color_Logo/dc_color_logo_pdf.pdf and /dev/null differ diff --git a/assets/logos/Color_Logo/dc_color_logo_png.png b/assets/logos/Color_Logo/dc_color_logo_png.png deleted file mode 100644 index 0ef313b..0000000 Binary files a/assets/logos/Color_Logo/dc_color_logo_png.png and /dev/null differ diff --git a/assets/logos/Color_Logo/dc_color_logo_svg.svg b/assets/logos/Color_Logo/dc_color_logo_svg.svg deleted file mode 100644 index e3857c0..0000000 --- a/assets/logos/Color_Logo/dc_color_logo_svg.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/logos/Color_favicons/android-icon-144x144.png b/assets/logos/Color_favicons/android-icon-144x144.png deleted file mode 100644 index db84fbc..0000000 Binary files a/assets/logos/Color_favicons/android-icon-144x144.png and /dev/null differ diff --git a/assets/logos/Color_favicons/android-icon-192x192.png b/assets/logos/Color_favicons/android-icon-192x192.png deleted file mode 100644 index e9e0a0b..0000000 Binary files a/assets/logos/Color_favicons/android-icon-192x192.png and /dev/null differ diff --git a/assets/logos/Color_favicons/android-icon-36x36.png b/assets/logos/Color_favicons/android-icon-36x36.png deleted file mode 100644 index 6c2763d..0000000 Binary files a/assets/logos/Color_favicons/android-icon-36x36.png and /dev/null differ diff --git a/assets/logos/Color_favicons/android-icon-48x48.png b/assets/logos/Color_favicons/android-icon-48x48.png deleted file mode 100644 index e3d7c2d..0000000 Binary files a/assets/logos/Color_favicons/android-icon-48x48.png and /dev/null differ diff --git a/assets/logos/Color_favicons/android-icon-72x72.png b/assets/logos/Color_favicons/android-icon-72x72.png deleted file mode 100644 index 84dfb2f..0000000 Binary files a/assets/logos/Color_favicons/android-icon-72x72.png and /dev/null differ diff --git a/assets/logos/Color_favicons/android-icon-96x96.png b/assets/logos/Color_favicons/android-icon-96x96.png deleted file mode 100644 index 9149e73..0000000 Binary files a/assets/logos/Color_favicons/android-icon-96x96.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon-114x114.png b/assets/logos/Color_favicons/apple-icon-114x114.png deleted file mode 100644 index 4c3ea5f..0000000 Binary files a/assets/logos/Color_favicons/apple-icon-114x114.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon-120x120.png b/assets/logos/Color_favicons/apple-icon-120x120.png deleted file mode 100644 index 1bb6646..0000000 Binary files a/assets/logos/Color_favicons/apple-icon-120x120.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon-144x144.png b/assets/logos/Color_favicons/apple-icon-144x144.png deleted file mode 100644 index db84fbc..0000000 Binary files a/assets/logos/Color_favicons/apple-icon-144x144.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon-152x152.png b/assets/logos/Color_favicons/apple-icon-152x152.png deleted file mode 100644 index d7102c7..0000000 Binary files a/assets/logos/Color_favicons/apple-icon-152x152.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon-180x180.png b/assets/logos/Color_favicons/apple-icon-180x180.png deleted file mode 100644 index aef86b0..0000000 Binary files a/assets/logos/Color_favicons/apple-icon-180x180.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon-57x57.png b/assets/logos/Color_favicons/apple-icon-57x57.png deleted file mode 100644 index 1b94b57..0000000 Binary files a/assets/logos/Color_favicons/apple-icon-57x57.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon-60x60.png b/assets/logos/Color_favicons/apple-icon-60x60.png deleted file mode 100644 index 59ac1af..0000000 Binary files a/assets/logos/Color_favicons/apple-icon-60x60.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon-72x72.png b/assets/logos/Color_favicons/apple-icon-72x72.png deleted file mode 100644 index 84dfb2f..0000000 Binary files a/assets/logos/Color_favicons/apple-icon-72x72.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon-76x76.png b/assets/logos/Color_favicons/apple-icon-76x76.png deleted file mode 100644 index 0addd29..0000000 Binary files a/assets/logos/Color_favicons/apple-icon-76x76.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon-precomposed.png b/assets/logos/Color_favicons/apple-icon-precomposed.png deleted file mode 100644 index b6e0489..0000000 Binary files a/assets/logos/Color_favicons/apple-icon-precomposed.png and /dev/null differ diff --git a/assets/logos/Color_favicons/apple-icon.png b/assets/logos/Color_favicons/apple-icon.png deleted file mode 100644 index b6e0489..0000000 Binary files a/assets/logos/Color_favicons/apple-icon.png and /dev/null differ diff --git a/assets/logos/Color_favicons/browserconfig.xml b/assets/logos/Color_favicons/browserconfig.xml deleted file mode 100644 index c554148..0000000 --- a/assets/logos/Color_favicons/browserconfig.xml +++ /dev/null @@ -1,2 +0,0 @@ - -#ffffff \ No newline at end of file diff --git a/assets/logos/Color_favicons/favicon-16x16.png b/assets/logos/Color_favicons/favicon-16x16.png deleted file mode 100644 index 8bdc8d4..0000000 Binary files a/assets/logos/Color_favicons/favicon-16x16.png and /dev/null differ diff --git a/assets/logos/Color_favicons/favicon-32x32.png b/assets/logos/Color_favicons/favicon-32x32.png deleted file mode 100644 index 84999b2..0000000 Binary files a/assets/logos/Color_favicons/favicon-32x32.png and /dev/null differ diff --git a/assets/logos/Color_favicons/favicon-96x96.png b/assets/logos/Color_favicons/favicon-96x96.png deleted file mode 100644 index 9149e73..0000000 Binary files a/assets/logos/Color_favicons/favicon-96x96.png and /dev/null differ diff --git a/assets/logos/Color_favicons/favicon.ico b/assets/logos/Color_favicons/favicon.ico deleted file mode 100644 index c0dbb06..0000000 Binary files a/assets/logos/Color_favicons/favicon.ico and /dev/null differ diff --git a/assets/logos/Color_favicons/manifest.json b/assets/logos/Color_favicons/manifest.json deleted file mode 100644 index 013d4a6..0000000 --- a/assets/logos/Color_favicons/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "App", - "icons": [ - { - "src": "\/android-icon-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": "0.75" - }, - { - "src": "\/android-icon-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": "1.0" - }, - { - "src": "\/android-icon-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": "1.5" - }, - { - "src": "\/android-icon-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": "2.0" - }, - { - "src": "\/android-icon-144x144.png", - "sizes": "144x144", - "type": "image\/png", - "density": "3.0" - }, - { - "src": "\/android-icon-192x192.png", - "sizes": "192x192", - "type": "image\/png", - "density": "4.0" - } - ] -} \ No newline at end of file diff --git a/assets/logos/Color_favicons/ms-icon-144x144.png b/assets/logos/Color_favicons/ms-icon-144x144.png deleted file mode 100644 index db84fbc..0000000 Binary files a/assets/logos/Color_favicons/ms-icon-144x144.png and /dev/null differ diff --git a/assets/logos/Color_favicons/ms-icon-150x150.png b/assets/logos/Color_favicons/ms-icon-150x150.png deleted file mode 100644 index 9c77e09..0000000 Binary files a/assets/logos/Color_favicons/ms-icon-150x150.png and /dev/null differ diff --git a/assets/logos/Color_favicons/ms-icon-310x310.png b/assets/logos/Color_favicons/ms-icon-310x310.png deleted file mode 100644 index 8bfa2b2..0000000 Binary files a/assets/logos/Color_favicons/ms-icon-310x310.png and /dev/null differ diff --git a/assets/logos/Color_favicons/ms-icon-70x70.png b/assets/logos/Color_favicons/ms-icon-70x70.png deleted file mode 100644 index 6dfef83..0000000 Binary files a/assets/logos/Color_favicons/ms-icon-70x70.png and /dev/null differ diff --git a/assets/logos/Dark_Logo/dc_dark_logo_jpg.jpg b/assets/logos/Dark_Logo/dc_dark_logo_jpg.jpg deleted file mode 100644 index 9eddb39..0000000 Binary files a/assets/logos/Dark_Logo/dc_dark_logo_jpg.jpg and /dev/null differ diff --git a/assets/logos/Dark_Logo/dc_dark_logo_pdf.pdf b/assets/logos/Dark_Logo/dc_dark_logo_pdf.pdf deleted file mode 100644 index 1aa511f..0000000 Binary files a/assets/logos/Dark_Logo/dc_dark_logo_pdf.pdf and /dev/null differ diff --git a/assets/logos/Dark_Logo/dc_dark_logo_png.png b/assets/logos/Dark_Logo/dc_dark_logo_png.png deleted file mode 100644 index 6682072..0000000 Binary files a/assets/logos/Dark_Logo/dc_dark_logo_png.png and /dev/null differ diff --git a/assets/logos/Dark_Logo/dc_dark_logo_svg.svg b/assets/logos/Dark_Logo/dc_dark_logo_svg.svg deleted file mode 100644 index 539a619..0000000 --- a/assets/logos/Dark_Logo/dc_dark_logo_svg.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/logos/Dark_favicons/android-icon-144x144.png b/assets/logos/Dark_favicons/android-icon-144x144.png deleted file mode 100644 index 216c966..0000000 Binary files a/assets/logos/Dark_favicons/android-icon-144x144.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/android-icon-192x192.png b/assets/logos/Dark_favicons/android-icon-192x192.png deleted file mode 100644 index 2bac53f..0000000 Binary files a/assets/logos/Dark_favicons/android-icon-192x192.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/android-icon-36x36.png b/assets/logos/Dark_favicons/android-icon-36x36.png deleted file mode 100644 index ff81e7f..0000000 Binary files a/assets/logos/Dark_favicons/android-icon-36x36.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/android-icon-48x48.png b/assets/logos/Dark_favicons/android-icon-48x48.png deleted file mode 100644 index 139c0a3..0000000 Binary files a/assets/logos/Dark_favicons/android-icon-48x48.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/android-icon-72x72.png b/assets/logos/Dark_favicons/android-icon-72x72.png deleted file mode 100644 index 074e22a..0000000 Binary files a/assets/logos/Dark_favicons/android-icon-72x72.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/android-icon-96x96.png b/assets/logos/Dark_favicons/android-icon-96x96.png deleted file mode 100644 index 146d4c8..0000000 Binary files a/assets/logos/Dark_favicons/android-icon-96x96.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon-114x114.png b/assets/logos/Dark_favicons/apple-icon-114x114.png deleted file mode 100644 index 8394fe5..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon-114x114.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon-120x120.png b/assets/logos/Dark_favicons/apple-icon-120x120.png deleted file mode 100644 index 09ec246..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon-120x120.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon-144x144.png b/assets/logos/Dark_favicons/apple-icon-144x144.png deleted file mode 100644 index da0d621..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon-144x144.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon-152x152.png b/assets/logos/Dark_favicons/apple-icon-152x152.png deleted file mode 100644 index 8fd65d0..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon-152x152.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon-180x180.png b/assets/logos/Dark_favicons/apple-icon-180x180.png deleted file mode 100644 index b76c1dd..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon-180x180.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon-57x57.png b/assets/logos/Dark_favicons/apple-icon-57x57.png deleted file mode 100644 index 96a7881..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon-57x57.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon-60x60.png b/assets/logos/Dark_favicons/apple-icon-60x60.png deleted file mode 100644 index e8ef077..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon-60x60.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon-72x72.png b/assets/logos/Dark_favicons/apple-icon-72x72.png deleted file mode 100644 index 2b34153..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon-72x72.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon-76x76.png b/assets/logos/Dark_favicons/apple-icon-76x76.png deleted file mode 100644 index 92c6af5..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon-76x76.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon-precomposed.png b/assets/logos/Dark_favicons/apple-icon-precomposed.png deleted file mode 100644 index 89245d9..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon-precomposed.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/apple-icon.png b/assets/logos/Dark_favicons/apple-icon.png deleted file mode 100644 index 89245d9..0000000 Binary files a/assets/logos/Dark_favicons/apple-icon.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/browserconfig.xml b/assets/logos/Dark_favicons/browserconfig.xml deleted file mode 100644 index c554148..0000000 --- a/assets/logos/Dark_favicons/browserconfig.xml +++ /dev/null @@ -1,2 +0,0 @@ - -#ffffff \ No newline at end of file diff --git a/assets/logos/Dark_favicons/favicon-16x16.png b/assets/logos/Dark_favicons/favicon-16x16.png deleted file mode 100644 index 847c9be..0000000 Binary files a/assets/logos/Dark_favicons/favicon-16x16.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/favicon-32x32.png b/assets/logos/Dark_favicons/favicon-32x32.png deleted file mode 100644 index 1ce9784..0000000 Binary files a/assets/logos/Dark_favicons/favicon-32x32.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/favicon-96x96.png b/assets/logos/Dark_favicons/favicon-96x96.png deleted file mode 100644 index 4023d24..0000000 Binary files a/assets/logos/Dark_favicons/favicon-96x96.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/favicon.ico b/assets/logos/Dark_favicons/favicon.ico deleted file mode 100644 index c4ea209..0000000 Binary files a/assets/logos/Dark_favicons/favicon.ico and /dev/null differ diff --git a/assets/logos/Dark_favicons/manifest.json b/assets/logos/Dark_favicons/manifest.json deleted file mode 100644 index 013d4a6..0000000 --- a/assets/logos/Dark_favicons/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "App", - "icons": [ - { - "src": "\/android-icon-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": "0.75" - }, - { - "src": "\/android-icon-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": "1.0" - }, - { - "src": "\/android-icon-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": "1.5" - }, - { - "src": "\/android-icon-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": "2.0" - }, - { - "src": "\/android-icon-144x144.png", - "sizes": "144x144", - "type": "image\/png", - "density": "3.0" - }, - { - "src": "\/android-icon-192x192.png", - "sizes": "192x192", - "type": "image\/png", - "density": "4.0" - } - ] -} \ No newline at end of file diff --git a/assets/logos/Dark_favicons/ms-icon-144x144.png b/assets/logos/Dark_favicons/ms-icon-144x144.png deleted file mode 100644 index da0d621..0000000 Binary files a/assets/logos/Dark_favicons/ms-icon-144x144.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/ms-icon-150x150.png b/assets/logos/Dark_favicons/ms-icon-150x150.png deleted file mode 100644 index 3cc33bf..0000000 Binary files a/assets/logos/Dark_favicons/ms-icon-150x150.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/ms-icon-310x310.png b/assets/logos/Dark_favicons/ms-icon-310x310.png deleted file mode 100644 index cc3814a..0000000 Binary files a/assets/logos/Dark_favicons/ms-icon-310x310.png and /dev/null differ diff --git a/assets/logos/Dark_favicons/ms-icon-70x70.png b/assets/logos/Dark_favicons/ms-icon-70x70.png deleted file mode 100644 index 8a9e223..0000000 Binary files a/assets/logos/Dark_favicons/ms-icon-70x70.png and /dev/null differ diff --git a/assets/logos/Light_Logo/dc_light_logo_jpg.jpg b/assets/logos/Light_Logo/dc_light_logo_jpg.jpg deleted file mode 100644 index 6595959..0000000 Binary files a/assets/logos/Light_Logo/dc_light_logo_jpg.jpg and /dev/null differ diff --git a/assets/logos/Light_Logo/dc_light_logo_pdf.pdf b/assets/logos/Light_Logo/dc_light_logo_pdf.pdf deleted file mode 100644 index 357420e..0000000 Binary files a/assets/logos/Light_Logo/dc_light_logo_pdf.pdf and /dev/null differ diff --git a/assets/logos/Light_Logo/dc_light_logo_png.png b/assets/logos/Light_Logo/dc_light_logo_png.png deleted file mode 100644 index 20c15a0..0000000 Binary files a/assets/logos/Light_Logo/dc_light_logo_png.png and /dev/null differ diff --git a/assets/logos/Light_Logo/dc_light_logo_svg.svg b/assets/logos/Light_Logo/dc_light_logo_svg.svg deleted file mode 100644 index fb7e78d..0000000 --- a/assets/logos/Light_Logo/dc_light_logo_svg.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/logos/Light_favicons/android-icon-144x144.png b/assets/logos/Light_favicons/android-icon-144x144.png deleted file mode 100644 index 1bd20cb..0000000 Binary files a/assets/logos/Light_favicons/android-icon-144x144.png and /dev/null differ diff --git a/assets/logos/Light_favicons/android-icon-192x192.png b/assets/logos/Light_favicons/android-icon-192x192.png deleted file mode 100644 index 2a89d29..0000000 Binary files a/assets/logos/Light_favicons/android-icon-192x192.png and /dev/null differ diff --git a/assets/logos/Light_favicons/android-icon-36x36.png b/assets/logos/Light_favicons/android-icon-36x36.png deleted file mode 100644 index f89cbe7..0000000 Binary files a/assets/logos/Light_favicons/android-icon-36x36.png and /dev/null differ diff --git a/assets/logos/Light_favicons/android-icon-48x48.png b/assets/logos/Light_favicons/android-icon-48x48.png deleted file mode 100644 index 97be490..0000000 Binary files a/assets/logos/Light_favicons/android-icon-48x48.png and /dev/null differ diff --git a/assets/logos/Light_favicons/android-icon-72x72.png b/assets/logos/Light_favicons/android-icon-72x72.png deleted file mode 100644 index 154f430..0000000 Binary files a/assets/logos/Light_favicons/android-icon-72x72.png and /dev/null differ diff --git a/assets/logos/Light_favicons/android-icon-96x96.png b/assets/logos/Light_favicons/android-icon-96x96.png deleted file mode 100644 index 9adc374..0000000 Binary files a/assets/logos/Light_favicons/android-icon-96x96.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon-114x114.png b/assets/logos/Light_favicons/apple-icon-114x114.png deleted file mode 100644 index de31ba7..0000000 Binary files a/assets/logos/Light_favicons/apple-icon-114x114.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon-120x120.png b/assets/logos/Light_favicons/apple-icon-120x120.png deleted file mode 100644 index b264fbe..0000000 Binary files a/assets/logos/Light_favicons/apple-icon-120x120.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon-144x144.png b/assets/logos/Light_favicons/apple-icon-144x144.png deleted file mode 100644 index 1bd20cb..0000000 Binary files a/assets/logos/Light_favicons/apple-icon-144x144.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon-152x152.png b/assets/logos/Light_favicons/apple-icon-152x152.png deleted file mode 100644 index 2402853..0000000 Binary files a/assets/logos/Light_favicons/apple-icon-152x152.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon-180x180.png b/assets/logos/Light_favicons/apple-icon-180x180.png deleted file mode 100644 index fbb6405..0000000 Binary files a/assets/logos/Light_favicons/apple-icon-180x180.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon-57x57.png b/assets/logos/Light_favicons/apple-icon-57x57.png deleted file mode 100644 index eba1028..0000000 Binary files a/assets/logos/Light_favicons/apple-icon-57x57.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon-60x60.png b/assets/logos/Light_favicons/apple-icon-60x60.png deleted file mode 100644 index 77d31fa..0000000 Binary files a/assets/logos/Light_favicons/apple-icon-60x60.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon-72x72.png b/assets/logos/Light_favicons/apple-icon-72x72.png deleted file mode 100644 index 154f430..0000000 Binary files a/assets/logos/Light_favicons/apple-icon-72x72.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon-76x76.png b/assets/logos/Light_favicons/apple-icon-76x76.png deleted file mode 100644 index 71bdc8c..0000000 Binary files a/assets/logos/Light_favicons/apple-icon-76x76.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon-precomposed.png b/assets/logos/Light_favicons/apple-icon-precomposed.png deleted file mode 100644 index 834120f..0000000 Binary files a/assets/logos/Light_favicons/apple-icon-precomposed.png and /dev/null differ diff --git a/assets/logos/Light_favicons/apple-icon.png b/assets/logos/Light_favicons/apple-icon.png deleted file mode 100644 index 834120f..0000000 Binary files a/assets/logos/Light_favicons/apple-icon.png and /dev/null differ diff --git a/assets/logos/Light_favicons/browserconfig.xml b/assets/logos/Light_favicons/browserconfig.xml deleted file mode 100644 index c554148..0000000 --- a/assets/logos/Light_favicons/browserconfig.xml +++ /dev/null @@ -1,2 +0,0 @@ - -#ffffff \ No newline at end of file diff --git a/assets/logos/Light_favicons/favicon-16x16.png b/assets/logos/Light_favicons/favicon-16x16.png deleted file mode 100644 index 5d7a812..0000000 Binary files a/assets/logos/Light_favicons/favicon-16x16.png and /dev/null differ diff --git a/assets/logos/Light_favicons/favicon-32x32.png b/assets/logos/Light_favicons/favicon-32x32.png deleted file mode 100644 index f65dcf3..0000000 Binary files a/assets/logos/Light_favicons/favicon-32x32.png and /dev/null differ diff --git a/assets/logos/Light_favicons/favicon-96x96.png b/assets/logos/Light_favicons/favicon-96x96.png deleted file mode 100644 index 9adc374..0000000 Binary files a/assets/logos/Light_favicons/favicon-96x96.png and /dev/null differ diff --git a/assets/logos/Light_favicons/favicon.ico b/assets/logos/Light_favicons/favicon.ico deleted file mode 100644 index a8dfcfa..0000000 Binary files a/assets/logos/Light_favicons/favicon.ico and /dev/null differ diff --git a/assets/logos/Light_favicons/manifest.json b/assets/logos/Light_favicons/manifest.json deleted file mode 100644 index 013d4a6..0000000 --- a/assets/logos/Light_favicons/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "App", - "icons": [ - { - "src": "\/android-icon-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": "0.75" - }, - { - "src": "\/android-icon-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": "1.0" - }, - { - "src": "\/android-icon-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": "1.5" - }, - { - "src": "\/android-icon-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": "2.0" - }, - { - "src": "\/android-icon-144x144.png", - "sizes": "144x144", - "type": "image\/png", - "density": "3.0" - }, - { - "src": "\/android-icon-192x192.png", - "sizes": "192x192", - "type": "image\/png", - "density": "4.0" - } - ] -} \ No newline at end of file diff --git a/assets/logos/Light_favicons/ms-icon-144x144.png b/assets/logos/Light_favicons/ms-icon-144x144.png deleted file mode 100644 index 1bd20cb..0000000 Binary files a/assets/logos/Light_favicons/ms-icon-144x144.png and /dev/null differ diff --git a/assets/logos/Light_favicons/ms-icon-150x150.png b/assets/logos/Light_favicons/ms-icon-150x150.png deleted file mode 100644 index a5f2d52..0000000 Binary files a/assets/logos/Light_favicons/ms-icon-150x150.png and /dev/null differ diff --git a/assets/logos/Light_favicons/ms-icon-310x310.png b/assets/logos/Light_favicons/ms-icon-310x310.png deleted file mode 100644 index ac1e6cd..0000000 Binary files a/assets/logos/Light_favicons/ms-icon-310x310.png and /dev/null differ diff --git a/assets/logos/Light_favicons/ms-icon-70x70.png b/assets/logos/Light_favicons/ms-icon-70x70.png deleted file mode 100644 index b2b7eb2..0000000 Binary files a/assets/logos/Light_favicons/ms-icon-70x70.png and /dev/null differ diff --git a/docker/.env.example b/deploy/docker/.env.example similarity index 100% rename from docker/.env.example rename to deploy/docker/.env.example diff --git a/docker/docker-compose.yml b/deploy/docker/docker-compose.yml similarity index 100% rename from docker/docker-compose.yml rename to deploy/docker/docker-compose.yml diff --git a/.k8s/without-volume/README.md b/deploy/k8s/emptydir-volume/README.md similarity index 57% rename from .k8s/without-volume/README.md rename to deploy/k8s/emptydir-volume/README.md index 9780e6d..0498150 100644 --- a/.k8s/without-volume/README.md +++ b/deploy/k8s/emptydir-volume/README.md @@ -1,8 +1,19 @@ -# Setup Instructions +# Overview -Follow the below instructions to setup the application in Kubernetes cluster without using Persistent Volume. Note that the data will be stored in the container and will be lost when the container restarts or when the pod is deleted. +Follow the below instructions to understand data storage behavior in K8s cluster when `emptyDir` volume is defined and how to setup the application in Kubernetes cluster using EmptyDir Volume. -## Database Secrets +## Data Storage in Kubernetes without Volume + +- `emptyDir` Volume: The `emptyDir` volume is defined under the volumes section. This volume is created when the pod is assigned to a node and exists as long as the pod is running on that node. +- Mount Path: The volume is mounted at /data/db inside the MongoDB container, which is the default data directory for MongoDB. +- Pod Lifecycle: The data in the `emptyDir` volume is tied to the lifecycle of the pod. If the pod is deleted, the data in the `emptyDir` volume is also deleted. However, if the pod is simply restarted, the data persists. +- Container Dependency: The data in the `emptyDir` volume is tied to the pod's lifecycle, not the individual container's lifecycle. If the pod is deleted, the data is lost. If the pod is restarted, the data persists. + +## Setup Instructions + +Follow the below instructions to setup the application in Kubernetes cluster using `emptyDir` Volume. + +### Database Secrets 1. Create Mongo database username and password in base64 format: @@ -13,7 +24,7 @@ Follow the below instructions to setup the application in Kubernetes cluster wit 2. Provide the created username and password in the secrets file secrets.yaml -## Web API Secrets +### Web API Secrets 1. Provide database username and password created earlier in webapi/secret.yaml file @@ -42,10 +53,10 @@ Follow the below instructions to setup the application in Kubernetes cluster wit 5. Create JWT secret and encode it in base64 format and provide it in webapi/secret.yaml file: ```bash - echo -n 'JWT_SECRET' | base64 + echo -n 'JWT_SECRET ' | base64 ``` -## Deploy the Application +### Deploy the Application 1. Deploy the application by running the following command: @@ -53,7 +64,7 @@ Follow the below instructions to setup the application in Kubernetes cluster wit install.sh ``` -## Test the Application +### Test the Application 1. Navigate to the api folder and import data by running the following command. This will create devcamper database and insert data into it: @@ -67,15 +78,17 @@ Follow the below instructions to setup the application in Kubernetes cluster wit mongodb://admin:password@localhost:32017/ ``` -3. Delete the database pod using the following command: +3. Restart the container using Docker Desktop to see the data in the database. + +4. Delete the database pod using the following command: ```bash kubectl delete pod -l app=devcamper-db -n devcamper-namespace ``` -4. Note that deployment creates a new pod but the data is lost as the data is stored in the container and not in the Persistent Volume. +5. Note that deployment creates a new pod but the data is lost as the data is stored in the container and not in the Persistent Volume. -## Uninstall the Application +### Uninstall the Application 1. Uninstall the application by running the following command: diff --git a/.k8s/emptydir-volume/database/configmap.yaml b/deploy/k8s/emptydir-volume/database/configmap.yaml similarity index 100% rename from .k8s/emptydir-volume/database/configmap.yaml rename to deploy/k8s/emptydir-volume/database/configmap.yaml diff --git a/.k8s/emptydir-volume/database/deployment.yaml b/deploy/k8s/emptydir-volume/database/deployment.yaml similarity index 100% rename from .k8s/emptydir-volume/database/deployment.yaml rename to deploy/k8s/emptydir-volume/database/deployment.yaml diff --git a/deploy/k8s/emptydir-volume/database/install.sh b/deploy/k8s/emptydir-volume/database/install.sh new file mode 100644 index 0000000..3cb582c --- /dev/null +++ b/deploy/k8s/emptydir-volume/database/install.sh @@ -0,0 +1,9 @@ +#!bin/bash +kubectl apply -f configmap.yaml +kubectl apply -f secret.yaml +kubectl apply -f deployment.yaml +kubectl apply -f service.yaml + + +# Port foward deployment to test DB connectivity from local machine +# kubectl port-forward deployment/devcamper-db-deployment 32017:27017 -n devcamper-namespace \ No newline at end of file diff --git a/.k8s/emptydir-volume/database/secret.yaml b/deploy/k8s/emptydir-volume/database/secret.yaml similarity index 100% rename from .k8s/emptydir-volume/database/secret.yaml rename to deploy/k8s/emptydir-volume/database/secret.yaml diff --git a/deploy/k8s/emptydir-volume/database/service.yaml b/deploy/k8s/emptydir-volume/database/service.yaml new file mode 100644 index 0000000..4e619a7 --- /dev/null +++ b/deploy/k8s/emptydir-volume/database/service.yaml @@ -0,0 +1,31 @@ +apiVersion: v1 +kind: Service +metadata: + name: devcamper-db-service + namespace: devcamper-namespace +spec: + type: ClusterIP + selector: + app: devcamper-db + ports: + - protocol: TCP + port: 27017 + targetPort: 27017 + +--- +# Database Nodeport service was created just to access the database from the host machine. It is not recommended to use this service in production. + +apiVersion: v1 +kind: Service +metadata: + name: devcamper-db-nodeport-service + namespace: devcamper-namespace +spec: + type: NodePort + selector: + app: devcamper-db + ports: + - protocol: TCP + port: 27017 + targetPort: 27017 + nodePort: 32017 diff --git a/.k8s/emptydir-volume/database/uninstall.sh b/deploy/k8s/emptydir-volume/database/uninstall.sh similarity index 100% rename from .k8s/emptydir-volume/database/uninstall.sh rename to deploy/k8s/emptydir-volume/database/uninstall.sh diff --git a/.k8s/emptydir-volume/install.sh b/deploy/k8s/emptydir-volume/install.sh similarity index 100% rename from .k8s/emptydir-volume/install.sh rename to deploy/k8s/emptydir-volume/install.sh diff --git a/.k8s/emptydir-volume/namespace/install.sh b/deploy/k8s/emptydir-volume/namespace/install.sh similarity index 100% rename from .k8s/emptydir-volume/namespace/install.sh rename to deploy/k8s/emptydir-volume/namespace/install.sh diff --git a/.k8s/emptydir-volume/namespace/namespace.yaml b/deploy/k8s/emptydir-volume/namespace/namespace.yaml similarity index 100% rename from .k8s/emptydir-volume/namespace/namespace.yaml rename to deploy/k8s/emptydir-volume/namespace/namespace.yaml diff --git a/.k8s/emptydir-volume/namespace/uninstall.sh b/deploy/k8s/emptydir-volume/namespace/uninstall.sh similarity index 100% rename from .k8s/emptydir-volume/namespace/uninstall.sh rename to deploy/k8s/emptydir-volume/namespace/uninstall.sh diff --git a/.k8s/emptydir-volume/network/ingress.yaml b/deploy/k8s/emptydir-volume/network/ingress.yaml similarity index 91% rename from .k8s/emptydir-volume/network/ingress.yaml rename to deploy/k8s/emptydir-volume/network/ingress.yaml index 661c3c4..468b6fd 100644 --- a/.k8s/emptydir-volume/network/ingress.yaml +++ b/deploy/k8s/emptydir-volume/network/ingress.yaml @@ -17,7 +17,7 @@ spec: service: name: devcamper-webapp-service port: - number: 80 + number: 3000 - host: devcamper.webapi http: paths: @@ -27,4 +27,4 @@ spec: service: name: devcamper-webapi-service port: - number: 80 + number: 5000 diff --git a/deploy/k8s/emptydir-volume/network/install.sh b/deploy/k8s/emptydir-volume/network/install.sh new file mode 100644 index 0000000..b788010 --- /dev/null +++ b/deploy/k8s/emptydir-volume/network/install.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# Install an NGINX Ingress Controller +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml + +# Wait for the NGINX Ingress Controller to be ready +echo "Waiting for NGINX Ingress Controller to be ready..." +kubectl wait --namespace ingress-nginx \ + --for=condition=ready pod \ + --selector=app.kubernetes.io/component=controller \ + --timeout=90s + +# Apply the ingress configuration +kubectl apply -f ingress.yaml \ No newline at end of file diff --git a/deploy/k8s/emptydir-volume/network/uninstall.sh b/deploy/k8s/emptydir-volume/network/uninstall.sh new file mode 100644 index 0000000..a0ef770 --- /dev/null +++ b/deploy/k8s/emptydir-volume/network/uninstall.sh @@ -0,0 +1,3 @@ +#!bin/bash +kubectl delete -f ingress.yaml +kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml \ No newline at end of file diff --git a/.k8s/emptydir-volume/uninstall.sh b/deploy/k8s/emptydir-volume/uninstall.sh similarity index 100% rename from .k8s/emptydir-volume/uninstall.sh rename to deploy/k8s/emptydir-volume/uninstall.sh diff --git a/.k8s/emptydir-volume/webapi/configmap.yaml b/deploy/k8s/emptydir-volume/webapi/configmap.yaml similarity index 95% rename from .k8s/emptydir-volume/webapi/configmap.yaml rename to deploy/k8s/emptydir-volume/webapi/configmap.yaml index b0f3f98..2b5b9a8 100644 --- a/.k8s/emptydir-volume/webapi/configmap.yaml +++ b/deploy/k8s/emptydir-volume/webapi/configmap.yaml @@ -9,6 +9,7 @@ data: mongodb_db_name: 'devcamper-db' mongodb_db_params: 'authSource=admin' geocoder_provider: 'mapquest' + jwt_expire: '30d' jwt_cookie_expire: '30' file_upload_path: './public/uploads' max_file_upload: '1000000' diff --git a/.k8s/without-volume/webapi/deployment.yaml b/deploy/k8s/emptydir-volume/webapi/deployment.yaml similarity index 94% rename from .k8s/without-volume/webapi/deployment.yaml rename to deploy/k8s/emptydir-volume/webapi/deployment.yaml index 5ec2e8c..f2b775a 100644 --- a/.k8s/without-volume/webapi/deployment.yaml +++ b/deploy/k8s/emptydir-volume/webapi/deployment.yaml @@ -29,6 +29,8 @@ spec: ports: - containerPort: 5000 env: + - name: NODE_ENV + value: 'production' - name: mongodb_host valueFrom: configMapKeyRef: @@ -54,6 +56,11 @@ spec: configMapKeyRef: name: devcamper-webapi-configmap key: geocoder_provider + - name: jwt_expire + valueFrom: + configMapKeyRef: + name: devcamper-webapi-configmap + key: jwt_expire - name: jwt_cookie_expire valueFrom: configMapKeyRef: diff --git a/deploy/k8s/emptydir-volume/webapi/install.sh b/deploy/k8s/emptydir-volume/webapi/install.sh new file mode 100644 index 0000000..8e03034 --- /dev/null +++ b/deploy/k8s/emptydir-volume/webapi/install.sh @@ -0,0 +1,8 @@ +#!bin/bash +kubectl apply -f configmap.yaml +kubectl apply -f secret.yaml +kubectl apply -f deployment.yaml +kubectl apply -f service.yaml + +# Port forward service to test API connectivity from local machine +# kubectl port-forward service/devcamper-webapi-service 5000:5000 -n devcamper-namespace \ No newline at end of file diff --git a/.k8s/emptydir-volume/webapi/secret.yaml b/deploy/k8s/emptydir-volume/webapi/secret.yaml similarity index 91% rename from .k8s/emptydir-volume/webapi/secret.yaml rename to deploy/k8s/emptydir-volume/webapi/secret.yaml index 0df93f3..8e1d2ad 100644 --- a/.k8s/emptydir-volume/webapi/secret.yaml +++ b/deploy/k8s/emptydir-volume/webapi/secret.yaml @@ -15,3 +15,5 @@ data: from_email: YWRtaW5AZGV2Y2FtcGVyLmNvbQ== from_name: RGV2Q2FtcGVyIEFkbWlu jwt_secret: ZGV2Y2FtcGVyand0c2VjcmV0 + rate_limit_window: MTAw + rate_limit_max: MTAwMA== diff --git a/.k8s/emptydir-volume/webapi/service.yaml b/deploy/k8s/emptydir-volume/webapi/service.yaml similarity index 92% rename from .k8s/emptydir-volume/webapi/service.yaml rename to deploy/k8s/emptydir-volume/webapi/service.yaml index 6bb8d9e..f833e25 100644 --- a/.k8s/emptydir-volume/webapi/service.yaml +++ b/deploy/k8s/emptydir-volume/webapi/service.yaml @@ -6,7 +6,7 @@ metadata: spec: ports: - protocol: TCP - port: 80 + port: 5000 targetPort: 5000 selector: app: devcamper-webapi diff --git a/.k8s/emptydir-volume/webapi/uninstall.sh b/deploy/k8s/emptydir-volume/webapi/uninstall.sh similarity index 100% rename from .k8s/emptydir-volume/webapi/uninstall.sh rename to deploy/k8s/emptydir-volume/webapi/uninstall.sh diff --git a/deploy/k8s/emptydir-volume/webapp/configmap.yaml b/deploy/k8s/emptydir-volume/webapp/configmap.yaml new file mode 100644 index 0000000..608b029 --- /dev/null +++ b/deploy/k8s/emptydir-volume/webapp/configmap.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: devcamper-webapp-configmap + namespace: devcamper-namespace +data: + devcamper-config-json: | + { + "development": { + "react_app_devcamper_base_api_uri": "http://localhost:5000/api/v1" + }, + "production": { + "react_app_devcamper_base_api_uri": "http://devcamper.webapi/api/v1" + } + } diff --git a/deploy/k8s/emptydir-volume/webapp/deployment.yaml b/deploy/k8s/emptydir-volume/webapp/deployment.yaml new file mode 100644 index 0000000..61c5655 --- /dev/null +++ b/deploy/k8s/emptydir-volume/webapp/deployment.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: devcamper-webapp-deployment + namespace: devcamper-namespace +spec: + replicas: 1 + selector: + matchLabels: + app: devcamper-webapp + template: + metadata: + labels: + app: devcamper-webapp + spec: + containers: + - name: devcamper-webapp-container + image: prasadhonrao/devcamper-webapp:latest + ports: + - containerPort: 3000 + env: + - name: NODE_ENV + value: 'production' + resources: + limits: + memory: '2Gi' + cpu: '2' + requests: + memory: '1Gi' + cpu: '1' + volumeMounts: + - name: config-volume + mountPath: /app/build/config/config.json # /app/build is the path where the app is deployed. Check the Dockerfile of the webapp where node server is monitoring build folder and app is the working directory. Ensures that the mountPath is set to the full path where the config.json file should be placed. + subPath: devcamper-config-json # this is the key in the configmap data section + volumes: + - name: config-volume + configMap: + name: devcamper-webapp-configmap diff --git a/.k8s/emptydir-volume/webapp/install.sh b/deploy/k8s/emptydir-volume/webapp/install.sh similarity index 100% rename from .k8s/emptydir-volume/webapp/install.sh rename to deploy/k8s/emptydir-volume/webapp/install.sh diff --git a/.k8s/emptydir-volume/webapp/service.yaml b/deploy/k8s/emptydir-volume/webapp/service.yaml similarity index 92% rename from .k8s/emptydir-volume/webapp/service.yaml rename to deploy/k8s/emptydir-volume/webapp/service.yaml index 0e8e168..e7c5834 100644 --- a/.k8s/emptydir-volume/webapp/service.yaml +++ b/deploy/k8s/emptydir-volume/webapp/service.yaml @@ -6,7 +6,7 @@ metadata: spec: ports: - protocol: TCP - port: 80 + port: 3000 targetPort: 3000 selector: app: devcamper-webapp diff --git a/.k8s/emptydir-volume/webapp/uninstall.sh b/deploy/k8s/emptydir-volume/webapp/uninstall.sh similarity index 100% rename from .k8s/emptydir-volume/webapp/uninstall.sh rename to deploy/k8s/emptydir-volume/webapp/uninstall.sh diff --git a/.k8s/pv-pvc-azure-disk/README.md b/deploy/k8s/pv-pvc-azure-disk/README.md similarity index 100% rename from .k8s/pv-pvc-azure-disk/README.md rename to deploy/k8s/pv-pvc-azure-disk/README.md diff --git a/.k8s/pv-pvc-azure-disk/database/configmap.yaml b/deploy/k8s/pv-pvc-azure-disk/database/configmap.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/database/configmap.yaml rename to deploy/k8s/pv-pvc-azure-disk/database/configmap.yaml diff --git a/.k8s/pv-pvc-azure-disk/database/deployment.yaml b/deploy/k8s/pv-pvc-azure-disk/database/deployment.yaml similarity index 95% rename from .k8s/pv-pvc-azure-disk/database/deployment.yaml rename to deploy/k8s/pv-pvc-azure-disk/database/deployment.yaml index 72dbc30..17372ab 100644 --- a/.k8s/pv-pvc-azure-disk/database/deployment.yaml +++ b/deploy/k8s/pv-pvc-azure-disk/database/deployment.yaml @@ -45,9 +45,9 @@ spec: memory: '1Gi' cpu: '1' volumeMounts: - - name: mongo-volume + - name: mongodb-volume mountPath: /data/db volumes: - - name: mongo-volume + - name: mongodb-volume persistentVolumeClaim: claimName: devcamper-pvc diff --git a/.k8s/pv-pvc-azure-disk/database/install.sh b/deploy/k8s/pv-pvc-azure-disk/database/install.sh similarity index 100% rename from .k8s/pv-pvc-azure-disk/database/install.sh rename to deploy/k8s/pv-pvc-azure-disk/database/install.sh diff --git a/.k8s/pv-pvc-azure-disk/database/pv.yaml b/deploy/k8s/pv-pvc-azure-disk/database/pv.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/database/pv.yaml rename to deploy/k8s/pv-pvc-azure-disk/database/pv.yaml diff --git a/.k8s/pv-pvc-azure-disk/database/pvc.yaml b/deploy/k8s/pv-pvc-azure-disk/database/pvc.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/database/pvc.yaml rename to deploy/k8s/pv-pvc-azure-disk/database/pvc.yaml diff --git a/.k8s/pv-pvc-azure-disk/database/secret.yaml b/deploy/k8s/pv-pvc-azure-disk/database/secret.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/database/secret.yaml rename to deploy/k8s/pv-pvc-azure-disk/database/secret.yaml diff --git a/.k8s/pv-pvc-azure-disk/database/service-clusterip.yaml b/deploy/k8s/pv-pvc-azure-disk/database/service-clusterip.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/database/service-clusterip.yaml rename to deploy/k8s/pv-pvc-azure-disk/database/service-clusterip.yaml diff --git a/.k8s/pv-pvc-azure-disk/database/service-loadbalancer.yaml b/deploy/k8s/pv-pvc-azure-disk/database/service-loadbalancer.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/database/service-loadbalancer.yaml rename to deploy/k8s/pv-pvc-azure-disk/database/service-loadbalancer.yaml diff --git a/.k8s/pv-pvc-azure-disk/database/service-nodeport.yaml b/deploy/k8s/pv-pvc-azure-disk/database/service-nodeport.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/database/service-nodeport.yaml rename to deploy/k8s/pv-pvc-azure-disk/database/service-nodeport.yaml diff --git a/.k8s/pv-pvc-azure-disk/database/uninstall.sh b/deploy/k8s/pv-pvc-azure-disk/database/uninstall.sh similarity index 100% rename from .k8s/pv-pvc-azure-disk/database/uninstall.sh rename to deploy/k8s/pv-pvc-azure-disk/database/uninstall.sh diff --git a/.k8s/pv-pvc-azure-disk/install.sh b/deploy/k8s/pv-pvc-azure-disk/install.sh similarity index 100% rename from .k8s/pv-pvc-azure-disk/install.sh rename to deploy/k8s/pv-pvc-azure-disk/install.sh diff --git a/.k8s/pv-pvc-azure-disk/namespace/install.sh b/deploy/k8s/pv-pvc-azure-disk/namespace/install.sh similarity index 100% rename from .k8s/pv-pvc-azure-disk/namespace/install.sh rename to deploy/k8s/pv-pvc-azure-disk/namespace/install.sh diff --git a/.k8s/pv-pvc-azure-disk/namespace/namespace.yaml b/deploy/k8s/pv-pvc-azure-disk/namespace/namespace.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/namespace/namespace.yaml rename to deploy/k8s/pv-pvc-azure-disk/namespace/namespace.yaml diff --git a/.k8s/pv-pvc-azure-disk/namespace/uninstall.sh b/deploy/k8s/pv-pvc-azure-disk/namespace/uninstall.sh similarity index 100% rename from .k8s/pv-pvc-azure-disk/namespace/uninstall.sh rename to deploy/k8s/pv-pvc-azure-disk/namespace/uninstall.sh diff --git a/.k8s/pv-pvc-azure-disk/uninstall.sh b/deploy/k8s/pv-pvc-azure-disk/uninstall.sh similarity index 100% rename from .k8s/pv-pvc-azure-disk/uninstall.sh rename to deploy/k8s/pv-pvc-azure-disk/uninstall.sh diff --git a/.k8s/pv-pvc-azure-disk/webapi/configmap.yaml b/deploy/k8s/pv-pvc-azure-disk/webapi/configmap.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/webapi/configmap.yaml rename to deploy/k8s/pv-pvc-azure-disk/webapi/configmap.yaml diff --git a/.k8s/emptydir-volume/webapi/deployment.yaml b/deploy/k8s/pv-pvc-azure-disk/webapi/deployment.yaml similarity index 100% rename from .k8s/emptydir-volume/webapi/deployment.yaml rename to deploy/k8s/pv-pvc-azure-disk/webapi/deployment.yaml diff --git a/.k8s/pv-pvc-azure-disk/webapi/install.sh b/deploy/k8s/pv-pvc-azure-disk/webapi/install.sh similarity index 100% rename from .k8s/pv-pvc-azure-disk/webapi/install.sh rename to deploy/k8s/pv-pvc-azure-disk/webapi/install.sh diff --git a/.k8s/pv-pvc-azure-disk/webapi/secret.yaml b/deploy/k8s/pv-pvc-azure-disk/webapi/secret.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/webapi/secret.yaml rename to deploy/k8s/pv-pvc-azure-disk/webapi/secret.yaml diff --git a/.k8s/pv-pvc-azure-disk/webapi/service-nodeport.yaml b/deploy/k8s/pv-pvc-azure-disk/webapi/service-nodeport.yaml similarity index 100% rename from .k8s/pv-pvc-azure-disk/webapi/service-nodeport.yaml rename to deploy/k8s/pv-pvc-azure-disk/webapi/service-nodeport.yaml diff --git a/.k8s/pv-pvc-azure-disk/webapi/uninstall.sh b/deploy/k8s/pv-pvc-azure-disk/webapi/uninstall.sh similarity index 100% rename from .k8s/pv-pvc-azure-disk/webapi/uninstall.sh rename to deploy/k8s/pv-pvc-azure-disk/webapi/uninstall.sh diff --git a/.k8s/pv-pvc-azure-disk/webapp/install.sh b/deploy/k8s/pv-pvc-azure-disk/webapp/install.sh similarity index 100% rename from .k8s/pv-pvc-azure-disk/webapp/install.sh rename to deploy/k8s/pv-pvc-azure-disk/webapp/install.sh diff --git a/.k8s/pv-pvc-azure-disk/webapp/uninstall.sh b/deploy/k8s/pv-pvc-azure-disk/webapp/uninstall.sh similarity index 100% rename from .k8s/pv-pvc-azure-disk/webapp/uninstall.sh rename to deploy/k8s/pv-pvc-azure-disk/webapp/uninstall.sh diff --git a/.k8s/emptydir-volume/README.md b/deploy/k8s/without-volume/README.md similarity index 69% rename from .k8s/emptydir-volume/README.md rename to deploy/k8s/without-volume/README.md index fc25653..9cc602f 100644 --- a/.k8s/emptydir-volume/README.md +++ b/deploy/k8s/without-volume/README.md @@ -1,8 +1,21 @@ -# Setup Instructions +# Overview -Follow the below instructions to setup the application in Kubernetes cluster using EmptyDir Volume. Note that the data will be lost when the pod is deleted. +Follow the below instructions to understand data storage behavior in K8s cluster when no volume is defined and how to setup the application in Kubernetes cluster without using any Volume. -## Database Secrets +## Data Storage in Kubernetes without Volume + +- Data Storage: The data is stored in the container's writable layer. +- Ephemeral Storage: The data is ephemeral and tied to the container's lifecycle. +- Container Dependency: + - Restart: If the container is restarted (e.g., stopped and started again), the data in the writable layer persists. + - Removal: If the container is deleted and a new container is created, the data in the writable layer is lost. +- Isolation: Each container has its own writable layer, so data is isolated to that specific contai + +## Setup Instructions + +Follow the below instructions to setup the application in Kubernetes cluster using EmptyDir Volume. + +### Database Secrets 1. Create Mongo database username and password in base64 format: @@ -13,7 +26,7 @@ Follow the below instructions to setup the application in Kubernetes cluster usi 2. Provide the created username and password in the secrets file secrets.yaml -## Web API Secrets +### Web API Secrets 1. Provide database username and password created earlier in webapi/secret.yaml file @@ -45,7 +58,7 @@ Follow the below instructions to setup the application in Kubernetes cluster usi echo -n 'JWT_SECRET ' | base64 ``` -## Deploy the Application +### Deploy the Application 1. Deploy the application by running the following command: @@ -53,7 +66,7 @@ Follow the below instructions to setup the application in Kubernetes cluster usi install.sh ``` -## Test the Application +### Test the Application 1. Navigate to the api folder and import data by running the following command. This will create devcamper database and insert data into it: @@ -77,7 +90,7 @@ Follow the below instructions to setup the application in Kubernetes cluster usi 5. Note that deployment creates a new pod but the data is lost as the data is stored in the container and not in the Persistent Volume. -## Uninstall the Application +### Uninstall the Application 1. Uninstall the application by running the following command: diff --git a/.k8s/without-volume/database/configmap.yaml b/deploy/k8s/without-volume/database/configmap.yaml similarity index 76% rename from .k8s/without-volume/database/configmap.yaml rename to deploy/k8s/without-volume/database/configmap.yaml index 05e0a37..774403f 100644 --- a/.k8s/without-volume/database/configmap.yaml +++ b/deploy/k8s/without-volume/database/configmap.yaml @@ -4,4 +4,4 @@ metadata: name: devcamper-db-configmap namespace: devcamper-namespace data: - mongodb_db_name: 'devcamper-db' + mongodb_db_name: devcamper-db diff --git a/.k8s/without-volume/database/deployment.yaml b/deploy/k8s/without-volume/database/deployment.yaml similarity index 92% rename from .k8s/without-volume/database/deployment.yaml rename to deploy/k8s/without-volume/database/deployment.yaml index 9067018..55dc37b 100644 --- a/.k8s/without-volume/database/deployment.yaml +++ b/deploy/k8s/without-volume/database/deployment.yaml @@ -16,11 +16,10 @@ spec: app: devcamper-db spec: containers: - - name: devcamper-db + - name: devcamper-db-container image: mongo ports: - - name: mongodb - containerPort: 27017 + - containerPort: 27017 env: - name: MONGO_INITDB_DATABASE valueFrom: diff --git a/.k8s/emptydir-volume/webapi/install.sh b/deploy/k8s/without-volume/database/install.sh similarity index 100% rename from .k8s/emptydir-volume/webapi/install.sh rename to deploy/k8s/without-volume/database/install.sh diff --git a/deploy/k8s/without-volume/database/secret.yaml b/deploy/k8s/without-volume/database/secret.yaml new file mode 100644 index 0000000..8b8de8a --- /dev/null +++ b/deploy/k8s/without-volume/database/secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: devcamper-db-secret + namespace: devcamper-namespace +data: + mongodb_username: 'YWRtaW4=' + mongodb_password: 'cGFzc3dvcmQ=' diff --git a/deploy/k8s/without-volume/database/service.yaml b/deploy/k8s/without-volume/database/service.yaml new file mode 100644 index 0000000..4e619a7 --- /dev/null +++ b/deploy/k8s/without-volume/database/service.yaml @@ -0,0 +1,31 @@ +apiVersion: v1 +kind: Service +metadata: + name: devcamper-db-service + namespace: devcamper-namespace +spec: + type: ClusterIP + selector: + app: devcamper-db + ports: + - protocol: TCP + port: 27017 + targetPort: 27017 + +--- +# Database Nodeport service was created just to access the database from the host machine. It is not recommended to use this service in production. + +apiVersion: v1 +kind: Service +metadata: + name: devcamper-db-nodeport-service + namespace: devcamper-namespace +spec: + type: NodePort + selector: + app: devcamper-db + ports: + - protocol: TCP + port: 27017 + targetPort: 27017 + nodePort: 32017 diff --git a/.k8s/without-volume/webapi/uninstall.sh b/deploy/k8s/without-volume/database/uninstall.sh similarity index 73% rename from .k8s/without-volume/webapi/uninstall.sh rename to deploy/k8s/without-volume/database/uninstall.sh index 0a7fb30..398ae0c 100644 --- a/.k8s/without-volume/webapi/uninstall.sh +++ b/deploy/k8s/without-volume/database/uninstall.sh @@ -2,4 +2,5 @@ kubectl delete -f configmap.yaml kubectl delete -f secret.yaml kubectl delete -f deployment.yaml -kubectl delete -f service-nodeport.yaml \ No newline at end of file +kubectl delete -f service.yaml + diff --git a/deploy/k8s/without-volume/install.sh b/deploy/k8s/without-volume/install.sh new file mode 100644 index 0000000..153a8d9 --- /dev/null +++ b/deploy/k8s/without-volume/install.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Function to run install scripts in specified directories +run_install() { + local dir=$1 + echo -e "\033[1;34m==================== Installing $dir ====================\033[0m" + cd "$dir" || { echo -e "\033[1;31mFailed to change directory to $dir\033[0m"; exit 1; } + bash ./install.sh + cd - > /dev/null || { echo -e "\033[1;31mFailed to return to previous directory\033[0m"; exit 1; } + echo -e "\033[1;34m==================== Finished $dir ====================\033[0m" +} + +# Set trap to ensure we return to the original directory on exit +trap 'cd - > /dev/null' EXIT + +# Run install scripts in the specified directories +run_install namespace +run_install database +run_install webapi +run_install webapp +run_install network \ No newline at end of file diff --git a/.k8s/without-volume/namespace/install.sh b/deploy/k8s/without-volume/namespace/install.sh similarity index 100% rename from .k8s/without-volume/namespace/install.sh rename to deploy/k8s/without-volume/namespace/install.sh diff --git a/.k8s/without-volume/namespace/namespace.yaml b/deploy/k8s/without-volume/namespace/namespace.yaml similarity index 100% rename from .k8s/without-volume/namespace/namespace.yaml rename to deploy/k8s/without-volume/namespace/namespace.yaml diff --git a/.k8s/without-volume/namespace/uninstall.sh b/deploy/k8s/without-volume/namespace/uninstall.sh similarity index 100% rename from .k8s/without-volume/namespace/uninstall.sh rename to deploy/k8s/without-volume/namespace/uninstall.sh diff --git a/deploy/k8s/without-volume/network/ingress.yaml b/deploy/k8s/without-volume/network/ingress.yaml new file mode 100644 index 0000000..468b6fd --- /dev/null +++ b/deploy/k8s/without-volume/network/ingress.yaml @@ -0,0 +1,30 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: devcamper-ingress + namespace: devcamper-namespace + annotations: + nginx.ingress.kubernetes.io/rewrite-target: / +spec: + ingressClassName: nginx + rules: + - host: devcamper.webapp + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: devcamper-webapp-service + port: + number: 3000 + - host: devcamper.webapi + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: devcamper-webapi-service + port: + number: 5000 diff --git a/deploy/k8s/without-volume/network/install.sh b/deploy/k8s/without-volume/network/install.sh new file mode 100644 index 0000000..b788010 --- /dev/null +++ b/deploy/k8s/without-volume/network/install.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# Install an NGINX Ingress Controller +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml + +# Wait for the NGINX Ingress Controller to be ready +echo "Waiting for NGINX Ingress Controller to be ready..." +kubectl wait --namespace ingress-nginx \ + --for=condition=ready pod \ + --selector=app.kubernetes.io/component=controller \ + --timeout=90s + +# Apply the ingress configuration +kubectl apply -f ingress.yaml \ No newline at end of file diff --git a/deploy/k8s/without-volume/network/uninstall.sh b/deploy/k8s/without-volume/network/uninstall.sh new file mode 100644 index 0000000..a0ef770 --- /dev/null +++ b/deploy/k8s/without-volume/network/uninstall.sh @@ -0,0 +1,3 @@ +#!bin/bash +kubectl delete -f ingress.yaml +kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml \ No newline at end of file diff --git a/deploy/k8s/without-volume/uninstall.sh b/deploy/k8s/without-volume/uninstall.sh new file mode 100644 index 0000000..69e7345 --- /dev/null +++ b/deploy/k8s/without-volume/uninstall.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Function to run uninstall script in a directory +run_uninstall() { + local dir=$1 + echo -e "\033[1;34m==================== Uninstalling $dir ====================\033[0m" + cd "$dir" || { echo -e "\033[1;31mFailed to change directory to $dir\033[0m"; exit 1; } + bash ./uninstall.sh + cd - > /dev/null || { echo -e "\033[1;31mFailed to return to previous directory\033[0m"; exit 1; } + echo -e "\033[1;34m==================== Finished $dir ====================\033[0m" +} + +# Set trap to ensure we return to the original directory on exit +trap 'cd - > /dev/null' EXIT + +# Run uninstall scripts in the specified directories +run_uninstall database +run_uninstall webapi +run_uninstall webapp +run_uninstall network +run_uninstall namespace \ No newline at end of file diff --git a/.k8s/without-volume/webapi/configmap.yaml b/deploy/k8s/without-volume/webapi/configmap.yaml similarity index 86% rename from .k8s/without-volume/webapi/configmap.yaml rename to deploy/k8s/without-volume/webapi/configmap.yaml index 72c2e29..2b5b9a8 100644 --- a/.k8s/without-volume/webapi/configmap.yaml +++ b/deploy/k8s/without-volume/webapi/configmap.yaml @@ -4,13 +4,14 @@ metadata: name: devcamper-webapi-configmap namespace: devcamper-namespace data: - mongodb_host: 'devcamper-db-clusterip-service' + mongodb_host: 'devcamper-db-service' mongodb_port: '27017' mongodb_db_name: 'devcamper-db' mongodb_db_params: 'authSource=admin' geocoder_provider: 'mapquest' - rate_limit_window: '100' - rate_limit_max: '1000' + jwt_expire: '30d' jwt_cookie_expire: '30' file_upload_path: './public/uploads' max_file_upload: '1000000' + rate_limit_window: '100' + rate_limit_max: '1000' diff --git a/.k8s/pv-pvc-azure-disk/webapi/deployment.yaml b/deploy/k8s/without-volume/webapi/deployment.yaml similarity index 94% rename from .k8s/pv-pvc-azure-disk/webapi/deployment.yaml rename to deploy/k8s/without-volume/webapi/deployment.yaml index 5ec2e8c..f2b775a 100644 --- a/.k8s/pv-pvc-azure-disk/webapi/deployment.yaml +++ b/deploy/k8s/without-volume/webapi/deployment.yaml @@ -29,6 +29,8 @@ spec: ports: - containerPort: 5000 env: + - name: NODE_ENV + value: 'production' - name: mongodb_host valueFrom: configMapKeyRef: @@ -54,6 +56,11 @@ spec: configMapKeyRef: name: devcamper-webapi-configmap key: geocoder_provider + - name: jwt_expire + valueFrom: + configMapKeyRef: + name: devcamper-webapi-configmap + key: jwt_expire - name: jwt_cookie_expire valueFrom: configMapKeyRef: diff --git a/deploy/k8s/without-volume/webapi/install.sh b/deploy/k8s/without-volume/webapi/install.sh new file mode 100644 index 0000000..8e03034 --- /dev/null +++ b/deploy/k8s/without-volume/webapi/install.sh @@ -0,0 +1,8 @@ +#!bin/bash +kubectl apply -f configmap.yaml +kubectl apply -f secret.yaml +kubectl apply -f deployment.yaml +kubectl apply -f service.yaml + +# Port forward service to test API connectivity from local machine +# kubectl port-forward service/devcamper-webapi-service 5000:5000 -n devcamper-namespace \ No newline at end of file diff --git a/deploy/k8s/without-volume/webapi/secret.yaml b/deploy/k8s/without-volume/webapi/secret.yaml new file mode 100644 index 0000000..8e1d2ad --- /dev/null +++ b/deploy/k8s/without-volume/webapi/secret.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Secret +metadata: + name: devcamper-webapi-secret + namespace: devcamper-namespace +type: Opaque +data: + mongodb_username: 'YWRtaW4=' # base64 encoded string for 'admin' + mongodb_password: 'cGFzc3dvcmQ=' # base64 encoded string for 'password' + geocoder_api_key: 'OGl4ZGpuSzJMRGpGNTZmdlpaUlZwYzNuYmxEV3p4WFE=' + smtp_host: c2FuZGJveC5zbXRwLm1haWx0cmFwLmlv + smtp_port: MjUyNQ== + smtp_email: YTRhYjBlNDkzMWUzOWY= + smtp_password: MGQ5ZjljZDVlZTdlOGY= + from_email: YWRtaW5AZGV2Y2FtcGVyLmNvbQ== + from_name: RGV2Q2FtcGVyIEFkbWlu + jwt_secret: ZGV2Y2FtcGVyand0c2VjcmV0 + rate_limit_window: MTAw + rate_limit_max: MTAwMA== diff --git a/.k8s/without-volume/webapi/service-nodeport.yaml b/deploy/k8s/without-volume/webapi/service.yaml similarity index 63% rename from .k8s/without-volume/webapi/service-nodeport.yaml rename to deploy/k8s/without-volume/webapi/service.yaml index 7736107..f833e25 100644 --- a/.k8s/without-volume/webapi/service-nodeport.yaml +++ b/deploy/k8s/without-volume/webapi/service.yaml @@ -1,14 +1,12 @@ apiVersion: v1 kind: Service metadata: - name: devcamper-webapi-nodeport-service + name: devcamper-webapi-service namespace: devcamper-namespace spec: - type: NodePort ports: - protocol: TCP - port: 80 + port: 5000 targetPort: 5000 - nodePort: 32018 selector: app: devcamper-webapi diff --git a/.k8s/without-volume/database/uninstall.sh b/deploy/k8s/without-volume/webapi/uninstall.sh similarity index 60% rename from .k8s/without-volume/database/uninstall.sh rename to deploy/k8s/without-volume/webapi/uninstall.sh index 66f9516..40249bd 100644 --- a/.k8s/without-volume/database/uninstall.sh +++ b/deploy/k8s/without-volume/webapi/uninstall.sh @@ -2,5 +2,4 @@ kubectl delete -f configmap.yaml kubectl delete -f secret.yaml kubectl delete -f deployment.yaml -kubectl delete -f service-nodeport.yaml -kubectl delete -f service.yaml \ No newline at end of file +kubectl delete -f service.yaml diff --git a/deploy/k8s/without-volume/webapp/configmap.yaml b/deploy/k8s/without-volume/webapp/configmap.yaml new file mode 100644 index 0000000..ee1eaa0 --- /dev/null +++ b/deploy/k8s/without-volume/webapp/configmap.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: devcamper-webapp-configmap + namespace: devcamper-namespace +data: + config.json: | + { + "development": { + "react_app_devcamper_base_api_uri": "http://localhost:5000/api/v1" + }, + "production": { + "react_app_devcamper_base_api_uri": "http://devcamper.webapi/api/v1" + } + } diff --git a/.k8s/emptydir-volume/webapp/deployment.yaml b/deploy/k8s/without-volume/webapp/deployment.yaml similarity index 65% rename from .k8s/emptydir-volume/webapp/deployment.yaml rename to deploy/k8s/without-volume/webapp/deployment.yaml index df86638..c871cf1 100644 --- a/.k8s/emptydir-volume/webapp/deployment.yaml +++ b/deploy/k8s/without-volume/webapp/deployment.yaml @@ -19,11 +19,12 @@ spec: ports: - containerPort: 3000 env: - - name: REACT_APP_DEVCAMPER_BASE_API_URI - valueFrom: - configMapKeyRef: - name: devcamper-webapp-configmap - key: react_app_devcamper_base_api_uri + - name: NODE_ENV + value: 'production' + volumeMounts: + - name: config-volume + mountPath: /app/build/config/config.json + subPath: config.json resources: limits: memory: '2Gi' @@ -31,3 +32,7 @@ spec: requests: memory: '1Gi' cpu: '1' + volumes: + - name: config-volume + configMap: + name: devcamper-webapp-configmap diff --git a/.k8s/emptydir-volume/database/install.sh b/deploy/k8s/without-volume/webapp/install.sh similarity index 77% rename from .k8s/emptydir-volume/database/install.sh rename to deploy/k8s/without-volume/webapp/install.sh index f2cd6a6..13d4082 100644 --- a/.k8s/emptydir-volume/database/install.sh +++ b/deploy/k8s/without-volume/webapp/install.sh @@ -1,7 +1,4 @@ #!bin/bash kubectl apply -f configmap.yaml -kubectl apply -f secret.yaml kubectl apply -f deployment.yaml kubectl apply -f service.yaml - - diff --git a/.k8s/emptydir-volume/database/service.yaml b/deploy/k8s/without-volume/webapp/service.yaml similarity index 51% rename from .k8s/emptydir-volume/database/service.yaml rename to deploy/k8s/without-volume/webapp/service.yaml index 6d7883c..e7c5834 100644 --- a/.k8s/emptydir-volume/database/service.yaml +++ b/deploy/k8s/without-volume/webapp/service.yaml @@ -1,13 +1,12 @@ apiVersion: v1 kind: Service metadata: - name: devcamper-db-service + name: devcamper-webapp-service namespace: devcamper-namespace spec: - type: ClusterIP - selector: - app: devcamper-db ports: - protocol: TCP - port: 27017 - targetPort: 27017 + port: 3000 + targetPort: 3000 + selector: + app: devcamper-webapp diff --git a/deploy/k8s/without-volume/webapp/uninstall.sh b/deploy/k8s/without-volume/webapp/uninstall.sh new file mode 100644 index 0000000..1a6e510 --- /dev/null +++ b/deploy/k8s/without-volume/webapp/uninstall.sh @@ -0,0 +1,4 @@ +#!bin/bash +kubectl delete -f configmap.yaml +kubectl delete -f deployment.yaml +kubectl delete -f service.yaml diff --git a/docker/docker-compose-mongo.yml b/docker/docker-compose-mongo.yml deleted file mode 100644 index 998e91a..0000000 --- a/docker/docker-compose-mongo.yml +++ /dev/null @@ -1,16 +0,0 @@ -version: '3.8' - -services: - mongo: - image: mongo - container_name: devcamper-db - ports: - - 27017:27017 - environment: - - MONGO_INITDB_ROOT_USERNAME=admin - - MONGO_INITDB_ROOT_PASSWORD=password - volumes: - - mongo-data:/data/db - -volumes: - mongo-data: diff --git a/api/_postman/dev-environment.json b/postman/dev-environment.json similarity index 66% rename from api/_postman/dev-environment.json rename to postman/dev-environment.json index 391b40d..6577fa9 100644 --- a/api/_postman/dev-environment.json +++ b/postman/dev-environment.json @@ -4,7 +4,7 @@ "values": [ { "key": "url", - "value": "http://localhost:5000", + "value": "http://localhost:5000/api/v1", "type": "default", "enabled": true }, @@ -16,6 +16,6 @@ } ], "_postman_variable_scope": "environment", - "_postman_exported_at": "2024-08-20T08:22:16.787Z", - "_postman_exported_using": "Postman/11.8.0" + "_postman_exported_at": "2024-10-25T18:53:43.208Z", + "_postman_exported_using": "Postman/11.18.0" } \ No newline at end of file diff --git a/api/_postman/devcamper-api.json b/postman/devcamper-api.json similarity index 97% rename from api/_postman/devcamper-api.json rename to postman/devcamper-api.json index 0dbb216..c0a6106 100644 --- a/api/_postman/devcamper-api.json +++ b/postman/devcamper-api.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "63d37a0b-5499-4f19-a0dc-5c45169d9ce9", + "_postman_id": "024b412f-725c-4c97-b466-da930f165606", "name": "DevCamper", "description": "This template contains a boilerplate for documentation that you can quickly customize and reuse.\n\n### How to use this template:\n\n- Replace the content given brackets (()) with your API's details.\n \n- Tips are formatted in `codespan` - feel free to read and remove them.\n \n\n---\n\n`Start with a brief overview of what your API offers.`\n\nThe ((product name)) provides many API products, tools, and resources that enable you to ((add product value here)).\n\n`You can also list the APIs you offer, link to the relevant pages, or do both in this section.`\n\n## **Getting started guide**\n\n`List the steps or points required to start using your APIs. Make sure to cover everything required to reach success with your API as quickly as possible.`\n\nTo start using the ((add APIs here)), you need to -\n\n`The points given below are from The Postman API's documentation. You can reference it to write your own getting started guide.`\n\n- You must use a valid API Key to send requests to the API endpoints. You can get your API key from Postman's [integrations dashboard](https://go.postman.co/settings/me/api-keys).\n \n- The API has [rate and usage limits](https://learning.postman.com/docs/developer/postman-api/postman-api-rate-limits/).\n \n- The API only responds to HTTPS-secured communications. Any requests sent via HTTP return an HTTP 301 redirect to the corresponding HTTPS resources.\n \n- The API returns request responses in JSON format. When an API request returns an error, it is sent in the JSON response as an error key.\n \n\n## Authentication\n\n`Add details on the authorization keys/tokens required, steps that cover how to get them, and the relevant error codes.`\n\nThe ((product name)) API uses ((add your API's authorization type)) for authentication.\n\n`The details given below are from the Postman API's documentation. You can reference it to write your own authentication section.`\n\nPostman uses API keys for authentication. You can generate a Postman API key in the [API keys](https://postman.postman.co/settings/me/api-keys) section of your Postman account settings.\n\nYou must include an API key in each request to the Postman API with the X-Api-Key request header.\n\n### Authentication error response\n\nIf an API key is missing, malformed, or invalid, you will receive an HTTP 401 Unauthorized response code.\n\n## Rate and usage limits\n\n`Use this section to cover your APIs' terms of use. Include API limits, constraints, and relevant error codes, so consumers understand the permitted API usage and practices.`\n\n`The example given below is from The Postman API's documentation. Use it as a reference to write your APIs' terms of use.`\n\nAPI access rate limits apply at a per-API key basis in unit time. The limit is 300 requests per minute. Also, depending on your plan, you may have usage limits. If you exceed either limit, your request will return an HTTP 429 Too Many Requests status code.\n\nEach API response returns the following set of headers to help you identify your use status:\n\n| Header | Description |\n| --- | --- |\n| `X-RateLimit-Limit` | The maximum number of requests that the consumer is permitted to make per minute. |\n| `X-RateLimit-Remaining` | The number of requests remaining in the current rate limit window. |\n| `X-RateLimit-Reset` | The time at which the current rate limit window resets in UTC epoch seconds. |\n\n### 503 response\n\nAn HTTP `503` response from our servers indicates there is an unexpected spike in API access traffic. The server is usually operational within the next five minutes. If the outage persists or you receive any other form of an HTTP `5XX` error, [contact support](https://support.postman.com/hc/en-us/requests/new/).\n\n### **Need some help?**\n\n`Add links that customers can refer to whenever they need help.`\n\nIn case you have questions, go through our tutorials ((link to your video or help documentation here)). Or visit our FAQ page ((link to the relevant page)).\n\nOr you can check out our community forum, there’s a good chance our community has an answer for you. Visit our developer forum ((link to developer forum)) to review topics, ask questions, and learn from others.\n\n`You can also document or add links to libraries, code examples, and other resources needed to make a request.`", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", @@ -16,13 +16,12 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1", + "raw": "{{url}}/", "host": [ "{{url}}" ], "path": [ - "api", - "v1" + "" ] } }, @@ -34,13 +33,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/status", + "raw": "{{url}}/status", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "status" ] } @@ -70,13 +67,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -228,13 +223,169 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/publisher/5c8a1d5b0190b214360dc032", + "raw": "{{url}}/bootcamps/publisher/5c8a1d5b0190b214360dc032", + "host": [ + "{{url}}" + ], + "path": [ + "bootcamps", + "publisher", + "5c8a1d5b0190b214360dc032" + ] + }, + "description": "### Get All Bootcamps\n\nThis endpoint makes an HTTP GET request to retrieve a list of bootcamps.\n\n#### Request Body\n\nThis request does not require a request body.\n\n#### Response\n\n- Status: 429\n \n- Content-Type: text/html\n \n\n##### Example Response\n\n``` json\n{\n \"collections\": [\n {\n \"id\": \"\",\n \"name\": \"\",\n \"owner\": \"\",\n \"createdAt\": \"\",\n \"updatedAt\": \"\",\n \"uid\": \"\",\n \"isPublic\": true\n }\n ]\n}\n\n ```" + }, + "response": [ + { + "name": "Successful Response", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://api.getpostman.com/collections", + "protocol": "https", + "host": [ + "api", + "getpostman", + "com" + ], + "path": [ + "collections" + ], + "query": [ + { + "key": "workspace", + "value": "1f0df51a-8658-4ee8-a2a1-d2567dfa09a9", + "description": "Optional. A workspace ID.", + "disabled": true + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "description": { + "content": "", + "type": "text/plain" + } + } + ], + "cookie": [], + "body": "{\n \"collections\": [\n {\n \"id\": \"dac5eac9-148d-a32e-b76b-3edee9da28f7\",\n \"name\": \"Cloud API\",\n \"owner\": \"12345678\",\n \"createdAt\": \"2022-04-12T10:29:46.000Z\",\n \"updatedAt\": \"2022-04-12T10:29:56.000Z\",\n \"uid\": \"12345678-dac5eac9-148d-a32e-b76b-3edee9da28f7\",\n \"isPublic\": true\n },\n {\n \"id\": \"12ece9e1-2abf-4edc-8e34-de66e74114d2\",\n \"name\": \"Test Collection\",\n \"owner\": \"12345678\",\n \"createdAt\": \"2022-01-13T10:21:46.000Z\",\n \"updatedAt\": \"2022-02-12T11:29:56.000Z\",\n \"uid\": \"12345678-12ece9e1-2abf-4edc-8e34-de66e74114d2\",\n \"isPublic\": false,\n \"fork\": {\n \"label\": \"Test Fork\",\n \"createdAt\": \"2022-06-16T19:51:44.069Z\",\n \"from\": \"12345678-12ece9e1-2abf-4edc-8e34-de66e74114d2\"\n }\n },\n {\n \"id\": \"f695cab7-6878-eb55-7943-ad88e1ccfd65\",\n \"name\": \"Postman Echo\",\n \"owner\": \"12345678\",\n \"createdAt\": \"2021-04-11T09:18:26.000Z\",\n \"updatedAt\": \"2022-05-01T15:29:32.000Z\",\n \"uid\": \"12345678-f695cab7-6878-eb55-7943-ad88e1ccfd65\",\n \"isPublic\": true\n }\n ]\n}" + }, + { + "name": "Filter by Workspace", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://api.getpostman.com/collections?workspace=1f0df51a-8658-4ee8-a2a1-d2567dfa09a9", + "protocol": "https", + "host": [ + "api", + "getpostman", + "com" + ], + "path": [ + "collections" + ], + "query": [ + { + "key": "workspace", + "value": "1f0df51a-8658-4ee8-a2a1-d2567dfa09a9", + "description": "Optional. A workspace ID." + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "description": { + "content": "", + "type": "text/plain" + } + } + ], + "cookie": [], + "body": "{\n \"collections\": [\n {\n \"id\": \"dac5eac9-148d-a32e-b76b-3edee9da28f7\",\n \"name\": \"Cloud API\",\n \"owner\": \"12345678\",\n \"createdAt\": \"2022-04-12T10:29:46.000Z\",\n \"updatedAt\": \"2022-04-12T10:29:56.000Z\",\n \"uid\": \"12345678-dac5eac9-148d-a32e-b76b-3edee9da28f7\",\n \"isPublic\": true\n }\n ]\n}" + }, + { + "name": "Rate Limit Exceeded", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "https://api.getpostman.com/collections", + "protocol": "https", + "host": [ + "api", + "getpostman", + "com" + ], + "path": [ + "collections" + ], + "query": [ + { + "key": "workspace", + "value": "1f0df51a-8658-4ee8-a2a1-d2567dfa09a9", + "description": "Optional. A workspace ID.", + "disabled": true + } + ] + } + }, + "status": "Too Many Requests", + "code": 429, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "description": { + "content": "", + "type": "text/plain" + } + } + ], + "cookie": [], + "body": "{\n \"error\": \"rateLimited\",\n \"message\": \"Rate limit exceeded. Please retry after 1669048687\"\n}" + } + ] + }, + { + "name": "Get All Bootcamps Based on Search Text", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "" + ], + "type": "text/javascript", + "packages": {} + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/bootcamps/publisher/5c8a1d5b0190b214360dc032", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "publisher", "5c8a1d5b0190b214360dc032" @@ -388,13 +539,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/5d725a037b292f5f8ceff787", + "raw": "{{url}}/bootcamps/5d725a037b292f5f8ceff787", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d725a037b292f5f8ceff787" ] @@ -550,13 +699,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/66abc78ccdbd47b705e949f1", + "raw": "{{url}}/bootcamps/66abc78ccdbd47b705e949f1", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "66abc78ccdbd47b705e949f1" ] @@ -713,13 +860,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/66abc78ccdbd47b705e94xxx", + "raw": "{{url}}/bootcamps/66abc78ccdbd47b705e94xxx", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "66abc78ccdbd47b705e94xxx" ] @@ -897,13 +1042,11 @@ "raw": "{\n \"name\": \"Test Bootcamp 12\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -1172,13 +1315,11 @@ "raw": "{\n \"name\": \"Bootcamp ;\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -1437,13 +1578,11 @@ "raw": "" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -1702,13 +1841,11 @@ "raw": "{\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -1967,13 +2104,11 @@ "raw": "{\n \"name\": \"Dev\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -2232,13 +2367,11 @@ "raw": "{\n \"name\": \"DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -2497,13 +2630,11 @@ "raw": "{\n \"name\": \"DevOps Bootcamp\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -2762,13 +2893,11 @@ "raw": "{\n \"name\": \"DevOps Bootcamp\",\n \"description\": \"DevOps\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -3027,13 +3156,11 @@ "raw": "{\n \"name\": \"DevOps Bootcamp\",\n \"description\": \"A DevOps boot camp is an intensive training program designed to equip participants with the skills and knowledge necessary to implement and manage DevOps practices in their organizations. It covers core concepts such as the DevOps culture, collaboration, and the benefits of integrating development and operations teams. Participants learn technical skills in version control with Git, continuous integration (CI) using tools like Jenkins or CircleCI, and continuous deployment (CD) practices to automate the deployment of code changes. The boot camp aims to foster a deep understanding of automation, monitoring, and cloud services, preparing individuals to streamline software delivery processes and enhance organizational efficiency.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -3292,13 +3419,11 @@ "raw": "{\n \"name\": \"Modern DevOps Bootcamp 4\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"dummy\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -3557,13 +3682,11 @@ "raw": "{\n \"name\": \"DevOps Bootcamp\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -3822,13 +3945,11 @@ "raw": "{\n \"name\": \"DevOps Bootcamp\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7890\",\n \"email\": \"this is not an email\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps", + "raw": "{{url}}/bootcamps", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ] }, @@ -4095,13 +4216,11 @@ "raw": "{\n \"name\": \"Full Stack Developer Bootcamp\",\n \"description\": \"An intensive program to become a full stack developer.\",\n \"website\": \"https://example.com\",\n \"phone\": \"123-456-7890\",\n \"email\": \"info@example.com\",\n \"address\": \"123 Main St, Anytown, USA\",\n \"careers\": [\n \"Web Development\",\n \"Full Stack Development\",\n \"MERN\"\n ],\n \"photo\": \"no-photo.png\",\n \"housing\": false,\n \"jobAssistance\": true,\n \"jobGuarantee\": false,\n \"acceptGi\": true\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps/670fbb0f37abecfcd6f199e6", + "raw": "{{url}}/bootcamps/670fbb0f37abecfcd6f199e6", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "670fbb0f37abecfcd6f199e6" ] @@ -4446,13 +4565,11 @@ "raw": "{\n \"name\": \"Devworks Bootcamp ***\",\n \"description\": \"Devworks is a full stack JavaScript Bootcamp located in the heart of Boston that focuses on the technologies you need to get a high paying job as a web developer\",\n \"website\": \"https://devworks.com\",\n \"phone\": \"(111) 111-1111\",\n \"email\": \"enroll@devworks.com\",\n \"address\": \"233 Bay State Rd Boston MA 02215\",\n \"careers\": [\"Web Development\", \"UI/UX\", \"Business\"],\n \"housing\": true,\n \"jobAssistance\": true,\n \"jobGuarantee\": false,\n \"acceptGi\": true\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps/5d713995b721c3bb38c1f5d0", + "raw": "{{url}}/bootcamps/5d713995b721c3bb38c1f5d0", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d713995b721c3bb38c1f5d0" ] @@ -4797,13 +4914,11 @@ "raw": "{\n \"housing\": true\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps/670fbb0f37abecfcd6f199e6", + "raw": "{{url}}/bootcamps/670fbb0f37abecfcd6f199e6", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "670fbb0f37abecfcd6f199e6" ] @@ -5138,13 +5253,11 @@ "raw": "{\n \"name\": \"Full Stack Developer Bootcamp\",\n \"description\": \"An intensive program to become a full stack developer.\",\n \"website\": \"https://example.com\",\n \"phone\": \"123-456-7890\",\n \"email\": \"info@example.com\",\n \"address\": \"123 Main St, Anytown, USA\",\n \"careers\": [\n \"Web Development\",\n \"Full Stack Development\"\n ],\n \"photo\": \"no-photo.png\",\n \"housing\": false,\n \"jobAssistance\": true,\n \"jobGuarantee\": false,\n \"acceptGi\": true\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps/66abc78ccdbd47b705e949f1", + "raw": "{{url}}/bootcamps/66abc78ccdbd47b705e949f1", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "66abc78ccdbd47b705e949f1" ] @@ -5479,13 +5592,11 @@ "raw": "{\n \"name\": \"Full Stack Developer Bootcamp\",\n \"description\": \"An intensive program to become a full stack developer.\",\n \"website\": \"https://example.com\",\n \"phone\": \"123-456-7890\",\n \"email\": \"info@example.com\",\n \"address\": \"123 Main St, Anytown, USA\",\n \"careers\": [\n \"Web Development\",\n \"Full Stack Development\"\n ],\n \"photo\": \"no-photo.png\",\n \"housing\": false,\n \"jobAssistance\": true,\n \"jobGuarantee\": false,\n \"acceptGi\": true\n}" }, "url": { - "raw": "{{url}}/api/v1/bootcamps/66abc78ccdbd47b705e9xxx", + "raw": "{{url}}/bootcamps/66abc78ccdbd47b705e9xxx", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "66abc78ccdbd47b705e9xxx" ] @@ -5811,13 +5922,11 @@ "method": "DELETE", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/66ac8953cce31980156cf211", + "raw": "{{url}}/bootcamps/66ac8953cce31980156cf211", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "66ac8953cce31980156cf211" ] @@ -5951,13 +6060,11 @@ "method": "DELETE", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/5d713995b721c3bb38c1f5d0", + "raw": "{{url}}/bootcamps/5d713995b721c3bb38c1f5d0", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d713995b721c3bb38c1f5d0" ] @@ -6091,13 +6198,11 @@ "method": "DELETE", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/670fbae137abecfcd6f199d3", + "raw": "{{url}}/bootcamps/670fbae137abecfcd6f199d3", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "670fbae137abecfcd6f199d3" ] @@ -6231,13 +6336,11 @@ "method": "DELETE", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/66ac8953cce31980156cfxxx", + "raw": "{{url}}/bootcamps/66ac8953cce31980156cfxxx", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "66ac8953cce31980156cfxxx" ] @@ -6381,13 +6484,11 @@ "method": "DELETE", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/5d713995b721c3bb38c1f5d0", + "raw": "{{url}}/bootcamps/5d713995b721c3bb38c1f5d0", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d713995b721c3bb38c1f5d0" ] @@ -6530,13 +6631,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/bootcamps/testgeocode", + "raw": "{{url}}/bootcamps/testgeocode", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "testgeocode" ] @@ -6689,13 +6788,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/radius/02215/10", + "raw": "{{url}}/bootcamps/radius/02215/10", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "radius", "02215", @@ -6850,13 +6947,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps?location.city=Boston", + "raw": "{{url}}/bootcamps?location.city=Boston", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ], "query": [ @@ -7014,13 +7109,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps?careers[in]=Business", + "raw": "{{url}}/bootcamps?careers[in]=Business", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ], "query": [ @@ -7178,13 +7271,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps?housing=true", + "raw": "{{url}}/bootcamps?housing=true", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ], "query": [ @@ -7342,13 +7433,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps?averageCost[gt]=10000", + "raw": "{{url}}/bootcamps?averageCost[gt]=10000", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ], "query": [ @@ -7506,13 +7595,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps?averageCost[lte]=5000", + "raw": "{{url}}/bootcamps?averageCost[lte]=5000", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ], "query": [ @@ -7670,13 +7757,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps?select=name,description,housing", + "raw": "{{url}}/bootcamps?select=name,description,housing", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ], "query": [ @@ -7834,13 +7919,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps?select=name,createdAt&sort=name", + "raw": "{{url}}/bootcamps?select=name,createdAt&sort=name", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ], "query": [ @@ -8002,13 +8085,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps?select=name,createdAt&sort=-name", + "raw": "{{url}}/bootcamps?select=name,createdAt&sort=-name", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ], "query": [ @@ -8170,13 +8251,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps?limit=2&select=name", + "raw": "{{url}}/bootcamps?limit=2&select=name", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ], "query": [ @@ -8338,13 +8417,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps?page=1&limit=2&select=name", + "raw": "{{url}}/bootcamps?page=1&limit=2&select=name", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps" ], "query": [ @@ -8525,13 +8602,11 @@ ] }, "url": { - "raw": "{{url}}/api/v1/bootcamps/5d725a1b7b292f5f8ceff788/photo", + "raw": "{{url}}/bootcamps/5d725a1b7b292f5f8ceff788/photo", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d725a1b7b292f5f8ceff788", "photo" @@ -8873,13 +8948,11 @@ ] }, "url": { - "raw": "{{url}}/api/v1/bootcamps/5d725a1b7b292f5f8ceff788/photo", + "raw": "{{url}}/bootcamps/5d725a1b7b292f5f8ceff788/photo", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d725a1b7b292f5f8ceff788", "photo" @@ -9221,13 +9294,11 @@ ] }, "url": { - "raw": "{{url}}/api/v1/bootcamps/5d725a1b7b292f5f8ceff788/photo", + "raw": "{{url}}/bootcamps/5d725a1b7b292f5f8ceff788/photo", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d725a1b7b292f5f8ceff788", "photo" @@ -9579,13 +9650,11 @@ ] }, "url": { - "raw": "{{url}}/api/v1/bootcamps/5d725a1b7b292f5f8ceff788/photo", + "raw": "{{url}}/bootcamps/5d725a1b7b292f5f8ceff788/photo", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d725a1b7b292f5f8ceff788", "photo" @@ -9906,13 +9975,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/courses", + "raw": "{{url}}/courses", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "courses" ] } @@ -9925,15 +9992,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/670faa12c80944ccdbb62a2d/courses", + "raw": "{{url}}/bootcamps/5d726e9b7b292f5f8ceff800/courses", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", - "670faa12c80944ccdbb62a2d", + "5d726e9b7b292f5f8ceff800", "courses" ] } @@ -9946,13 +10011,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/courses/5d725a4a7b292f5f8ceff789", + "raw": "{{url}}/courses/5d725a4a7b292f5f8ceff789", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "courses", "5d725a4a7b292f5f8ceff789" ] @@ -9966,13 +10029,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/courses/5d713995b721c3bb38c1f5d1", + "raw": "{{url}}/courses/5d713995b721c3bb38c1f5d1", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "courses", "5d713995b721c3bb38c1f5d1" ] @@ -10005,13 +10066,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/bootcamps/670faa12c80944ccdbb62a2d/courses", + "raw": "{{url}}/bootcamps/670faa12c80944ccdbb62a2d/courses", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "670faa12c80944ccdbb62a2d", "courses" @@ -10045,13 +10104,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/bootcamps/670faa12c80944ccdbb62a2d/courses/670fbcea285b3c23dd7857a3", + "raw": "{{url}}/bootcamps/670faa12c80944ccdbb62a2d/courses/670fbcea285b3c23dd7857a3", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "670faa12c80944ccdbb62a2d", "courses", @@ -10086,13 +10143,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/bootcamps/5d725a037b292f5f8ceff787/courses/670fbcea285b3c23dd7857a3", + "raw": "{{url}}/bootcamps/5d725a037b292f5f8ceff787/courses/670fbcea285b3c23dd7857a3", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d725a037b292f5f8ceff787", "courses", @@ -10108,13 +10163,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/courses/?select=title", + "raw": "{{url}}/courses/?select=title", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "courses", "" ], @@ -10134,13 +10187,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/courses?page=2&limit=1", + "raw": "{{url}}/courses?page=2&limit=1", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "courses" ], "query": [ @@ -10168,13 +10219,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/reviews", + "raw": "{{url}}/reviews", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "reviews" ] }, @@ -10188,13 +10237,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/bootcamps/5d713a66ec8f2b88b8f830b8/reviews", + "raw": "{{url}}/bootcamps/5d713a66ec8f2b88b8f830b8/reviews", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d713a66ec8f2b88b8f830b8", "reviews" @@ -10210,18 +10257,16 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/reviews/5d7a514b5d2c12c7449be024", + "raw": "{{url}}/reviews/5d7a514b5d2c12c7449be024", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "reviews", "5d7a514b5d2c12c7449be024" ] }, - "description": "# Get Single Bootcamp Review\n\nThis endpoint retrieves a single review for a specific bootcamp by making an HTTP GET request to the endpoint `/api/v1/reviews/5d7a514b5d2c12c7449be024`.\n\n### Request Parameters\n\n- Path:\n \n - bootcampId (string, required) - The unique identifier of the bootcamp.\n \n\n### Response\n\n- success (boolean) - Indicates if the request was successful.\n \n- data (object) - An object containing the details of the review for the specified bootcamp, including:\n \n - _id (string) - The unique identifier of the review.\n \n - title (string) - The title of the review.\n \n - text (string) - The content of the review.\n \n - rating (number) - The rating given to the bootcamp.\n \n - bootcamp (object) - An object containing the details of the bootcamp for which the review is given, including:\n \n - _id (string) - The unique identifier of the bootcamp.\n \n - name (string) - The name of the bootcamp.\n \n - description (string) - The description of the bootcamp.\n \n - id (string) - The ID of the bootcamp.\n \n - user (string) - The user who submitted the review.\n \n - createdAt (string) - The date and time when the review was created.\n \n - updatedAt (string) - The date and time when the review was last updated.\n \n - __v (number) - Version key.\n \n\nExample Response:\n\n``` json\n{\n \"success\": true,\n \"data\": {\n \"_id\": \"\",\n \"title\": \"\",\n \"text\": \"\",\n \"rating\": 0,\n \"bootcamp\": {\n \"_id\": \"\",\n \"name\": \"\",\n \"description\": \"\",\n \"id\": \"\"\n },\n \"user\": \"\",\n \"createdAt\": \"\",\n \"updatedAt\": \"\",\n \"__v\": 0\n }\n}\n\n ```\n\nThis endpoint makes an HTTP GET request to retrieve the reviews for a specific bootcamp.\n\n### Request Parameters\n\n- Path:\n \n - bootcampId (string, required) - The unique identifier of the bootcamp.\n \n\n### Request Body\n\nThis request does not require a request body.\n\n### Response\n\nThe response returns a JSON object with the following properties:\n\n- success (boolean) - Indicates if the request was successful.\n \n- data (object) - An object containing the review details for the specified bootcamp. The properties include:\n \n - _id (string) - The unique identifier of the review.\n \n - title (string) - The title of the review.\n \n - text (string) - The text content of the review.\n \n - rating (number) - The rating given in the review.\n \n - bootcamp (object) - An object containing the details of the bootcamp for which the review is given. The properties include:\n \n - _id (string) - The unique identifier of the bootcamp.\n \n - name (string) - The name of the bootcamp.\n \n - description (string) - The description of the bootcamp.\n \n - id (string) - The ID of the bootcamp.\n \n - user (string) - The user associated with the review.\n \n - createdAt (string) - The date and time when the review was created.\n \n - updatedAt (string) - The date and time when the review was last updated.\n \n - __v (number) - Version key for optimistic concurrency control.\n \n\nExample Response:\n\n``` json\n{\n \"success\": true,\n \"data\": {\n \"_id\": \"\",\n \"title\": \"\",\n \"text\": \"\",\n \"rating\": 0,\n \"bootcamp\": {\n \"_id\": \"\",\n \"name\": \"\",\n \"description\": \"\",\n \"id\": \"\"\n },\n \"user\": \"\",\n \"createdAt\": \"\",\n \"updatedAt\": \"\",\n \"__v\": 0\n }\n}\n\n ```" + "description": "# Get Single Bootcamp Review\n\nThis endpoint retrieves a single review for a specific bootcamp by making an HTTP GET request to the endpoint `/reviews/5d7a514b5d2c12c7449be024`.\n\n### Request Parameters\n\n- Path:\n \n - bootcampId (string, required) - The unique identifier of the bootcamp.\n \n\n### Response\n\n- success (boolean) - Indicates if the request was successful.\n \n- data (object) - An object containing the details of the review for the specified bootcamp, including:\n \n - _id (string) - The unique identifier of the review.\n \n - title (string) - The title of the review.\n \n - text (string) - The content of the review.\n \n - rating (number) - The rating given to the bootcamp.\n \n - bootcamp (object) - An object containing the details of the bootcamp for which the review is given, including:\n \n - _id (string) - The unique identifier of the bootcamp.\n \n - name (string) - The name of the bootcamp.\n \n - description (string) - The description of the bootcamp.\n \n - id (string) - The ID of the bootcamp.\n \n - user (string) - The user who submitted the review.\n \n - createdAt (string) - The date and time when the review was created.\n \n - updatedAt (string) - The date and time when the review was last updated.\n \n - __v (number) - Version key.\n \n\nExample Response:\n\n``` json\n{\n \"success\": true,\n \"data\": {\n \"_id\": \"\",\n \"title\": \"\",\n \"text\": \"\",\n \"rating\": 0,\n \"bootcamp\": {\n \"_id\": \"\",\n \"name\": \"\",\n \"description\": \"\",\n \"id\": \"\"\n },\n \"user\": \"\",\n \"createdAt\": \"\",\n \"updatedAt\": \"\",\n \"__v\": 0\n }\n}\n\n ```\n\nThis endpoint makes an HTTP GET request to retrieve the reviews for a specific bootcamp.\n\n### Request Parameters\n\n- Path:\n \n - bootcampId (string, required) - The unique identifier of the bootcamp.\n \n\n### Request Body\n\nThis request does not require a request body.\n\n### Response\n\nThe response returns a JSON object with the following properties:\n\n- success (boolean) - Indicates if the request was successful.\n \n- data (object) - An object containing the review details for the specified bootcamp. The properties include:\n \n - _id (string) - The unique identifier of the review.\n \n - title (string) - The title of the review.\n \n - text (string) - The text content of the review.\n \n - rating (number) - The rating given in the review.\n \n - bootcamp (object) - An object containing the details of the bootcamp for which the review is given. The properties include:\n \n - _id (string) - The unique identifier of the bootcamp.\n \n - name (string) - The name of the bootcamp.\n \n - description (string) - The description of the bootcamp.\n \n - id (string) - The ID of the bootcamp.\n \n - user (string) - The user associated with the review.\n \n - createdAt (string) - The date and time when the review was created.\n \n - updatedAt (string) - The date and time when the review was last updated.\n \n - __v (number) - Version key for optimistic concurrency control.\n \n\nExample Response:\n\n``` json\n{\n \"success\": true,\n \"data\": {\n \"_id\": \"\",\n \"title\": \"\",\n \"text\": \"\",\n \"rating\": 0,\n \"bootcamp\": {\n \"_id\": \"\",\n \"name\": \"\",\n \"description\": \"\",\n \"id\": \"\"\n },\n \"user\": \"\",\n \"createdAt\": \"\",\n \"updatedAt\": \"\",\n \"__v\": 0\n }\n}\n\n ```" }, "response": [] }, @@ -10231,13 +10276,11 @@ "method": "GET", "header": [], "url": { - "raw": "{{url}}/api/v1/reviews/5d7a514b5d2c12c7449be111", + "raw": "{{url}}/reviews/5d7a514b5d2c12c7449be111", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "reviews", "5d7a514b5d2c12c7449be111" ] @@ -10261,13 +10304,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/bootcamps/5d713a66ec8f2b88b8f830b8/reviews", + "raw": "{{url}}/bootcamps/5d713a66ec8f2b88b8f830b8/reviews", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d713a66ec8f2b88b8f830b8", "reviews" @@ -10292,13 +10333,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/bootcamps/5d713a66ec8f2b88b8f830b8/reviews/66c3119794bb5dcce5537119", + "raw": "{{url}}/bootcamps/5d713a66ec8f2b88b8f830b8/reviews/66c3119794bb5dcce5537119", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d713a66ec8f2b88b8f830b8", "reviews", @@ -10324,13 +10363,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/bootcamps/5d713a66ec8f2b88b8f830b8/reviews/66c30fb28c8ea786fede63e4", + "raw": "{{url}}/bootcamps/5d713a66ec8f2b88b8f830b8/reviews/66c30fb28c8ea786fede63e4", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "bootcamps", "5d713a66ec8f2b88b8f830b8", "reviews", @@ -10383,13 +10420,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/register/", + "raw": "{{url}}/user/register/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "register", "" @@ -10413,13 +10448,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/register/", + "raw": "{{url}}/user/register/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "register", "" @@ -10443,13 +10476,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/register/", + "raw": "{{url}}/user/register/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "register", "" @@ -10473,13 +10504,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/register/", + "raw": "{{url}}/user/register/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "register", "" @@ -10503,13 +10532,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/register/", + "raw": "{{url}}/user/register/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "register", "" @@ -10533,13 +10560,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/register", + "raw": "{{url}}/user/register", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "register" ] @@ -10562,13 +10587,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/register", + "raw": "{{url}}/user/register", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "register" ] @@ -10613,13 +10636,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/login/", + "raw": "{{url}}/user/login/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "login", "" @@ -10665,13 +10686,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/login/", + "raw": "{{url}}/user/login/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "login", "" @@ -10717,13 +10736,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/login/", + "raw": "{{url}}/user/login/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "login", "" @@ -10747,13 +10764,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/login/", + "raw": "{{url}}/user/login/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "login", "" @@ -10777,13 +10792,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/login/", + "raw": "{{url}}/user/login/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "login", "" @@ -10820,13 +10833,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/me", + "raw": "{{url}}/user/me", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "me" ] @@ -10874,13 +10885,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/logout", + "raw": "{{url}}/user/logout", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "logout" ] @@ -10913,13 +10922,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/forgotpassword", + "raw": "{{url}}/user/forgotpassword", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "forgotpassword" ] @@ -10958,13 +10965,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/auth/resetpassword/b74159831f19b7f44727d76d6272e86f965286ff", + "raw": "{{url}}/auth/resetpassword/b74159831f19b7f44727d76d6272e86f965286ff", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "auth", "resetpassword", "b74159831f19b7f44727d76d6272e86f965286ff" @@ -11011,13 +11016,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/updatedetails", + "raw": "{{url}}/user/updatedetails", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "updatedetails" ] @@ -11063,13 +11066,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/updatepassword", + "raw": "{{url}}/user/updatepassword", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "updatepassword" ] @@ -11115,13 +11116,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/user/updatepassword", + "raw": "{{url}}/user/updatepassword", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "user", "updatepassword" ] @@ -11184,13 +11183,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/admin/users/", + "raw": "{{url}}/admin/users/", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "admin", "users", "" @@ -11249,13 +11246,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/admin/users/5d7a514b5d2c12c7449be044", + "raw": "{{url}}/admin/users/5d7a514b5d2c12c7449be044", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "admin", "users", "5d7a514b5d2c12c7449be044" @@ -11301,13 +11296,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/admin/users", + "raw": "{{url}}/admin/users", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "admin", "users" ] @@ -11362,13 +11355,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/admin/users/670fa412b59cda04e428d669", + "raw": "{{url}}/admin/users/670fa412b59cda04e428d669", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "admin", "users", "670fa412b59cda04e428d669" @@ -11424,13 +11415,11 @@ } }, "url": { - "raw": "{{url}}/api/v1/admin/users/670fa412b59cda04e428d669", + "raw": "{{url}}/admin/users/670fa412b59cda04e428d669", "host": [ "{{url}}" ], "path": [ - "api", - "v1", "admin", "users", "670fa412b59cda04e428d669" diff --git a/api/_postman/prod-environment.json b/postman/k8s-environment.json similarity index 61% rename from api/_postman/prod-environment.json rename to postman/k8s-environment.json index 3f36bec..5666a99 100644 --- a/api/_postman/prod-environment.json +++ b/postman/k8s-environment.json @@ -1,10 +1,10 @@ { "id": "986d5e6f-e8c8-4471-a8da-0378cd92bf77", - "name": "Production", + "name": "K8s", "values": [ { "key": "url", - "value": "http://devcamper.io", + "value": "http://devcamper.webapi/api/v1", "type": "default", "enabled": true }, @@ -16,6 +16,6 @@ } ], "_postman_variable_scope": "environment", - "_postman_exported_at": "2024-08-20T08:22:30.556Z", - "_postman_exported_using": "Postman/11.8.0" + "_postman_exported_at": "2024-10-25T18:53:55.968Z", + "_postman_exported_using": "Postman/11.18.0" } \ No newline at end of file diff --git a/api/.dockerignore b/src/webapi/.dockerignore similarity index 100% rename from api/.dockerignore rename to src/webapi/.dockerignore diff --git a/api/.env.example b/src/webapi/.env.example similarity index 100% rename from api/.env.example rename to src/webapi/.env.example diff --git a/api/Dockerfile b/src/webapi/Dockerfile similarity index 100% rename from api/Dockerfile rename to src/webapi/Dockerfile diff --git a/api/_data/bootcamps.json b/src/webapi/_data/bootcamps.json similarity index 100% rename from api/_data/bootcamps.json rename to src/webapi/_data/bootcamps.json diff --git a/api/_data/courses.json b/src/webapi/_data/courses.json similarity index 100% rename from api/_data/courses.json rename to src/webapi/_data/courses.json diff --git a/api/_data/reviews.json b/src/webapi/_data/reviews.json similarity index 100% rename from api/_data/reviews.json rename to src/webapi/_data/reviews.json diff --git a/api/_data/users.json b/src/webapi/_data/users.json similarity index 100% rename from api/_data/users.json rename to src/webapi/_data/users.json diff --git a/api/config/db.js b/src/webapi/config/db.js similarity index 100% rename from api/config/db.js rename to src/webapi/config/db.js diff --git a/api/config/env.js b/src/webapi/config/env.js similarity index 100% rename from api/config/env.js rename to src/webapi/config/env.js diff --git a/api/controllers/admin.js b/src/webapi/controllers/admin.js similarity index 100% rename from api/controllers/admin.js rename to src/webapi/controllers/admin.js diff --git a/api/controllers/bootcamps.js b/src/webapi/controllers/bootcamps.js similarity index 100% rename from api/controllers/bootcamps.js rename to src/webapi/controllers/bootcamps.js diff --git a/api/controllers/courses.js b/src/webapi/controllers/courses.js similarity index 100% rename from api/controllers/courses.js rename to src/webapi/controllers/courses.js diff --git a/api/controllers/reviews.js b/src/webapi/controllers/reviews.js similarity index 100% rename from api/controllers/reviews.js rename to src/webapi/controllers/reviews.js diff --git a/api/controllers/user.js b/src/webapi/controllers/user.js similarity index 98% rename from api/controllers/user.js rename to src/webapi/controllers/user.js index ff7110f..375e3ba 100644 --- a/api/controllers/user.js +++ b/src/webapi/controllers/user.js @@ -174,7 +174,7 @@ const sendTokenResponse = (user, statusCode, res) => { // Cookie options const options = { - expires: new Date(Date.now() + process.env.JWT_COOKIE_EXPIRE * 24 * 60 * 60 * 1000), // Convert to days + expires: new Date(Date.now() + process.env.jwt_cookie_expire * 24 * 60 * 60 * 1000), // Convert to days httpOnly: true, }; diff --git a/src/webapi/dockerize.sh b/src/webapi/dockerize.sh new file mode 100644 index 0000000..7e83fe6 --- /dev/null +++ b/src/webapi/dockerize.sh @@ -0,0 +1,2 @@ +docker build -t prasadhonrao/devcamper-webapi . +docker push prasadhonrao/devcamper-webapi \ No newline at end of file diff --git a/api/eslint.config.js b/src/webapi/eslint.config.js similarity index 100% rename from api/eslint.config.js rename to src/webapi/eslint.config.js diff --git a/api/middleware/advancedResults.js b/src/webapi/middleware/advancedResults.js similarity index 100% rename from api/middleware/advancedResults.js rename to src/webapi/middleware/advancedResults.js diff --git a/api/middleware/asyncHandler.js b/src/webapi/middleware/asyncHandler.js similarity index 100% rename from api/middleware/asyncHandler.js rename to src/webapi/middleware/asyncHandler.js diff --git a/api/middleware/auth.js b/src/webapi/middleware/auth.js similarity index 95% rename from api/middleware/auth.js rename to src/webapi/middleware/auth.js index 2ce1bc4..8b295dd 100644 --- a/api/middleware/auth.js +++ b/src/webapi/middleware/auth.js @@ -20,7 +20,7 @@ const protect = asyncHandler(async (req, res, next) => { try { // Verify token - const decoded = jwt.verify(token, process.env.JWT_SECRET); + const decoded = jwt.verify(token, process.env.jwt_secret); // Find user by id and set it to req.user so that we can use it in the controller req.user = await User.findById(decoded.id).select('-password'); // This is the id from JWT payload diff --git a/api/middleware/errorHandler.js b/src/webapi/middleware/errorHandler.js similarity index 92% rename from api/middleware/errorHandler.js rename to src/webapi/middleware/errorHandler.js index 630ea02..e19f1e6 100644 --- a/api/middleware/errorHandler.js +++ b/src/webapi/middleware/errorHandler.js @@ -4,6 +4,9 @@ function errorHandler(err, req, res, next) { let error = { ...err }; error.message = err.message; + // Log to console for dev + console.log(`Error: ${err.stack}`.red); + // Mongoose bad ObjectId if (err.name === 'CastError') { const message = `Resource not found with id of ${err.value}`; diff --git a/api/models/Bootcamp.js b/src/webapi/models/Bootcamp.js similarity index 100% rename from api/models/Bootcamp.js rename to src/webapi/models/Bootcamp.js diff --git a/api/models/Course.js b/src/webapi/models/Course.js similarity index 100% rename from api/models/Course.js rename to src/webapi/models/Course.js diff --git a/api/models/Review.js b/src/webapi/models/Review.js similarity index 100% rename from api/models/Review.js rename to src/webapi/models/Review.js diff --git a/api/models/User.js b/src/webapi/models/User.js similarity index 96% rename from api/models/User.js rename to src/webapi/models/User.js index 38a6273..ec9414e 100644 --- a/api/models/User.js +++ b/src/webapi/models/User.js @@ -52,9 +52,9 @@ UserSchema.methods.getSignedJwtToken = function () { { id: this._id, }, - process.env.JWT_SECRET, + process.env.jwt_secret, { - expiresIn: process.env.JWT_EXPIRE, + expiresIn: process.env.jwt_expire, } ); }; diff --git a/api/package-lock.json b/src/webapi/package-lock.json similarity index 100% rename from api/package-lock.json rename to src/webapi/package-lock.json diff --git a/api/package.json b/src/webapi/package.json similarity index 100% rename from api/package.json rename to src/webapi/package.json diff --git a/api/public/uploads/photo_5d725a1b7b292f5f8ceff788.jpg b/src/webapi/public/uploads/photo_5d725a1b7b292f5f8ceff788.jpg similarity index 100% rename from api/public/uploads/photo_5d725a1b7b292f5f8ceff788.jpg rename to src/webapi/public/uploads/photo_5d725a1b7b292f5f8ceff788.jpg diff --git a/api/routes/admin.js b/src/webapi/routes/admin.js similarity index 100% rename from api/routes/admin.js rename to src/webapi/routes/admin.js diff --git a/api/routes/bootcamps.js b/src/webapi/routes/bootcamps.js similarity index 100% rename from api/routes/bootcamps.js rename to src/webapi/routes/bootcamps.js diff --git a/api/routes/courses.js b/src/webapi/routes/courses.js similarity index 100% rename from api/routes/courses.js rename to src/webapi/routes/courses.js diff --git a/api/routes/home.js b/src/webapi/routes/home.js similarity index 100% rename from api/routes/home.js rename to src/webapi/routes/home.js diff --git a/api/routes/reviews.js b/src/webapi/routes/reviews.js similarity index 100% rename from api/routes/reviews.js rename to src/webapi/routes/reviews.js diff --git a/api/routes/user.js b/src/webapi/routes/user.js similarity index 100% rename from api/routes/user.js rename to src/webapi/routes/user.js diff --git a/api/seeder.js b/src/webapi/seeder.js similarity index 100% rename from api/seeder.js rename to src/webapi/seeder.js diff --git a/api/server.js b/src/webapi/server.js similarity index 91% rename from api/server.js rename to src/webapi/server.js index 7adb732..812ec42 100644 --- a/api/server.js +++ b/src/webapi/server.js @@ -36,8 +36,11 @@ app.use(mongoSanitize()); // Sanitize data app.use(helmet()); // Set security headers app.use(xss()); // Prevent cross site scripting attacks -const rateLimitMax = process.env.RATE_LIMIT_MAX || 100; -const rateLimitWindowMs = process.env.RATE_LIMIT_WINDOW_MS || 15 * 60 * 1000; // Default to 15 minutes +// Trust the proxies +app.set('trust proxy', 1); + +const rateLimitMax = process.env.rate_limit_max || 100; +const rateLimitWindowMs = process.env.rate_limit_window || 15 * 60 * 1000; // Default to 15 minutes const limiter = rateLimit({ windowMs: rateLimitWindowMs, // Use environment variable or default to 15 minutes diff --git a/api/tests/unit/sample.unit.test.js b/src/webapi/tests/unit/sample.unit.test.js similarity index 100% rename from api/tests/unit/sample.unit.test.js rename to src/webapi/tests/unit/sample.unit.test.js diff --git a/api/utils/errorResponse.js b/src/webapi/utils/errorResponse.js similarity index 100% rename from api/utils/errorResponse.js rename to src/webapi/utils/errorResponse.js diff --git a/api/utils/geocoder.js b/src/webapi/utils/geocoder.js similarity index 100% rename from api/utils/geocoder.js rename to src/webapi/utils/geocoder.js diff --git a/api/utils/sendEmail.js b/src/webapi/utils/sendEmail.js similarity index 71% rename from api/utils/sendEmail.js rename to src/webapi/utils/sendEmail.js index 7a9c643..98bbc89 100644 --- a/api/utils/sendEmail.js +++ b/src/webapi/utils/sendEmail.js @@ -4,18 +4,18 @@ import loadEnvironmentConfig from '../config/env.js'; loadEnvironmentConfig(); const transporter = nodemailer.createTransport({ - host: process.env.SMTP_HOST, - port: process.env.SMTP_PORT, + host: process.env.smtp_host, + port: process.env.smtp_port, secure: false, auth: { - user: process.env.SMTP_EMAIL, - pass: process.env.SMTP_PASSWORD, + user: process.env.smtp_email, + pass: process.env.smtp_password, }, }); const sendEmail = async (options) => { const message = { - from: `${process.env.FROM_NAME}<${process.env.FROM_EMAIL}>`, // sender address + from: `${process.env.from_name}<${process.env.from_email}>`, // sender address to: options.email, // list of receivers subject: options.subject, // Subject line text: options.message, // plain text body diff --git a/ui/.gitignore b/src/webapp/.gitignore similarity index 100% rename from ui/.gitignore rename to src/webapp/.gitignore diff --git a/ui/Dockerfile b/src/webapp/Dockerfile similarity index 62% rename from ui/Dockerfile rename to src/webapp/Dockerfile index fbdedf5..1548e35 100644 --- a/ui/Dockerfile +++ b/src/webapp/Dockerfile @@ -1,5 +1,5 @@ -# Use the official Node.js image as the base image -FROM node:14-alpine +# Stage 1: Build the React application +FROM node:14 AS build # Set the working directory WORKDIR /app @@ -20,11 +20,20 @@ ENV REACT_APP_DEVCAMPER_BASE_API_URI=${REACT_APP_DEVCAMPER_BASE_API_URI} # Build the React application RUN npm run build +# Stage 2: Serve the React application +FROM node:14 AS serve + # Install a simple HTTP server to serve the static files RUN npm install -g serve +# Set the working directory +WORKDIR /app + +# Copy the build artifacts from the previous stage +COPY --from=build /app/build ./build + # Expose the port the app runs on EXPOSE 3000 -# Start the application -CMD ["serve", "-s", "build", "-l", "3000"] \ No newline at end of file +# Serve the React application +CMD ["serve", "-s", "build"] \ No newline at end of file diff --git a/src/webapp/dockerize.sh b/src/webapp/dockerize.sh new file mode 100644 index 0000000..ae4d952 --- /dev/null +++ b/src/webapp/dockerize.sh @@ -0,0 +1,2 @@ +docker build -t prasadhonrao/devcamper-webapp . +docker push prasadhonrao/devcamper-webapp \ No newline at end of file diff --git a/ui/eslint.config.mjs b/src/webapp/eslint.config.mjs similarity index 100% rename from ui/eslint.config.mjs rename to src/webapp/eslint.config.mjs diff --git a/ui/package-lock.json b/src/webapp/package-lock.json similarity index 99% rename from ui/package-lock.json rename to src/webapp/package-lock.json index a9f6ee1..f337d9b 100644 --- a/ui/package-lock.json +++ b/src/webapp/package-lock.json @@ -1,11 +1,11 @@ { - "name": "devcamper-ui", + "name": "devcamper-webapp", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "devcamper-ui", + "name": "devcamper-webapp", "version": "1.0.0", "dependencies": { "bootstrap": "^5.3.3", diff --git a/ui/package.json b/src/webapp/package.json similarity index 97% rename from ui/package.json rename to src/webapp/package.json index 2c33f40..9f7dab0 100644 --- a/ui/package.json +++ b/src/webapp/package.json @@ -1,5 +1,5 @@ { - "name": "devcamper-ui", + "name": "devcamper-webapp", "version": "1.0.0", "private": true, "dependencies": { diff --git a/src/webapp/public/config/config.json b/src/webapp/public/config/config.json new file mode 100644 index 0000000..33af519 --- /dev/null +++ b/src/webapp/public/config/config.json @@ -0,0 +1,8 @@ +{ + "development": { + "react_app_devcamper_base_api_uri": "http://localhost:5000/api/v1" + }, + "production": { + "react_app_devcamper_base_api_uri": "http://devcamper.webapi/api/v1" + } +} diff --git a/ui/public/favicon.ico b/src/webapp/public/favicon.ico similarity index 100% rename from ui/public/favicon.ico rename to src/webapp/public/favicon.ico diff --git a/assets/html/img/image_1.jpg b/src/webapp/public/images/image_1.jpg similarity index 100% rename from assets/html/img/image_1.jpg rename to src/webapp/public/images/image_1.jpg diff --git a/assets/html/img/image_2.jpg b/src/webapp/public/images/image_2.jpg similarity index 100% rename from assets/html/img/image_2.jpg rename to src/webapp/public/images/image_2.jpg diff --git a/assets/html/img/image_3.jpg b/src/webapp/public/images/image_3.jpg similarity index 100% rename from assets/html/img/image_3.jpg rename to src/webapp/public/images/image_3.jpg diff --git a/assets/html/img/image_4.jpg b/src/webapp/public/images/image_4.jpg similarity index 100% rename from assets/html/img/image_4.jpg rename to src/webapp/public/images/image_4.jpg diff --git a/ui/public/images/no-photo.png b/src/webapp/public/images/no-photo.png similarity index 100% rename from ui/public/images/no-photo.png rename to src/webapp/public/images/no-photo.png diff --git a/ui/public/images/photo_5d726e0b7b292f5f8ceff798.jpeg b/src/webapp/public/images/photo_5d726e0b7b292f5f8ceff798.jpeg similarity index 100% rename from ui/public/images/photo_5d726e0b7b292f5f8ceff798.jpeg rename to src/webapp/public/images/photo_5d726e0b7b292f5f8ceff798.jpeg diff --git a/ui/public/images/photo_5d726e9b7b292f5f8ceff800.jpeg b/src/webapp/public/images/photo_5d726e9b7b292f5f8ceff800.jpeg similarity index 100% rename from ui/public/images/photo_5d726e9b7b292f5f8ceff800.jpeg rename to src/webapp/public/images/photo_5d726e9b7b292f5f8ceff800.jpeg diff --git a/assets/html/img/showcase.jpg b/src/webapp/public/images/showcase.jpg similarity index 100% rename from assets/html/img/showcase.jpg rename to src/webapp/public/images/showcase.jpg diff --git a/ui/public/index.html b/src/webapp/public/index.html similarity index 100% rename from ui/public/index.html rename to src/webapp/public/index.html diff --git a/ui/public/logo.png b/src/webapp/public/logo.png similarity index 100% rename from ui/public/logo.png rename to src/webapp/public/logo.png diff --git a/ui/public/robots.txt b/src/webapp/public/robots.txt similarity index 100% rename from ui/public/robots.txt rename to src/webapp/public/robots.txt diff --git a/ui/src/App.js b/src/webapp/src/App.js similarity index 100% rename from ui/src/App.js rename to src/webapp/src/App.js diff --git a/ui/src/bootstrap.css b/src/webapp/src/bootstrap.css similarity index 100% rename from ui/src/bootstrap.css rename to src/webapp/src/bootstrap.css diff --git a/ui/src/components/Bootcamp.jsx b/src/webapp/src/components/Bootcamp.jsx similarity index 100% rename from ui/src/components/Bootcamp.jsx rename to src/webapp/src/components/Bootcamp.jsx diff --git a/ui/src/components/Footer.jsx b/src/webapp/src/components/Footer.jsx similarity index 100% rename from ui/src/components/Footer.jsx rename to src/webapp/src/components/Footer.jsx diff --git a/ui/src/components/Header.jsx b/src/webapp/src/components/Header.jsx similarity index 100% rename from ui/src/components/Header.jsx rename to src/webapp/src/components/Header.jsx diff --git a/ui/src/components/Layout.jsx b/src/webapp/src/components/Layout.jsx similarity index 100% rename from ui/src/components/Layout.jsx rename to src/webapp/src/components/Layout.jsx diff --git a/ui/src/components/Pagination.jsx b/src/webapp/src/components/Pagination.jsx similarity index 100% rename from ui/src/components/Pagination.jsx rename to src/webapp/src/components/Pagination.jsx diff --git a/ui/src/components/index.js b/src/webapp/src/components/index.js similarity index 100% rename from ui/src/components/index.js rename to src/webapp/src/components/index.js diff --git a/ui/src/contexts/AuthContext.js b/src/webapp/src/contexts/AuthContext.js similarity index 100% rename from ui/src/contexts/AuthContext.js rename to src/webapp/src/contexts/AuthContext.js diff --git a/ui/src/helpers/NumberFormat.js b/src/webapp/src/helpers/NumberFormat.js similarity index 100% rename from ui/src/helpers/NumberFormat.js rename to src/webapp/src/helpers/NumberFormat.js diff --git a/ui/src/helpers/auth.js b/src/webapp/src/helpers/auth.js similarity index 100% rename from ui/src/helpers/auth.js rename to src/webapp/src/helpers/auth.js diff --git a/ui/src/index.css b/src/webapp/src/index.css similarity index 100% rename from ui/src/index.css rename to src/webapp/src/index.css diff --git a/ui/src/index.js b/src/webapp/src/index.js similarity index 100% rename from ui/src/index.js rename to src/webapp/src/index.js diff --git a/ui/src/pages/AboutPage.jsx b/src/webapp/src/pages/AboutPage.jsx similarity index 100% rename from ui/src/pages/AboutPage.jsx rename to src/webapp/src/pages/AboutPage.jsx diff --git a/ui/src/pages/HomePage.jsx b/src/webapp/src/pages/HomePage.jsx similarity index 100% rename from ui/src/pages/HomePage.jsx rename to src/webapp/src/pages/HomePage.jsx diff --git a/ui/src/pages/NotFoundPage.jsx b/src/webapp/src/pages/NotFoundPage.jsx similarity index 100% rename from ui/src/pages/NotFoundPage.jsx rename to src/webapp/src/pages/NotFoundPage.jsx diff --git a/ui/src/pages/bootcamps/AddBootcampPage.jsx b/src/webapp/src/pages/bootcamps/AddBootcampPage.jsx similarity index 100% rename from ui/src/pages/bootcamps/AddBootcampPage.jsx rename to src/webapp/src/pages/bootcamps/AddBootcampPage.jsx diff --git a/ui/src/pages/bootcamps/AddCoursePage.jsx b/src/webapp/src/pages/bootcamps/AddCoursePage.jsx similarity index 100% rename from ui/src/pages/bootcamps/AddCoursePage.jsx rename to src/webapp/src/pages/bootcamps/AddCoursePage.jsx diff --git a/src/webapp/src/pages/bootcamps/AddReviewPage.jsx b/src/webapp/src/pages/bootcamps/AddReviewPage.jsx new file mode 100644 index 0000000..cc3483b --- /dev/null +++ b/src/webapp/src/pages/bootcamps/AddReviewPage.jsx @@ -0,0 +1,67 @@ +import React, { useState } from 'react'; +import { Link, useParams } from 'react-router-dom'; +import { Form, Button, Container, Row, Col, Card } from 'react-bootstrap'; +import { AiOutlineLeft } from 'react-icons/ai'; + +const AddReviewPage = () => { + const { bootcampId } = useParams(); // Get bootcampId from URL parameters + const [rating, setRating] = useState(8); + + const handleRatingChange = (event) => { + setRating(event.target.value); + }; + + return ( +
+ + + + + + + Bootcamp Info + + +

DevWorks Bootcamp

+

Write a Review

+

You must have attended and graduated this bootcamp to review.

+
+
+ + + Rating: {rating} + + + + + + + + + + + + + +
+
+
+ +
+
+
+ ); +}; + +export default AddReviewPage; diff --git a/ui/src/pages/bootcamps/BootcampDetailsPage.jsx b/src/webapp/src/pages/bootcamps/BootcampDetailsPage.jsx similarity index 100% rename from ui/src/pages/bootcamps/BootcampDetailsPage.jsx rename to src/webapp/src/pages/bootcamps/BootcampDetailsPage.jsx diff --git a/ui/src/pages/bootcamps/BootcampReviewsPage.jsx b/src/webapp/src/pages/bootcamps/BootcampReviewsPage.jsx similarity index 100% rename from ui/src/pages/bootcamps/BootcampReviewsPage.jsx rename to src/webapp/src/pages/bootcamps/BootcampReviewsPage.jsx diff --git a/ui/src/pages/bootcamps/BootcampsPage.jsx b/src/webapp/src/pages/bootcamps/BootcampsPage.jsx similarity index 100% rename from ui/src/pages/bootcamps/BootcampsPage.jsx rename to src/webapp/src/pages/bootcamps/BootcampsPage.jsx diff --git a/ui/src/pages/bootcamps/ManageBootcampPage.jsx b/src/webapp/src/pages/bootcamps/ManageBootcampPage.jsx similarity index 100% rename from ui/src/pages/bootcamps/ManageBootcampPage.jsx rename to src/webapp/src/pages/bootcamps/ManageBootcampPage.jsx diff --git a/ui/src/pages/bootcamps/ManageBootcampsPage.jsx b/src/webapp/src/pages/bootcamps/ManageBootcampsPage.jsx similarity index 100% rename from ui/src/pages/bootcamps/ManageBootcampsPage.jsx rename to src/webapp/src/pages/bootcamps/ManageBootcampsPage.jsx diff --git a/ui/src/pages/bootcamps/ManageCoursesPage.jsx b/src/webapp/src/pages/bootcamps/ManageCoursesPage.jsx similarity index 100% rename from ui/src/pages/bootcamps/ManageCoursesPage.jsx rename to src/webapp/src/pages/bootcamps/ManageCoursesPage.jsx diff --git a/src/webapp/src/pages/bootcamps/ManageReviewsPage.jsx b/src/webapp/src/pages/bootcamps/ManageReviewsPage.jsx new file mode 100644 index 0000000..019d075 --- /dev/null +++ b/src/webapp/src/pages/bootcamps/ManageReviewsPage.jsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Table, Container, Row, Col, Card, Button } from 'react-bootstrap'; +import { GrEdit, GrClose } from 'react-icons/gr'; + +const bootcamps = [ + { + id: 1, + name: 'DevWorks Bootcamp', + rating: 10, + }, + { + id: 2, + name: 'AI Bootcamp', + rating: 8, + }, +]; + +const ManageReviewsPage = () => { + return ( + + + + + +

Manage Reviews

+ + + + + + + + + + {bootcamps.map((b) => ( + + + + + + ))} + +
BootcampRating
{b.name}{b.rating} + + + + +
+
+
+ +
+
+ ); +}; + +export default ManageReviewsPage; diff --git a/ui/src/pages/bootcamps/index.js b/src/webapp/src/pages/bootcamps/index.js similarity index 100% rename from ui/src/pages/bootcamps/index.js rename to src/webapp/src/pages/bootcamps/index.js diff --git a/ui/src/pages/index.js b/src/webapp/src/pages/index.js similarity index 100% rename from ui/src/pages/index.js rename to src/webapp/src/pages/index.js diff --git a/ui/src/pages/user/LoginPage.jsx b/src/webapp/src/pages/user/LoginPage.jsx similarity index 100% rename from ui/src/pages/user/LoginPage.jsx rename to src/webapp/src/pages/user/LoginPage.jsx diff --git a/ui/src/pages/user/ManageAccountPage.jsx b/src/webapp/src/pages/user/ManageAccountPage.jsx similarity index 100% rename from ui/src/pages/user/ManageAccountPage.jsx rename to src/webapp/src/pages/user/ManageAccountPage.jsx diff --git a/ui/src/pages/user/RegisterPage.jsx b/src/webapp/src/pages/user/RegisterPage.jsx similarity index 100% rename from ui/src/pages/user/RegisterPage.jsx rename to src/webapp/src/pages/user/RegisterPage.jsx diff --git a/src/webapp/src/pages/user/ResetPasswordPage.jsx b/src/webapp/src/pages/user/ResetPasswordPage.jsx new file mode 100644 index 0000000..d4db4a1 --- /dev/null +++ b/src/webapp/src/pages/user/ResetPasswordPage.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Form, Button, Container, Row, Col, Card } from 'react-bootstrap'; + +const ResetPasswordPage = () => { + return ( + + + + + + Back to login + +

Reset Password

+

Use this form to reset your password using the registered email address.

+ +
+ {/* Email Input Section*/} + + Enter Email + + + + {/* Submit Button */} + +
+
+
+ +
+
+ ); +}; + +export default ResetPasswordPage; diff --git a/src/webapp/src/pages/user/UpdatePasswordPage.jsx b/src/webapp/src/pages/user/UpdatePasswordPage.jsx new file mode 100644 index 0000000..c8c1963 --- /dev/null +++ b/src/webapp/src/pages/user/UpdatePasswordPage.jsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { Form, Button, Container, Row, Col, Card } from 'react-bootstrap'; + +const UpdatePasswordPage = () => { + return ( + + + + + +

Update Password

+
+ {/* Current Password */} + + Current Password + + + + {/* New Password */} + + New Password + + + + {/* Confirm New Password */} + + Confirm New Password + + + + {/* Submit Button */} + + + +
+
+
+ +
+
+ ); +}; + +export default UpdatePasswordPage; diff --git a/ui/src/pages/user/index.js b/src/webapp/src/pages/user/index.js similarity index 100% rename from ui/src/pages/user/index.js rename to src/webapp/src/pages/user/index.js diff --git a/ui/src/routes/ProtectedRoute.js b/src/webapp/src/routes/ProtectedRoute.js similarity index 100% rename from ui/src/routes/ProtectedRoute.js rename to src/webapp/src/routes/ProtectedRoute.js diff --git a/ui/src/services/adminService.js b/src/webapp/src/services/adminService.js similarity index 65% rename from ui/src/services/adminService.js rename to src/webapp/src/services/adminService.js index 74478d8..058d40d 100644 --- a/ui/src/services/adminService.js +++ b/src/webapp/src/services/adminService.js @@ -1,8 +1,9 @@ -const API_BASE_URI = process.env.REACT_APP_DEVCAMPER_BASE_API_URI + '/admin'; +import { fetchApiEndPoint } from '../utils/configService'; const adminService = { getUsers: async () => { - const res = await fetch(`${API_BASE_URI}/users`); + const uri = await fetchApiEndPoint(`/admin/users`); + const res = await fetch(uri); if (!res.ok) { throw new Error('Failed to fetch users'); } @@ -10,7 +11,8 @@ const adminService = { }, getUser: async (id) => { - const res = await fetch(`${API_BASE_URI}/users/${id}`); + const uri = await fetchApiEndPoint(`/admin/users/${id}`); + const res = await fetch(uri); if (!res.ok) { throw new Error('Failed to fetch user'); } @@ -18,7 +20,8 @@ const adminService = { }, createUser: async (user) => { - const res = await fetch(`${API_BASE_URI}/users`, { + const uri = await fetchApiEndPoint(`/admin/users`); + const res = await fetch(uri, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -32,7 +35,8 @@ const adminService = { }, updateUser: async (id, user) => { - const res = await fetch(`${API_BASE_URI}/users/${id}`, { + const uri = await fetchApiEndPoint(`/admin/users/${id}`); + const res = await fetch(uri, { method: 'PUT', headers: { 'Content-Type': 'application/json', @@ -46,7 +50,8 @@ const adminService = { }, deleteUser: async (id) => { - const res = await fetch(`${API_BASE_URI}/users/${id}`, { + const uri = await fetchApiEndPoint(`/admin/users/${id}`); + const res = await fetch(uri, { method: 'DELETE', }); if (!res.ok) { diff --git a/ui/src/services/bootcampService.js b/src/webapp/src/services/bootcampService.js similarity index 64% rename from ui/src/services/bootcampService.js rename to src/webapp/src/services/bootcampService.js index 77718dd..2b48ba1 100644 --- a/ui/src/services/bootcampService.js +++ b/src/webapp/src/services/bootcampService.js @@ -1,19 +1,21 @@ import { getAuthHeaders } from '../helpers/auth'; - -const API_BASE_URI = process.env.REACT_APP_DEVCAMPER_BASE_API_URI; +import { fetchApiEndPoint } from '../utils/configService'; const bootcampService = { getBootcamps: async (fields) => { const query = fields ? `?select=${fields.join(',')}` : ''; - const res = await fetch(`${API_BASE_URI}/bootcamps${query}`); + const uri = await fetchApiEndPoint(`/bootcamps${query}`); + const res = await fetch(uri); if (!res.ok) { + console.log(`Failed to fetch bootcamps: ${res.status}`); throw new Error('Failed to fetch bootcamps'); } return res.json(); }, getBootcampsByPublisher: async (publisherId) => { - const res = await fetch(`${API_BASE_URI}/bootcamps/publisher/${publisherId}`, { + const uri = await fetchApiEndPoint(`/bootcamps/publisher/${publisherId}`); + const res = await fetch(uri, { headers: getAuthHeaders(), }); if (!res.ok) { @@ -23,7 +25,8 @@ const bootcampService = { }, getBootcamp: async (id) => { - const res = await fetch(`${API_BASE_URI}/bootcamps/${id}`); + const uri = await fetchApiEndPoint(`/bootcamps/${id}`); + const res = await fetch(uri); if (!res.ok) { throw new Error('Failed to fetch bootcamp'); } @@ -31,7 +34,8 @@ const bootcampService = { }, createBootcamp: async (bootcamp) => { - const res = await fetch(`${API_BASE_URI}/bootcamps`, { + const uri = await fetchApiEndPoint(`/bootcamps`); + const res = await fetch(uri, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -45,7 +49,8 @@ const bootcampService = { }, updateBootcamp: async (id, bootcamp) => { - const res = await fetch(`${API_BASE_URI}/bootcamps/${id}`, { + const uri = await fetchApiEndPoint(`/bootcamps/${id}`); + const res = await fetch(uri, { method: 'PUT', headers: { 'Content-Type': 'application/json', @@ -59,7 +64,8 @@ const bootcampService = { }, deleteBootcamp: async (id) => { - const res = await fetch(`${API_BASE_URI}/bootcamps/${id}`, { + const uri = await fetchApiEndPoint(`/bootcamps/${id}`); + const res = await fetch(uri, { method: 'DELETE', }); if (!res.ok) { @@ -69,7 +75,8 @@ const bootcampService = { }, getBootcampsInRadius: async (zipcode, distance) => { - const res = await fetch(`${API_BASE_URI}/bootcamps/radius/${zipcode}/${distance}`); + const uri = await fetchApiEndPoint(`/bootcamps/radius/${zipcode}/${distance}`); + const res = await fetch(uri); if (!res.ok) { throw new Error('Failed to fetch bootcamps in radius'); } @@ -77,7 +84,8 @@ const bootcampService = { }, getCoursesByBootcampId: async (bootcampId) => { - const res = await fetch(`${API_BASE_URI}/bootcamps/${bootcampId}/courses`); + const uri = await fetchApiEndPoint(`/bootcamps/${bootcampId}/courses`); + const res = await fetch(uri); if (!res.ok) { throw new Error('Failed to fetch bootcamp courses'); } diff --git a/ui/src/services/courseService.js b/src/webapp/src/services/courseService.js similarity index 67% rename from ui/src/services/courseService.js rename to src/webapp/src/services/courseService.js index c2ba922..4107733 100644 --- a/ui/src/services/courseService.js +++ b/src/webapp/src/services/courseService.js @@ -1,8 +1,9 @@ -const API_BASE_URI = process.env.REACT_APP_DEVCAMPER_BASE_API_URI + '/courses'; +import { fetchApiEndPoint } from '../utils/configService'; const courseService = { getCourses: async () => { - const res = await fetch(`${API_BASE_URI}/`); + const uri = await fetchApiEndPoint(`/courses`); + const res = await fetch(uri); if (!res.ok) { throw new Error('Failed to fetch courses'); } @@ -10,7 +11,8 @@ const courseService = { }, getCourse: async (courseId) => { - const res = await fetch(`${API_BASE_URI}/${courseId}`); + const uri = await fetchApiEndPoint(`/courses/${courseId}`); + const res = await fetch(uri); if (!res.ok) { throw new Error('Failed to fetch course'); } @@ -18,7 +20,8 @@ const courseService = { }, createCourse: async (bootcampId, course, token) => { - const res = await fetch(`${API_BASE_URI}/bootcamps/${bootcampId}/`, { + const uri = await fetchApiEndPoint(`/courses/bootcamps/${bootcampId}/`); + const res = await fetch(uri, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -33,7 +36,8 @@ const courseService = { }, updateCourse: async (courseId, course) => { - const res = await fetch(`${API_BASE_URI}/${courseId}`, { + const uri = await fetchApiEndPoint(`/courses/${courseId}`); + const res = await fetch(uri, { method: 'PUT', headers: { 'Content-Type': 'application/json', @@ -47,7 +51,8 @@ const courseService = { }, deleteCourse: async (courseId) => { - const res = await fetch(`${API_BASE_URI}/${courseId}`, { + const uri = await fetchApiEndPoint(`/courses/${courseId}`); + const res = await fetch(uri, { method: 'DELETE', }); if (!res.ok) { diff --git a/ui/src/services/reviewService.js b/src/webapp/src/services/reviewService.js similarity index 65% rename from ui/src/services/reviewService.js rename to src/webapp/src/services/reviewService.js index ee59f5d..7235c9f 100644 --- a/ui/src/services/reviewService.js +++ b/src/webapp/src/services/reviewService.js @@ -1,8 +1,9 @@ -const API_BASE_URI = process.env.REACT_APP_DEVCAMPER_BASE_API_URI; +import { fetchApiEndPoint } from '../utils/configService'; const reviewService = { getReviewsByBootcamp: async (bootcampId) => { - const res = await fetch(`${API_BASE_URI}/bootcamps/${bootcampId}/reviews`); + const uri = await fetchApiEndPoint(`/bootcamps/${bootcampId}/reviews`); + const res = await fetch(uri); if (!res.ok) { throw new Error('Failed to fetch reviews'); } @@ -10,7 +11,8 @@ const reviewService = { }, getReviews: async () => { - const res = await fetch(`${API_BASE_URI}/reviews`); + const uri = await fetchApiEndPoint(`/reviews`); + const res = await fetch(uri); if (!res.ok) { throw new Error('Failed to fetch reviews'); } @@ -18,7 +20,8 @@ const reviewService = { }, getReview: async (id) => { - const res = await fetch(`${API_BASE_URI}/reviews/${id}`); + const uri = await fetchApiEndPoint(`/reviews/${id}`); + const res = await fetch(uri); if (!res.ok) { throw new Error('Failed to fetch review'); } @@ -26,7 +29,8 @@ const reviewService = { }, createReview: async (review) => { - const res = await fetch(`${API_BASE_URI}/reviews`, { + const uri = await fetchApiEndPoint(`/reviews`); + const res = await fetch(uri, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -40,7 +44,8 @@ const reviewService = { }, updateReview: async (id, review) => { - const res = await fetch(`${API_BASE_URI}/reviews/${id}`, { + const uri = await fetchApiEndPoint(`/reviews/${id}`); + const res = await fetch(uri, { method: 'PUT', headers: { 'Content-Type': 'application/json', @@ -54,7 +59,8 @@ const reviewService = { }, deleteReview: async (id) => { - const res = await fetch(`${API_BASE_URI}/reviews/${id}`, { + const uri = await fetchApiEndPoint(`/reviews/${id}`); + const res = await fetch(uri, { method: 'DELETE', }); if (!res.ok) { diff --git a/ui/src/services/userService.js b/src/webapp/src/services/userService.js similarity index 72% rename from ui/src/services/userService.js rename to src/webapp/src/services/userService.js index cfe9fa1..b7a4362 100644 --- a/ui/src/services/userService.js +++ b/src/webapp/src/services/userService.js @@ -1,9 +1,10 @@ import { getToken } from '../helpers/auth'; -const API_BASE_URI = process.env.REACT_APP_DEVCAMPER_BASE_API_URI + '/user'; +import { fetchApiEndPoint } from '../utils/configService'; const userService = { register: async (user) => { - const res = await fetch(`${API_BASE_URI}/register`, { + const uri = await fetchApiEndPoint(`/user/register`); + const res = await fetch(uri, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -17,7 +18,8 @@ const userService = { }, login: async (user) => { - const res = await fetch(`${API_BASE_URI}/login`, { + const uri = await fetchApiEndPoint(`/user/login`); + const res = await fetch(uri, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -31,7 +33,8 @@ const userService = { }, logout: async () => { - const res = await fetch(`${API_BASE_URI}/logout`, { + const uri = await fetchApiEndPoint(`/user/logout`); + const res = await fetch(uri, { method: 'GET', }); if (!res.ok) { @@ -41,8 +44,9 @@ const userService = { }, getMe: async () => { + const uri = await fetchApiEndPoint(`/user/getMe`); const token = getToken(); - const res = await fetch(`${API_BASE_URI}/me`, { + const res = await fetch(uri, { method: 'GET', headers: { Authorization: `Bearer ${token}`, @@ -55,7 +59,8 @@ const userService = { }, forgotPassword: async (email) => { - const res = await fetch(`${API_BASE_URI}/forgotpassword`, { + const uri = await fetchApiEndPoint(`/user/forgotpassword`); + const res = await fetch(uri, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -69,7 +74,8 @@ const userService = { }, resetPassword: async (password) => { - const res = await fetch(`${API_BASE_URI}/resetpassword`, { + const uri = await fetchApiEndPoint(`/user/resetpassword`); + const res = await fetch(uri, { method: 'PUT', headers: { 'Content-Type': 'application/json', @@ -84,7 +90,8 @@ const userService = { updateDetails: async (user) => { const token = getToken(); - const res = await fetch(`${API_BASE_URI}/updatedetails`, { + const uri = await fetchApiEndPoint(`/user/updatedetails`); + const res = await fetch(uri, { method: 'PUT', headers: { 'Content-Type': 'application/json', @@ -99,7 +106,8 @@ const userService = { }, updatePassword: async (password) => { - const res = await fetch(`${API_BASE_URI}/updatepassword`, { + const uri = await fetchApiEndPoint(`/user/updatepassword`); + const res = await fetch(uri, { method: 'PUT', headers: { 'Content-Type': 'application/json', diff --git a/src/webapp/src/utils/configService.js b/src/webapp/src/utils/configService.js new file mode 100644 index 0000000..0cc186d --- /dev/null +++ b/src/webapp/src/utils/configService.js @@ -0,0 +1,27 @@ +let config = null; +export const fetchConfig = async () => { + if (!config) { + const response = await fetch('/config/config.json'); + if (!response.ok) { + throw new Error('Failed to fetch configuration'); + } + const json = await response.json(); + const env = process.env.NODE_ENV || 'development'; + console.log(`Using configuration for environment: ${env}`); + console.log(`Configuration: ${JSON.stringify(json[env], null, 2)}`); + config = json[env]; + } + return config; +}; + +export const getConfigValue = async (key) => { + const config = await fetchConfig(); + return config[key]; +}; + +export const fetchApiEndPoint = async (endpoint) => { + const config = await fetchConfig(); + const api = config.react_app_devcamper_base_api_uri; + console.log(`fetchApi endpoint: ${api}${endpoint}`); + return `${api}${endpoint}`; +}; diff --git a/ui/env.example b/ui/env.example deleted file mode 100644 index fdc8557..0000000 --- a/ui/env.example +++ /dev/null @@ -1 +0,0 @@ -REACT_APP_DEVCAMPER_BASE_API_URI=http://localhost:5000 \ No newline at end of file diff --git a/ui/public/images/image_1.jpg b/ui/public/images/image_1.jpg deleted file mode 100644 index ab8e9d2..0000000 Binary files a/ui/public/images/image_1.jpg and /dev/null differ diff --git a/ui/public/images/image_2.jpg b/ui/public/images/image_2.jpg deleted file mode 100644 index 65a7cba..0000000 Binary files a/ui/public/images/image_2.jpg and /dev/null differ diff --git a/ui/public/images/image_3.jpg b/ui/public/images/image_3.jpg deleted file mode 100644 index 59778f7..0000000 Binary files a/ui/public/images/image_3.jpg and /dev/null differ diff --git a/ui/public/images/image_4.jpg b/ui/public/images/image_4.jpg deleted file mode 100644 index 789c7ba..0000000 Binary files a/ui/public/images/image_4.jpg and /dev/null differ diff --git a/ui/public/images/showcase.jpg b/ui/public/images/showcase.jpg deleted file mode 100644 index f23d4fc..0000000 Binary files a/ui/public/images/showcase.jpg and /dev/null differ diff --git a/ui/src/pages/bootcamps/AddReviewPage.jsx b/ui/src/pages/bootcamps/AddReviewPage.jsx deleted file mode 100644 index f4807dc..0000000 --- a/ui/src/pages/bootcamps/AddReviewPage.jsx +++ /dev/null @@ -1,67 +0,0 @@ -import { AiOutlineLeft } from 'react-icons/ai'; -import { Link, useParams } from 'react-router-dom'; // Import useParams to get bootcampId from URL -import React, { useState } from 'react'; - -const AddReviewPage = () => { - const { bootcampId } = useParams(); // Get bootcampId from URL parameters - const [rating, setRating] = useState(8); - - const handleRatingChange = (event) => { - setRating(event.target.value); - }; - - return ( -
-
-
-
-
-
- {/* Update Link to go back to the specific bootcamp details */} - - Bootcamp Info - - -

DevWorks Bootcamp

-

Write a Review

-

You must have attended and graduated this bootcamp to review.

-
-
-
- - -
- -
- -
- -
- -
- -
- -
-
-
-
-
-
-
-
- ); -}; - -export default AddReviewPage; diff --git a/ui/src/pages/bootcamps/ManageReviewsPage.jsx b/ui/src/pages/bootcamps/ManageReviewsPage.jsx deleted file mode 100644 index d33064f..0000000 --- a/ui/src/pages/bootcamps/ManageReviewsPage.jsx +++ /dev/null @@ -1,61 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; -import { GrEdit, GrClose } from 'react-icons/gr'; - -const bootcamps = [ - { - id: 1, - name: 'DevWorks Bootcamp', - rating: 10, - }, - { - id: 2, - name: 'AI Bootcamp', - rating: 8, - }, -]; - -const ManageReviewsPage = () => { - return ( -
-
-
-
-
-
-

Manage Reviews

- - - - - - - - - - {bootcamps.map((b) => ( - - - - - - ))} - -
BootcampRating
{b.bootCampName}{b.bootCampRating} - - - - -
-
-
-
-
-
-
- ); -}; - -export default ManageReviewsPage; diff --git a/ui/src/pages/user/ResetPasswordPage.jsx b/ui/src/pages/user/ResetPasswordPage.jsx deleted file mode 100644 index dc8ce54..0000000 --- a/ui/src/pages/user/ResetPasswordPage.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react'; - -const ResetPasswordPage = () => { - return
ResetPasswordPage
; -}; - -export default ResetPasswordPage; diff --git a/ui/src/pages/user/UpdatePasswordPage.jsx b/ui/src/pages/user/UpdatePasswordPage.jsx deleted file mode 100644 index 356a632..0000000 --- a/ui/src/pages/user/UpdatePasswordPage.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react'; - -const UpdatePasswordPage = () => { - return
UpdatePasswordPage
; -}; - -export default UpdatePasswordPage;