commit c205e717a5f8b08736a7fe2501bd3a258f20ffd8 Author: paulmataruso Date: Tue Nov 19 03:32:02 2024 +0000 First Upload diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4dad2da --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM node:20-alpine as build + +ARG REACT_APP_SERVICES_HOST=/services/m + +COPY . /app +WORKDIR /app/src + +RUN npm install +RUN npm run build + + +FROM nginx +COPY --from=build /app/dist /usr/share/nginx/html + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ab38676 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2023 Caesar Kabalan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 0000000..dddfac4 --- /dev/null +++ b/NOTES.md @@ -0,0 +1,57 @@ +# Notes + +## Efficient Saves + +Looks like the most efficient way to store an address is to track the base network (say 10.0.0.0/8) and then represent +all other addresses as offsets from that base network. This way, we can store a subnet as a base network and a mask. The +most efficient way to store this is to store two values: + +- The base network offset (0 to 4,294,967,296) + - 0 being the best case, a subnet within the base subnet with the same network address (10.0.0.0/24) + - 255.255.255.255 being the worst case, the last address in 0.0.0.0/0 (unrealistic) +- The mask (0 to 32) + +Combine both of these values into a single binary string that is 32+5 bits. Round the storage up to the nearest byte +(40 bits = 5 bytes), padding the remaining bits with 0s, then encode this 5 byte string into a URL-safe base64 string. + +Example for 10.0.0.0/8 and representing the network 10.0.15.0/24: +Find the offset: + 10.0.0.0 (decimal): + 00001010 00000000 00000000 00000000 → 167772160 + 10.0.15.0 (decimal): + 00001010 00000000 00001111 00000000 → 167775232 + Offset: 167775232 - 167772160 = 3072 + +Hmmm, this above works good for close together smaller networks but gets ugly when you're dealing with larger networks +because the offset is huge. + +I'm thinking about a coordinate system. Let's say you have a base network of 10.0.0.0/8 and you want to as concisely as +possible represent 10.166.64.0/20. We could represent this as the nth /20 within the /8 and just store N-20, and +probably shorten that even more with the last digit always being base32 for the mask. + +If I'm doing my math right you can say a /20 has 4096 addresses. + +10.0.0.0 = 167772160 +10.166.64.0 = 178667520 +178667520 - 167772160 = 10895360 +10895360 / 4096 = 2660 +Which means 10.166.64.0 is the 2,660th /20 within the /8. You could store this as 2660x20 (inefficient) + +You can reverse this 2660x20 from 10.0.0.0/8 by doing the following: +a /21 has 4096 addresses, times the 2660th network is 10895360. Add that to the base network address to get the network + +10.0.0.0 = 167772160 +167772160 + 10895360 = 178667520 +178667520 = 10.166.64.0 then you can tack back on the /20 + +This has the advantage overall that you're unlikely to store wildly different subnet sizes in the same page. Your "N" in +the "Nth" subnet is likely to be very small. You're more likely to store the Nth /24 in a /20 than you are a /20 in an +/8. So the numbers will mostly be 1-2 digits, rarely 3 digits, and almost never 4 digits as depicted above. + +I then for efficienty I could use this format: + +`[Nth Network as Integer][Network Size as Base32]` + +So lets say you're wanting to represent the 0th /24 in a /20 you would represent it as `00`, always knowing the last +digit is the network size. Or the 0th /32 would be `07` (32 in base32 is 7). or the 5th /28 would be `54`. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..5693908 --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +# Visual Subnet Calculator - [visualsubnetcalc.com](https://visualsubnetcalc.com) + +![demo.gif](src%2Fdemo.gif) + +Visual Subnet Calculator is a modernized tool based on the original work by [davidc](https://github.com/davidc/subnets). +It strives to be a tool for quickly designing networks and collaborating on that design with others. It focuses on +expediting the work of network administrators, not academic subnetting math. + +## Design Tenets + +The following tenets are the most important values that drive the design of the tool. New features, pull requests, etc +should align to these tenets, or propose an adjustment to the tenets. + +- **Simplicity is king.** Network admins are busy and Visual Subnet Calculator should always be easy for FIRST TIME USERS to + quickly and intuitively use. +- **Subnetting is design work.** Promote features that enhance visual clarity and easy mental processing of even the most + complex architectures. +- **Users control the data.** We store nothing, but provide convenient ways for users to save and share their designs. +- **Embrace community contributions.** Consider and respond to all feedback and pull requests in the context of these + tenets. + +## Building From Source + +If you have a more opinionated best-practice way to lay out this repository please open an issue. + +Build prerequisites: +- (Optional but recommended) NVM to manage node version +- node.js (version 20) and associated NPM. +- sass (Globally installed, following instructions below.) + +Compile from source: + +```shell +# Clone the repository +> git clone https://github.com/ckabalan/visualsubnetcalc +# Change to the repository directory +> cd visualsubnetcalc +# Use recommended NVM version +> nvm use +# Change to the sources directory +> cd src +# Install Bootstrap +> npm install +# Compile Bootstrap (Also install sass command line globally) +> npm run build +# Run the local webserver +> npm start +``` + + + +The full application should then be available within `./dist/`, open `./dist/index.html` in a browser. + +### Run with certificates (Optional) + +***NB:*** *required for testing clipboard.writeText() in the browser. Feature is only available in secure (https) mode.* + +```shell + +#Install mkcert +> brew install mkcert +# generate CA Certs to be trusted by local browsers +> mkcert install +# generate certs for local development +> cd visualsubnetcalc/src +# generate certs for local development +> npm run setup:certs +# run the local webserver with https +> npm run local-secure-start +```` + +# Cloud Subnet Notes + +- [AWS reserves 3 additional IPs](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-sizing.html) + +- [Azure reserves 3 additional IPs](https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-faq#are-there-any-restrictions-on-using-ip-addresses-within-these-subnets) + + +## Standard mode: + - Smallest subnet: /32 + - Two reserved addresses per subnet of size <= 30: + - Network Address (network + 0) + - Broadcast Address (last network address) +## AWS mode : + - Smallest subnet: /28 + - Five reserved addresses per subnet: + - Network Address (network + 0) + - AWS Reserved - VPC Router + - AWS Reserved - VPC DNS + - AWS Reserved - Future Use + - Broadcast Address (last network address) +## Azure mode : + - Smallest subnet: /29 + - Five reserved addresses per subnet: + - Network Address (network + 0) + - Azure Reserved - Default Gateway + - Azure Reserved - DNS Mapping + - Azure Reserved - DNS Mapping + - Broadcast Address (last network address) + + + +## Credits + +Split icon made by [Freepik](https://www.flaticon.com/authors/freepik) from [Flaticon](https://www.flaticon.com/). + +## License + +Visual Subnet Calculator is released under the [MIT License](https://opensource.org/licenses/MIT) + diff --git a/dist/css/bootstrap.min.css b/dist/css/bootstrap.min.css new file mode 100644 index 0000000..8eb5ef0 --- /dev/null +++ b/dist/css/bootstrap.min.css @@ -0,0 +1,5 @@ +.custom-tooltip{--bs-tooltip-bg: var(--bs-danger) !important;--bs-tooltip-color: var(--bs-white) !important;--bs-tooltip-opacity: 1 !important}/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root,[data-bs-theme=light]{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-primary: #0d6efd;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-primary-rgb: 13, 110, 253;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 25, 135, 84;--bs-info-rgb: 13, 202, 240;--bs-warning-rgb: 255, 193, 7;--bs-danger-rgb: 220, 53, 69;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 33, 37, 41;--bs-primary-text-emphasis: #052c65;--bs-secondary-text-emphasis: #2b2f32;--bs-success-text-emphasis: #0a3622;--bs-info-text-emphasis: #055160;--bs-warning-text-emphasis: #664d03;--bs-danger-text-emphasis: #58151c;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #cfe2ff;--bs-secondary-bg-subtle: #e2e3e5;--bs-success-bg-subtle: #d1e7dd;--bs-info-bg-subtle: #cff4fc;--bs-warning-bg-subtle: #fff3cd;--bs-danger-bg-subtle: #f8d7da;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #9ec5fe;--bs-secondary-border-subtle: #c4c8cb;--bs-success-border-subtle: #a3cfbb;--bs-info-border-subtle: #9eeaf9;--bs-warning-border-subtle: #ffe69c;--bs-danger-border-subtle: #f1aeb5;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family: var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #0d6efd;--bs-link-color-rgb: 13, 110, 253;--bs-link-decoration: underline;--bs-link-hover-color: #0a58ca;--bs-link-hover-color-rgb: 10, 88, 202;--bs-code-color: #d63384;--bs-highlight-color: #212529;--bs-highlight-bg: #fff3cd;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.375rem;--bs-border-radius-sm: 0.25rem;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(13, 110, 253, 0.25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #6ea8fe;--bs-secondary-text-emphasis: #a7acb1;--bs-success-text-emphasis: #75b798;--bs-info-text-emphasis: #6edff6;--bs-warning-text-emphasis: #ffda6a;--bs-danger-text-emphasis: #ea868f;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #031633;--bs-secondary-bg-subtle: #161719;--bs-success-bg-subtle: #051b11;--bs-info-bg-subtle: #032830;--bs-warning-bg-subtle: #332701;--bs-danger-bg-subtle: #2c0b0e;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #084298;--bs-secondary-border-subtle: #41464b;--bs-success-border-subtle: #0f5132;--bs-info-border-subtle: #087990;--bs-warning-border-subtle: #997404;--bs-danger-border-subtle: #842029;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #6ea8fe;--bs-link-hover-color: #8bb9fe;--bs-link-color-rgb: 110, 168, 254;--bs-link-hover-color-rgb: 139, 185, 254;--bs-code-color: #e685b5;--bs-highlight-color: #dee2e6;--bs-highlight-bg: #664d03;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #75b798;--bs-form-valid-border-color: #75b798;--bs-form-invalid-color: #ea868f;--bs-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + 0.6vw)}@media(min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + 0.3vw)}@media(min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}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:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:0.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}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}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-xxxxl,.container-xxxl,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}@media(min-width: 1600px){.container-xxxl,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1520px}}@media(min-width: 1800px){.container-xxxxl,.container-xxxl,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1720px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px;--bs-breakpoint-xxxl: 1600px;--bs-breakpoint-xxxxl: 1800px}.row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--bs-gutter-y));margin-right:calc(-0.5*var(--bs-gutter-x));margin-left:calc(-0.5*var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: 0.25rem}.g-1,.gy-1{--bs-gutter-y: 0.25rem}.g-2,.gx-2{--bs-gutter-x: 0.5rem}.g-2,.gy-2{--bs-gutter-y: 0.5rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 3rem}.g-5,.gy-5{--bs-gutter-y: 3rem}@media(min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: 0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: 0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: 0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: 0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 3rem}}@media(min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: 0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y: 0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x: 0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y: 0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 3rem}.g-md-5,.gy-md-5{--bs-gutter-y: 3rem}}@media(min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: 0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: 0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: 0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: 0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 3rem}}@media(min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: 0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: 0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: 0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: 0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 3rem}}@media(min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: 0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: 0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: 0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: 0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 3rem}}@media(min-width: 1600px){.col-xxxl{flex:1 0 0%}.row-cols-xxxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxxl-auto{flex:0 0 auto;width:auto}.col-xxxl-1{flex:0 0 auto;width:8.33333333%}.col-xxxl-2{flex:0 0 auto;width:16.66666667%}.col-xxxl-3{flex:0 0 auto;width:25%}.col-xxxl-4{flex:0 0 auto;width:33.33333333%}.col-xxxl-5{flex:0 0 auto;width:41.66666667%}.col-xxxl-6{flex:0 0 auto;width:50%}.col-xxxl-7{flex:0 0 auto;width:58.33333333%}.col-xxxl-8{flex:0 0 auto;width:66.66666667%}.col-xxxl-9{flex:0 0 auto;width:75%}.col-xxxl-10{flex:0 0 auto;width:83.33333333%}.col-xxxl-11{flex:0 0 auto;width:91.66666667%}.col-xxxl-12{flex:0 0 auto;width:100%}.offset-xxxl-0{margin-left:0}.offset-xxxl-1{margin-left:8.33333333%}.offset-xxxl-2{margin-left:16.66666667%}.offset-xxxl-3{margin-left:25%}.offset-xxxl-4{margin-left:33.33333333%}.offset-xxxl-5{margin-left:41.66666667%}.offset-xxxl-6{margin-left:50%}.offset-xxxl-7{margin-left:58.33333333%}.offset-xxxl-8{margin-left:66.66666667%}.offset-xxxl-9{margin-left:75%}.offset-xxxl-10{margin-left:83.33333333%}.offset-xxxl-11{margin-left:91.66666667%}.g-xxxl-0,.gx-xxxl-0{--bs-gutter-x: 0}.g-xxxl-0,.gy-xxxl-0{--bs-gutter-y: 0}.g-xxxl-1,.gx-xxxl-1{--bs-gutter-x: 0.25rem}.g-xxxl-1,.gy-xxxl-1{--bs-gutter-y: 0.25rem}.g-xxxl-2,.gx-xxxl-2{--bs-gutter-x: 0.5rem}.g-xxxl-2,.gy-xxxl-2{--bs-gutter-y: 0.5rem}.g-xxxl-3,.gx-xxxl-3{--bs-gutter-x: 1rem}.g-xxxl-3,.gy-xxxl-3{--bs-gutter-y: 1rem}.g-xxxl-4,.gx-xxxl-4{--bs-gutter-x: 1.5rem}.g-xxxl-4,.gy-xxxl-4{--bs-gutter-y: 1.5rem}.g-xxxl-5,.gx-xxxl-5{--bs-gutter-x: 3rem}.g-xxxl-5,.gy-xxxl-5{--bs-gutter-y: 3rem}}@media(min-width: 1800px){.col-xxxxl{flex:1 0 0%}.row-cols-xxxxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxxxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxxxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxxxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxxxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxxxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxxxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxxxl-auto{flex:0 0 auto;width:auto}.col-xxxxl-1{flex:0 0 auto;width:8.33333333%}.col-xxxxl-2{flex:0 0 auto;width:16.66666667%}.col-xxxxl-3{flex:0 0 auto;width:25%}.col-xxxxl-4{flex:0 0 auto;width:33.33333333%}.col-xxxxl-5{flex:0 0 auto;width:41.66666667%}.col-xxxxl-6{flex:0 0 auto;width:50%}.col-xxxxl-7{flex:0 0 auto;width:58.33333333%}.col-xxxxl-8{flex:0 0 auto;width:66.66666667%}.col-xxxxl-9{flex:0 0 auto;width:75%}.col-xxxxl-10{flex:0 0 auto;width:83.33333333%}.col-xxxxl-11{flex:0 0 auto;width:91.66666667%}.col-xxxxl-12{flex:0 0 auto;width:100%}.offset-xxxxl-0{margin-left:0}.offset-xxxxl-1{margin-left:8.33333333%}.offset-xxxxl-2{margin-left:16.66666667%}.offset-xxxxl-3{margin-left:25%}.offset-xxxxl-4{margin-left:33.33333333%}.offset-xxxxl-5{margin-left:41.66666667%}.offset-xxxxl-6{margin-left:50%}.offset-xxxxl-7{margin-left:58.33333333%}.offset-xxxxl-8{margin-left:66.66666667%}.offset-xxxxl-9{margin-left:75%}.offset-xxxxl-10{margin-left:83.33333333%}.offset-xxxxl-11{margin-left:91.66666667%}.g-xxxxl-0,.gx-xxxxl-0{--bs-gutter-x: 0}.g-xxxxl-0,.gy-xxxxl-0{--bs-gutter-y: 0}.g-xxxxl-1,.gx-xxxxl-1{--bs-gutter-x: 0.25rem}.g-xxxxl-1,.gy-xxxxl-1{--bs-gutter-y: 0.25rem}.g-xxxxl-2,.gx-xxxxl-2{--bs-gutter-x: 0.5rem}.g-xxxxl-2,.gy-xxxxl-2{--bs-gutter-y: 0.5rem}.g-xxxxl-3,.gx-xxxxl-3{--bs-gutter-x: 1rem}.g-xxxxl-3,.gy-xxxxl-3{--bs-gutter-y: 1rem}.g-xxxxl-4,.gx-xxxxl-4{--bs-gutter-x: 1.5rem}.g-xxxxl-4,.gy-xxxxl-4{--bs-gutter-y: 1.5rem}.g-xxxxl-5,.gx-xxxxl-5{--bs-gutter-x: 3rem}.g-xxxxl-5,.gy-xxxxl-5{--bs-gutter-y: 3rem}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: var(--bs-emphasis-color);--bs-table-bg: var(--bs-body-bg);--bs-table-border-color: var(--bs-border-color);--bs-table-accent-bg: transparent;--bs-table-striped-color: var(--bs-emphasis-color);--bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color: var(--bs-emphasis-color);--bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color: var(--bs-emphasis-color);--bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width)*2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #cfe2ff;--bs-table-border-color: #a6b5cc;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #e2e3e5;--bs-table-border-color: #b5b6b7;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d1e7dd;--bs-table-border-color: #a7b9b1;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #cff4fc;--bs-table-border-color: #a6c3ca;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #fff3cd;--bs-table-border-color: #ccc2a4;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #f8d7da;--bs-table-border-color: #c6acae;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #c6c7c8;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #212529;--bs-table-border-color: #4d5154;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #fff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #fff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1599.98px){.table-responsive-xxxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1799.98px){.table-responsive-xxxxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + var(--bs-border-width));padding-bottom:calc(0.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + var(--bs-border-width));padding-bottom:calc(0.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + var(--bs-border-width));padding-bottom:calc(0.25rem + var(--bs-border-width));font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg: var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: 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")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:var(--bs-secondary-bg);border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:var(--bs-secondary-bg);border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width)*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--bs-form-valid-border-color);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='%23198754' d='M2.3 6.73.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:right calc(0.375em + 0.1875rem) center;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:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), 0.25)}.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 .form-select:valid,.form-select.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.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");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), 0.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--bs-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), 0.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:var(--bs-form-invalid-border-color);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 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;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:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), 0.25)}.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 .form-select:invalid,.form-select.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), 0.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:var(--bs-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), 0.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: var(--bs-body-color);--bs-btn-bg: transparent;--bs-btn-border-width: var(--bs-border-width);--bs-btn-border-color: transparent;--bs-btn-border-radius: var(--bs-border-radius);--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #0b5ed7;--bs-btn-hover-border-color: #0a58ca;--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #fff;--bs-btn-active-bg: #0a58ca;--bs-btn-active-border-color: #0a53be;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #5c636a;--bs-btn-hover-border-color: #565e64;--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #fff;--bs-btn-active-bg: #565e64;--bs-btn-active-border-color: #51585e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #157347;--bs-btn-hover-border-color: #146c43;--bs-btn-focus-shadow-rgb: 60, 153, 110;--bs-btn-active-color: #fff;--bs-btn-active-bg: #146c43;--bs-btn-active-border-color: #13653f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #198754;--bs-btn-disabled-border-color: #198754}.btn-info{--bs-btn-color: #000;--bs-btn-bg: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #31d2f2;--bs-btn-hover-border-color: #25cff2;--bs-btn-focus-shadow-rgb: 11, 172, 204;--bs-btn-active-color: #000;--bs-btn-active-bg: #3dd5f3;--bs-btn-active-border-color: #25cff2;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #0dcaf0;--bs-btn-disabled-border-color: #0dcaf0}.btn-warning{--bs-btn-color: #000;--bs-btn-bg: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffca2c;--bs-btn-hover-border-color: #ffc720;--bs-btn-focus-shadow-rgb: 217, 164, 6;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffcd39;--bs-btn-active-border-color: #ffc720;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ffc107;--bs-btn-disabled-border-color: #ffc107}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #bb2d3b;--bs-btn-hover-border-color: #b02a37;--bs-btn-focus-shadow-rgb: 225, 83, 97;--bs-btn-active-color: #fff;--bs-btn-active-bg: #b02a37;--bs-btn-active-border-color: #a52834;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #dc3545;--bs-btn-disabled-border-color: #dc3545}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #424649;--bs-btn-hover-border-color: #373b3e;--bs-btn-focus-shadow-rgb: 66, 70, 73;--bs-btn-active-color: #fff;--bs-btn-active-bg: #4d5154;--bs-btn-active-border-color: #373b3e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #212529;--bs-btn-disabled-border-color: #212529}.btn-outline-primary{--bs-btn-color: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #0d6efd;--bs-btn-hover-border-color: #0d6efd;--bs-btn-focus-shadow-rgb: 13, 110, 253;--bs-btn-active-color: #fff;--bs-btn-active-bg: #0d6efd;--bs-btn-active-border-color: #0d6efd;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0d6efd;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0d6efd;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #198754;--bs-btn-hover-border-color: #198754;--bs-btn-focus-shadow-rgb: 25, 135, 84;--bs-btn-active-color: #fff;--bs-btn-active-bg: #198754;--bs-btn-active-border-color: #198754;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #198754;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #198754;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #0dcaf0;--bs-btn-hover-border-color: #0dcaf0;--bs-btn-focus-shadow-rgb: 13, 202, 240;--bs-btn-active-color: #000;--bs-btn-active-bg: #0dcaf0;--bs-btn-active-border-color: #0dcaf0;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0dcaf0;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0dcaf0;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffc107;--bs-btn-hover-border-color: #ffc107;--bs-btn-focus-shadow-rgb: 255, 193, 7;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffc107;--bs-btn-active-border-color: #ffc107;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffc107;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ffc107;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #dc3545;--bs-btn-hover-border-color: #dc3545;--bs-btn-focus-shadow-rgb: 220, 53, 69;--bs-btn-active-color: #fff;--bs-btn-active-bg: #dc3545;--bs-btn-active-border-color: #dc3545;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dc3545;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dc3545;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #212529;--bs-btn-hover-border-color: #212529;--bs-btn-focus-shadow-rgb: 33, 37, 41;--bs-btn-active-color: #fff;--bs-btn-active-bg: #212529;--bs-btn-active-border-color: #212529;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #212529;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #212529;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: var(--bs-link-color);--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: var(--bs-link-hover-color);--bs-btn-hover-border-color: transparent;--bs-btn-active-color: var(--bs-link-hover-color);--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 49, 132, 253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: var(--bs-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: var(--bs-body-color);--bs-dropdown-bg: var(--bs-body-bg);--bs-dropdown-border-color: var(--bs-border-color-translucent);--bs-dropdown-border-radius: var(--bs-border-radius);--bs-dropdown-border-width: var(--bs-border-width);--bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg: var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: var(--bs-box-shadow);--bs-dropdown-link-color: var(--bs-body-color);--bs-dropdown-link-hover-color: var(--bs-body-color);--bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: var(--bs-tertiary-color);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1600px){.dropdown-menu-xxxl-start{--bs-position: start}.dropdown-menu-xxxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxxl-end{--bs-position: end}.dropdown-menu-xxxl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1800px){.dropdown-menu-xxxxl-start{--bs-position: start}.dropdown-menu-xxxxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxxxl-end{--bs-position: end}.dropdown-menu-xxxxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(var(--bs-border-width)*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;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:calc(var(--bs-border-width)*-1)}.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~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-link-color);--bs-nav-link-hover-color: var(--bs-link-hover-color);--bs-nav-link-disabled-color: var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: var(--bs-border-width);--bs-nav-tabs-border-color: var(--bs-border-color);--bs-nav-tabs-border-radius: var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color: var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg: var(--bs-body-bg);--bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: var(--bs-border-radius);--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25rem;--bs-navbar-toggler-padding-x: 0.75rem;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius: var(--bs-border-radius);--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl,.navbar>.container-xxxl,.navbar>.container-xxxxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1600px){.navbar-expand-xxxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxxl .navbar-nav{flex-direction:row}.navbar-expand-xxxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxxl .navbar-toggler{display:none}.navbar-expand-xxxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1800px){.navbar-expand-xxxxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxxxl .navbar-nav{flex-direction:row}.navbar-expand-xxxxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxxxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxxxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxxxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxxxl .navbar-toggler{display:none}.navbar-expand-xxxxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxxxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxxxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: rgba(255, 255, 255, 0.55);--bs-navbar-hover-color: rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);--bs-navbar-active-color: #fff;--bs-navbar-brand-color: #fff;--bs-navbar-brand-hover-color: #fff;--bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: var(--bs-border-width);--bs-card-border-color: var(--bs-border-color-translucent);--bs-card-border-radius: var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: var(--bs-body-bg);--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{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}}.accordion{--bs-accordion-color: var(--bs-body-color);--bs-accordion-bg: var(--bs-body-bg);--bs-accordion-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, border-radius 0.15s ease;--bs-accordion-border-color: var(--bs-border-color);--bs-accordion-border-width: var(--bs-border-width);--bs-accordion-border-radius: var(--bs-border-radius);--bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: var(--bs-body-color);--bs-accordion-btn-bg: var(--bs-accordion-bg);--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: var(--bs-primary-text-emphasis);--bs-accordion-active-bg: var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: var(--bs-secondary-color);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: var(--bs-link-color);--bs-pagination-bg: var(--bs-body-bg);--bs-pagination-border-width: var(--bs-border-width);--bs-pagination-border-color: var(--bs-border-color);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: var(--bs-link-hover-color);--bs-pagination-hover-bg: var(--bs-tertiary-bg);--bs-pagination-hover-border-color: var(--bs-border-color);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: var(--bs-secondary-color);--bs-pagination-disabled-bg: var(--bs-secondary-bg);--bs-pagination-disabled-border-color: var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width)*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius: var(--bs-border-radius);--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: var(--bs-secondary-bg);--bs-progress-border-radius: var(--bs-border-radius);--bs-progress-box-shadow: var(--bs-box-shadow-inset);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #0d6efd;--bs-progress-bar-transition: width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{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:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: var(--bs-body-color);--bs-list-group-bg: var(--bs-body-bg);--bs-list-group-border-color: var(--bs-border-color);--bs-list-group-border-width: var(--bs-border-width);--bs-list-group-border-radius: var(--bs-border-radius);--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: var(--bs-secondary-color);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-tertiary-bg);--bs-list-group-action-active-color: var(--bs-body-color);--bs-list-group-action-active-bg: var(--bs-secondary-bg);--bs-list-group-disabled-color: var(--bs-secondary-color);--bs-list-group-disabled-bg: var(--bs-body-bg);--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #0d6efd;--bs-list-group-active-border-color: #0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1600px){.list-group-horizontal-xxxl{flex-direction:row}.list-group-horizontal-xxxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1800px){.list-group-horizontal-xxxxl{flex-direction:row}.list-group-horizontal-xxxxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxxxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxxxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxxxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxxxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width: var(--bs-border-width);--bs-toast-border-color: var(--bs-border-color-translucent);--bs-toast-border-radius: var(--bs-border-radius);--bs-toast-box-shadow: var(--bs-box-shadow);--bs-toast-header-color: var(--bs-secondary-color);--bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color: var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: var(--bs-body-bg);--bs-modal-border-color: var(--bs-border-color-translucent);--bs-modal-border-width: var(--bs-border-width);--bs-modal-border-radius: var(--bs-border-radius-lg);--bs-modal-box-shadow: var(--bs-box-shadow-sm);--bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: var(--bs-border-color);--bs-modal-header-border-width: var(--bs-border-width);--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: var(--bs-border-color);--bs-modal-footer-border-width: var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}@media(max-width: 1599.98px){.modal-fullscreen-xxxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxxl-down .modal-header,.modal-fullscreen-xxxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxxl-down .modal-body{overflow-y:auto}}@media(max-width: 1799.98px){.modal-fullscreen-xxxxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxxxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxxxl-down .modal-header,.modal-fullscreen-xxxxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxxxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: var(--bs-body-bg);--bs-tooltip-bg: var(--bs-emphasis-color);--bs-tooltip-border-radius: var(--bs-border-radius);--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);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;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: var(--bs-body-bg);--bs-popover-border-width: var(--bs-border-width);--bs-popover-border-color: var(--bs-border-color-translucent);--bs-popover-border-radius: var(--bs-border-radius-lg);--bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow: var(--bs-box-shadow);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: var(--bs-secondary-bg);--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: var(--bs-body-color);--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);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;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{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:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")*/}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")*/}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxxxl,.offcanvas-xxxl,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: var(--bs-body-color);--bs-offcanvas-bg: var(--bs-body-bg);--bs-offcanvas-border-width: var(--bs-border-width);--bs-offcanvas-border-color: var(--bs-border-color-translucent);--bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1599.98px){.offcanvas-xxxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1599.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxxl{transition:none}}@media(max-width: 1599.98px){.offcanvas-xxxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxxl.showing,.offcanvas-xxxl.show:not(.hiding){transform:none}.offcanvas-xxxl.showing,.offcanvas-xxxl.hiding,.offcanvas-xxxl.show{visibility:visible}}@media(min-width: 1600px){.offcanvas-xxxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxxl .offcanvas-header{display:none}.offcanvas-xxxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1799.98px){.offcanvas-xxxxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1799.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxxxl{transition:none}}@media(max-width: 1799.98px){.offcanvas-xxxxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxxxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxxxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxxxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxxxl.showing,.offcanvas-xxxxl.show:not(.hiding){transform:none}.offcanvas-xxxxl.showing,.offcanvas-xxxxl.hiding,.offcanvas-xxxxl.show{visibility:visible}}@media(min-width: 1800px){.offcanvas-xxxxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxxxl .offcanvas-header{display:none}.offcanvas-xxxxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin:calc(-0.5*var(--bs-offcanvas-padding-y)) calc(-0.5*var(--bs-offcanvas-padding-x)) calc(-0.5*var(--bs-offcanvas-padding-y)) auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.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}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1600px){.sticky-xxxl-top{position:sticky;top:0;z-index:1020}.sticky-xxxl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1800px){.sticky-xxxxl-top{position:sticky;top:0;z-index:1020}.sticky-xxxxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.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}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:var(--bs-box-shadow) !important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm) !important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg) !important}.shadow-none{box-shadow:none !important}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.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}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !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}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + 0.9vw) !important}.fs-3{font-size:calc(1.3rem + 0.6vw) !important}.fs-4{font-size:calc(1.275rem + 0.3vw) !important}.fs-5{font-size:1.25rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !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:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !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:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !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:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !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:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}@media(min-width: 1600px){.float-xxxl-start{float:left !important}.float-xxxl-end{float:right !important}.float-xxxl-none{float:none !important}.object-fit-xxxl-contain{object-fit:contain !important}.object-fit-xxxl-cover{object-fit:cover !important}.object-fit-xxxl-fill{object-fit:fill !important}.object-fit-xxxl-scale{object-fit:scale-down !important}.object-fit-xxxl-none{object-fit:none !important}.d-xxxl-inline{display:inline !important}.d-xxxl-inline-block{display:inline-block !important}.d-xxxl-block{display:block !important}.d-xxxl-grid{display:grid !important}.d-xxxl-inline-grid{display:inline-grid !important}.d-xxxl-table{display:table !important}.d-xxxl-table-row{display:table-row !important}.d-xxxl-table-cell{display:table-cell !important}.d-xxxl-flex{display:flex !important}.d-xxxl-inline-flex{display:inline-flex !important}.d-xxxl-none{display:none !important}.flex-xxxl-fill{flex:1 1 auto !important}.flex-xxxl-row{flex-direction:row !important}.flex-xxxl-column{flex-direction:column !important}.flex-xxxl-row-reverse{flex-direction:row-reverse !important}.flex-xxxl-column-reverse{flex-direction:column-reverse !important}.flex-xxxl-grow-0{flex-grow:0 !important}.flex-xxxl-grow-1{flex-grow:1 !important}.flex-xxxl-shrink-0{flex-shrink:0 !important}.flex-xxxl-shrink-1{flex-shrink:1 !important}.flex-xxxl-wrap{flex-wrap:wrap !important}.flex-xxxl-nowrap{flex-wrap:nowrap !important}.flex-xxxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxxl-start{justify-content:flex-start !important}.justify-content-xxxl-end{justify-content:flex-end !important}.justify-content-xxxl-center{justify-content:center !important}.justify-content-xxxl-between{justify-content:space-between !important}.justify-content-xxxl-around{justify-content:space-around !important}.justify-content-xxxl-evenly{justify-content:space-evenly !important}.align-items-xxxl-start{align-items:flex-start !important}.align-items-xxxl-end{align-items:flex-end !important}.align-items-xxxl-center{align-items:center !important}.align-items-xxxl-baseline{align-items:baseline !important}.align-items-xxxl-stretch{align-items:stretch !important}.align-content-xxxl-start{align-content:flex-start !important}.align-content-xxxl-end{align-content:flex-end !important}.align-content-xxxl-center{align-content:center !important}.align-content-xxxl-between{align-content:space-between !important}.align-content-xxxl-around{align-content:space-around !important}.align-content-xxxl-stretch{align-content:stretch !important}.align-self-xxxl-auto{align-self:auto !important}.align-self-xxxl-start{align-self:flex-start !important}.align-self-xxxl-end{align-self:flex-end !important}.align-self-xxxl-center{align-self:center !important}.align-self-xxxl-baseline{align-self:baseline !important}.align-self-xxxl-stretch{align-self:stretch !important}.order-xxxl-first{order:-1 !important}.order-xxxl-0{order:0 !important}.order-xxxl-1{order:1 !important}.order-xxxl-2{order:2 !important}.order-xxxl-3{order:3 !important}.order-xxxl-4{order:4 !important}.order-xxxl-5{order:5 !important}.order-xxxl-last{order:6 !important}.m-xxxl-0{margin:0 !important}.m-xxxl-1{margin:.25rem !important}.m-xxxl-2{margin:.5rem !important}.m-xxxl-3{margin:1rem !important}.m-xxxl-4{margin:1.5rem !important}.m-xxxl-5{margin:3rem !important}.m-xxxl-auto{margin:auto !important}.mx-xxxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxxl-0{margin-top:0 !important}.mt-xxxl-1{margin-top:.25rem !important}.mt-xxxl-2{margin-top:.5rem !important}.mt-xxxl-3{margin-top:1rem !important}.mt-xxxl-4{margin-top:1.5rem !important}.mt-xxxl-5{margin-top:3rem !important}.mt-xxxl-auto{margin-top:auto !important}.me-xxxl-0{margin-right:0 !important}.me-xxxl-1{margin-right:.25rem !important}.me-xxxl-2{margin-right:.5rem !important}.me-xxxl-3{margin-right:1rem !important}.me-xxxl-4{margin-right:1.5rem !important}.me-xxxl-5{margin-right:3rem !important}.me-xxxl-auto{margin-right:auto !important}.mb-xxxl-0{margin-bottom:0 !important}.mb-xxxl-1{margin-bottom:.25rem !important}.mb-xxxl-2{margin-bottom:.5rem !important}.mb-xxxl-3{margin-bottom:1rem !important}.mb-xxxl-4{margin-bottom:1.5rem !important}.mb-xxxl-5{margin-bottom:3rem !important}.mb-xxxl-auto{margin-bottom:auto !important}.ms-xxxl-0{margin-left:0 !important}.ms-xxxl-1{margin-left:.25rem !important}.ms-xxxl-2{margin-left:.5rem !important}.ms-xxxl-3{margin-left:1rem !important}.ms-xxxl-4{margin-left:1.5rem !important}.ms-xxxl-5{margin-left:3rem !important}.ms-xxxl-auto{margin-left:auto !important}.p-xxxl-0{padding:0 !important}.p-xxxl-1{padding:.25rem !important}.p-xxxl-2{padding:.5rem !important}.p-xxxl-3{padding:1rem !important}.p-xxxl-4{padding:1.5rem !important}.p-xxxl-5{padding:3rem !important}.px-xxxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxxl-0{padding-top:0 !important}.pt-xxxl-1{padding-top:.25rem !important}.pt-xxxl-2{padding-top:.5rem !important}.pt-xxxl-3{padding-top:1rem !important}.pt-xxxl-4{padding-top:1.5rem !important}.pt-xxxl-5{padding-top:3rem !important}.pe-xxxl-0{padding-right:0 !important}.pe-xxxl-1{padding-right:.25rem !important}.pe-xxxl-2{padding-right:.5rem !important}.pe-xxxl-3{padding-right:1rem !important}.pe-xxxl-4{padding-right:1.5rem !important}.pe-xxxl-5{padding-right:3rem !important}.pb-xxxl-0{padding-bottom:0 !important}.pb-xxxl-1{padding-bottom:.25rem !important}.pb-xxxl-2{padding-bottom:.5rem !important}.pb-xxxl-3{padding-bottom:1rem !important}.pb-xxxl-4{padding-bottom:1.5rem !important}.pb-xxxl-5{padding-bottom:3rem !important}.ps-xxxl-0{padding-left:0 !important}.ps-xxxl-1{padding-left:.25rem !important}.ps-xxxl-2{padding-left:.5rem !important}.ps-xxxl-3{padding-left:1rem !important}.ps-xxxl-4{padding-left:1.5rem !important}.ps-xxxl-5{padding-left:3rem !important}.gap-xxxl-0{gap:0 !important}.gap-xxxl-1{gap:.25rem !important}.gap-xxxl-2{gap:.5rem !important}.gap-xxxl-3{gap:1rem !important}.gap-xxxl-4{gap:1.5rem !important}.gap-xxxl-5{gap:3rem !important}.row-gap-xxxl-0{row-gap:0 !important}.row-gap-xxxl-1{row-gap:.25rem !important}.row-gap-xxxl-2{row-gap:.5rem !important}.row-gap-xxxl-3{row-gap:1rem !important}.row-gap-xxxl-4{row-gap:1.5rem !important}.row-gap-xxxl-5{row-gap:3rem !important}.column-gap-xxxl-0{column-gap:0 !important}.column-gap-xxxl-1{column-gap:.25rem !important}.column-gap-xxxl-2{column-gap:.5rem !important}.column-gap-xxxl-3{column-gap:1rem !important}.column-gap-xxxl-4{column-gap:1.5rem !important}.column-gap-xxxl-5{column-gap:3rem !important}.text-xxxl-start{text-align:left !important}.text-xxxl-end{text-align:right !important}.text-xxxl-center{text-align:center !important}}@media(min-width: 1800px){.float-xxxxl-start{float:left !important}.float-xxxxl-end{float:right !important}.float-xxxxl-none{float:none !important}.object-fit-xxxxl-contain{object-fit:contain !important}.object-fit-xxxxl-cover{object-fit:cover !important}.object-fit-xxxxl-fill{object-fit:fill !important}.object-fit-xxxxl-scale{object-fit:scale-down !important}.object-fit-xxxxl-none{object-fit:none !important}.d-xxxxl-inline{display:inline !important}.d-xxxxl-inline-block{display:inline-block !important}.d-xxxxl-block{display:block !important}.d-xxxxl-grid{display:grid !important}.d-xxxxl-inline-grid{display:inline-grid !important}.d-xxxxl-table{display:table !important}.d-xxxxl-table-row{display:table-row !important}.d-xxxxl-table-cell{display:table-cell !important}.d-xxxxl-flex{display:flex !important}.d-xxxxl-inline-flex{display:inline-flex !important}.d-xxxxl-none{display:none !important}.flex-xxxxl-fill{flex:1 1 auto !important}.flex-xxxxl-row{flex-direction:row !important}.flex-xxxxl-column{flex-direction:column !important}.flex-xxxxl-row-reverse{flex-direction:row-reverse !important}.flex-xxxxl-column-reverse{flex-direction:column-reverse !important}.flex-xxxxl-grow-0{flex-grow:0 !important}.flex-xxxxl-grow-1{flex-grow:1 !important}.flex-xxxxl-shrink-0{flex-shrink:0 !important}.flex-xxxxl-shrink-1{flex-shrink:1 !important}.flex-xxxxl-wrap{flex-wrap:wrap !important}.flex-xxxxl-nowrap{flex-wrap:nowrap !important}.flex-xxxxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxxxl-start{justify-content:flex-start !important}.justify-content-xxxxl-end{justify-content:flex-end !important}.justify-content-xxxxl-center{justify-content:center !important}.justify-content-xxxxl-between{justify-content:space-between !important}.justify-content-xxxxl-around{justify-content:space-around !important}.justify-content-xxxxl-evenly{justify-content:space-evenly !important}.align-items-xxxxl-start{align-items:flex-start !important}.align-items-xxxxl-end{align-items:flex-end !important}.align-items-xxxxl-center{align-items:center !important}.align-items-xxxxl-baseline{align-items:baseline !important}.align-items-xxxxl-stretch{align-items:stretch !important}.align-content-xxxxl-start{align-content:flex-start !important}.align-content-xxxxl-end{align-content:flex-end !important}.align-content-xxxxl-center{align-content:center !important}.align-content-xxxxl-between{align-content:space-between !important}.align-content-xxxxl-around{align-content:space-around !important}.align-content-xxxxl-stretch{align-content:stretch !important}.align-self-xxxxl-auto{align-self:auto !important}.align-self-xxxxl-start{align-self:flex-start !important}.align-self-xxxxl-end{align-self:flex-end !important}.align-self-xxxxl-center{align-self:center !important}.align-self-xxxxl-baseline{align-self:baseline !important}.align-self-xxxxl-stretch{align-self:stretch !important}.order-xxxxl-first{order:-1 !important}.order-xxxxl-0{order:0 !important}.order-xxxxl-1{order:1 !important}.order-xxxxl-2{order:2 !important}.order-xxxxl-3{order:3 !important}.order-xxxxl-4{order:4 !important}.order-xxxxl-5{order:5 !important}.order-xxxxl-last{order:6 !important}.m-xxxxl-0{margin:0 !important}.m-xxxxl-1{margin:.25rem !important}.m-xxxxl-2{margin:.5rem !important}.m-xxxxl-3{margin:1rem !important}.m-xxxxl-4{margin:1.5rem !important}.m-xxxxl-5{margin:3rem !important}.m-xxxxl-auto{margin:auto !important}.mx-xxxxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxxxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxxxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxxxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxxxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxxxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxxxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxxxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxxxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxxxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxxxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxxxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxxxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxxxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxxxl-0{margin-top:0 !important}.mt-xxxxl-1{margin-top:.25rem !important}.mt-xxxxl-2{margin-top:.5rem !important}.mt-xxxxl-3{margin-top:1rem !important}.mt-xxxxl-4{margin-top:1.5rem !important}.mt-xxxxl-5{margin-top:3rem !important}.mt-xxxxl-auto{margin-top:auto !important}.me-xxxxl-0{margin-right:0 !important}.me-xxxxl-1{margin-right:.25rem !important}.me-xxxxl-2{margin-right:.5rem !important}.me-xxxxl-3{margin-right:1rem !important}.me-xxxxl-4{margin-right:1.5rem !important}.me-xxxxl-5{margin-right:3rem !important}.me-xxxxl-auto{margin-right:auto !important}.mb-xxxxl-0{margin-bottom:0 !important}.mb-xxxxl-1{margin-bottom:.25rem !important}.mb-xxxxl-2{margin-bottom:.5rem !important}.mb-xxxxl-3{margin-bottom:1rem !important}.mb-xxxxl-4{margin-bottom:1.5rem !important}.mb-xxxxl-5{margin-bottom:3rem !important}.mb-xxxxl-auto{margin-bottom:auto !important}.ms-xxxxl-0{margin-left:0 !important}.ms-xxxxl-1{margin-left:.25rem !important}.ms-xxxxl-2{margin-left:.5rem !important}.ms-xxxxl-3{margin-left:1rem !important}.ms-xxxxl-4{margin-left:1.5rem !important}.ms-xxxxl-5{margin-left:3rem !important}.ms-xxxxl-auto{margin-left:auto !important}.p-xxxxl-0{padding:0 !important}.p-xxxxl-1{padding:.25rem !important}.p-xxxxl-2{padding:.5rem !important}.p-xxxxl-3{padding:1rem !important}.p-xxxxl-4{padding:1.5rem !important}.p-xxxxl-5{padding:3rem !important}.px-xxxxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxxxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxxxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxxxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxxxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxxxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxxxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxxxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxxxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxxxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxxxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxxxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxxxl-0{padding-top:0 !important}.pt-xxxxl-1{padding-top:.25rem !important}.pt-xxxxl-2{padding-top:.5rem !important}.pt-xxxxl-3{padding-top:1rem !important}.pt-xxxxl-4{padding-top:1.5rem !important}.pt-xxxxl-5{padding-top:3rem !important}.pe-xxxxl-0{padding-right:0 !important}.pe-xxxxl-1{padding-right:.25rem !important}.pe-xxxxl-2{padding-right:.5rem !important}.pe-xxxxl-3{padding-right:1rem !important}.pe-xxxxl-4{padding-right:1.5rem !important}.pe-xxxxl-5{padding-right:3rem !important}.pb-xxxxl-0{padding-bottom:0 !important}.pb-xxxxl-1{padding-bottom:.25rem !important}.pb-xxxxl-2{padding-bottom:.5rem !important}.pb-xxxxl-3{padding-bottom:1rem !important}.pb-xxxxl-4{padding-bottom:1.5rem !important}.pb-xxxxl-5{padding-bottom:3rem !important}.ps-xxxxl-0{padding-left:0 !important}.ps-xxxxl-1{padding-left:.25rem !important}.ps-xxxxl-2{padding-left:.5rem !important}.ps-xxxxl-3{padding-left:1rem !important}.ps-xxxxl-4{padding-left:1.5rem !important}.ps-xxxxl-5{padding-left:3rem !important}.gap-xxxxl-0{gap:0 !important}.gap-xxxxl-1{gap:.25rem !important}.gap-xxxxl-2{gap:.5rem !important}.gap-xxxxl-3{gap:1rem !important}.gap-xxxxl-4{gap:1.5rem !important}.gap-xxxxl-5{gap:3rem !important}.row-gap-xxxxl-0{row-gap:0 !important}.row-gap-xxxxl-1{row-gap:.25rem !important}.row-gap-xxxxl-2{row-gap:.5rem !important}.row-gap-xxxxl-3{row-gap:1rem !important}.row-gap-xxxxl-4{row-gap:1.5rem !important}.row-gap-xxxxl-5{row-gap:3rem !important}.column-gap-xxxxl-0{column-gap:0 !important}.column-gap-xxxxl-1{column-gap:.25rem !important}.column-gap-xxxxl-2{column-gap:.5rem !important}.column-gap-xxxxl-3{column-gap:1rem !important}.column-gap-xxxxl-4{column-gap:1.5rem !important}.column-gap-xxxxl-5{column-gap:3rem !important}.text-xxxxl-start{text-align:left !important}.text-xxxxl-end{text-align:right !important}.text-xxxxl-center{text-align:center !important}}@media(min-width: 1200px){.fs-1{font-size:2.5rem !important}.fs-2{font-size:2rem !important}.fs-3{font-size:1.75rem !important}.fs-4{font-size:1.5rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !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:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/dist/css/bootstrap.min.css.map b/dist/css/bootstrap.min.css.map new file mode 100644 index 0000000..1a3964c --- /dev/null +++ b/dist/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../src/scss/custom.scss","../../src/node_modules/bootstrap/scss/mixins/_banner.scss","../../src/node_modules/bootstrap/scss/_root.scss","../../src/node_modules/bootstrap/scss/vendor/_rfs.scss","../../src/node_modules/bootstrap/scss/mixins/_color-mode.scss","../../src/node_modules/bootstrap/scss/_reboot.scss","../../src/node_modules/bootstrap/scss/_variables.scss","../../src/node_modules/bootstrap/scss/mixins/_border-radius.scss","../../src/node_modules/bootstrap/scss/_type.scss","../../src/node_modules/bootstrap/scss/mixins/_lists.scss","../../src/node_modules/bootstrap/scss/_images.scss","../../src/node_modules/bootstrap/scss/mixins/_image.scss","../../src/node_modules/bootstrap/scss/_containers.scss","../../src/node_modules/bootstrap/scss/mixins/_container.scss","../../src/node_modules/bootstrap/scss/mixins/_breakpoints.scss","../../src/node_modules/bootstrap/scss/_grid.scss","../../src/node_modules/bootstrap/scss/mixins/_grid.scss","../../src/node_modules/bootstrap/scss/_tables.scss","../../src/node_modules/bootstrap/scss/mixins/_table-variants.scss","../../src/node_modules/bootstrap/scss/forms/_labels.scss","../../src/node_modules/bootstrap/scss/forms/_form-text.scss","../../src/node_modules/bootstrap/scss/forms/_form-control.scss","../../src/node_modules/bootstrap/scss/mixins/_transition.scss","../../src/node_modules/bootstrap/scss/mixins/_gradients.scss","../../src/node_modules/bootstrap/scss/forms/_form-select.scss","../../src/node_modules/bootstrap/scss/forms/_form-check.scss","../../src/node_modules/bootstrap/scss/forms/_form-range.scss","../../src/node_modules/bootstrap/scss/forms/_floating-labels.scss","../../src/node_modules/bootstrap/scss/forms/_input-group.scss","../../src/node_modules/bootstrap/scss/mixins/_forms.scss","../../src/node_modules/bootstrap/scss/_buttons.scss","../../src/node_modules/bootstrap/scss/mixins/_buttons.scss","../../src/node_modules/bootstrap/scss/_transitions.scss","../../src/node_modules/bootstrap/scss/_dropdown.scss","../../src/node_modules/bootstrap/scss/mixins/_caret.scss","../../src/node_modules/bootstrap/scss/_button-group.scss","../../src/node_modules/bootstrap/scss/_nav.scss","../../src/node_modules/bootstrap/scss/_navbar.scss","../../src/node_modules/bootstrap/scss/_card.scss","../../src/node_modules/bootstrap/scss/_accordion.scss","../../src/node_modules/bootstrap/scss/_breadcrumb.scss","../../src/node_modules/bootstrap/scss/_pagination.scss","../../src/node_modules/bootstrap/scss/mixins/_pagination.scss","../../src/node_modules/bootstrap/scss/_badge.scss","../../src/node_modules/bootstrap/scss/_alert.scss","../../src/node_modules/bootstrap/scss/_progress.scss","../../src/node_modules/bootstrap/scss/_list-group.scss","../../src/node_modules/bootstrap/scss/_close.scss","../../src/node_modules/bootstrap/scss/_toasts.scss","../../src/node_modules/bootstrap/scss/_modal.scss","../../src/node_modules/bootstrap/scss/mixins/_backdrop.scss","../../src/node_modules/bootstrap/scss/_tooltip.scss","../../src/node_modules/bootstrap/scss/mixins/_reset-text.scss","../../src/node_modules/bootstrap/scss/_popover.scss","../../src/node_modules/bootstrap/scss/_carousel.scss","../../src/node_modules/bootstrap/scss/mixins/_clearfix.scss","../../src/node_modules/bootstrap/scss/_spinners.scss","../../src/node_modules/bootstrap/scss/_offcanvas.scss","../../src/node_modules/bootstrap/scss/_placeholders.scss","../../src/node_modules/bootstrap/scss/helpers/_color-bg.scss","../../src/node_modules/bootstrap/scss/helpers/_colored-links.scss","../../src/node_modules/bootstrap/scss/helpers/_focus-ring.scss","../../src/node_modules/bootstrap/scss/helpers/_icon-link.scss","../../src/node_modules/bootstrap/scss/helpers/_ratio.scss","../../src/node_modules/bootstrap/scss/helpers/_position.scss","../../src/node_modules/bootstrap/scss/helpers/_stacks.scss","../../src/node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../../src/node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../../src/node_modules/bootstrap/scss/helpers/_stretched-link.scss","../../src/node_modules/bootstrap/scss/helpers/_text-truncation.scss","../../src/node_modules/bootstrap/scss/mixins/_text-truncate.scss","../../src/node_modules/bootstrap/scss/helpers/_vr.scss","../../src/node_modules/bootstrap/scss/mixins/_utilities.scss","../../src/node_modules/bootstrap/scss/utilities/_api.scss"],"names":[],"mappings":"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EE,sBAGF,uBAEE,sBAPF,uBAEE,oBAGF,uBAEE,qBCrHV,OAEE,+BACA,4BACA,gCACA,6BAEA,2CACA,iCACA,gDACA,kCACA,mDACA,gEACA,kDACA,8DACA,iDACA,+DAEA,WACA,cXkYO,KWjYP,eXusB4B,IWtsB5B,0CAOA,yBACE,oBAEA,qFACA,oCACA,oBX+sB0B,uBW9sB1B,2GAGF,aACE,uBAGF,aACE,sBAIJ,qBACE,6DAOF,aACE,iBAUA,4BACE,sBAeF,gCACE,sCAGA,kCACE,sCAOJ,oCACE,sBAGF,qCACE,mBAUF,2CACE,qDACA,+CAMF,yDACE,qDACA,+CAQJ,cACE,qDACA,+CAQA,8BACE,oDACA,8CC5IF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,iBAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,cAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,aAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CDiJA,kBACE,gBACA,iCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,sBACE,gBACA,kCH3FF,6BGyFA,uBACE,gBACA,kCH3FF,6BGyFA,wBACE,gBACA,kCEnKN,YACE,cbu2BsC,Ma91BxC,gBACE,oDACA,uDACA,gBhB8QI,UALI,QgBrQR,Yb+lB4B,Ia3lB9B,mBACE,kDACA,qDhBoQI,UALI,QgB3PV,mBACE,mDACA,sDhB8PI,UALI,SiBtRV,WACE,Wd+1BsC,OHrkBlC,UALI,QiBjRR,Md+1BsC,0Bep2BxC,cACE,cACA,WACA,uBlBwRI,UALI,KkBhRR,YfkmB4B,IejmB5B,YfymB4B,IexmB5B,Mf43BsC,qBe33BtC,gBACA,iBfq3BsC,kBep3BtC,4BACA,2DdGE,sCeHE,WDMJ,0DCFI,uCDhBN,cCiBQ,iBDGN,yBACE,gBAEA,wDACE,eAKJ,oBACE,Mfs2BoC,qBer2BpC,iBfg2BoC,kBe/1BpC,af82BoC,Qe72BpC,UAKE,WfkhBkB,kCe9gBtB,2CAME,eAMA,aAKA,SAKF,qCACE,cACA,UAIF,2BACE,Mf40BoC,0Be10BpC,UAQF,uBAEE,iBf8yBoC,uBe3yBpC,UAIF,oCACE,uBACA,0BACA,kBforB0B,OenrB1B,MfsyBoC,qBiBp4BtC,iBjBqiCgC,sBer8B9B,oBACA,qBACA,mBACA,eACA,wBfgsB0B,uBe/rB1B,gBCzFE,WD0FF,mHCtFE,uCD0EJ,oCCzEM,iBDwFN,yEACE,iBf47B8B,uBen7BlC,wBACE,cACA,WACA,kBACA,gBACA,Yfwf4B,Ievf5B,Mf2xBsC,qBe1xBtC,+BACA,2BACA,sCAEA,8BACE,UAGF,gFAEE,gBACA,eAWJ,iBACE,Wf4wBsC,wDe3wBtC,qBlByII,UALI,SIvQN,yCcuIF,uCACE,qBACA,wBACA,kBfooB0B,MehoB9B,iBACE,WfgwBsC,sDe/vBtC,mBlB4HI,UALI,QIvQN,yCcoJF,uCACE,mBACA,qBACA,kBf2nB0B,KennB5B,sBACE,Wf6uBoC,yDe1uBtC,yBACE,Wf0uBoC,wDevuBtC,yBACE,WfuuBoC,sDeluBxC,oBACE,MfquBsC,KepuBtC,Of8tBsC,yDe7tBtC,QfilB4B,Qe/kB5B,mDACE,eAGF,uCACE,oBdvLA,sCc2LF,0CACE,oBd5LA,sCcgMF,2Cf8sBsC,wDe7sBtC,2Cf8sBsC,sDkB75BxC,aACE,yPAEA,cACA,WACA,uCrBqRI,UALI,KqB7QR,YlB+lB4B,IkB9lB5B,YlBsmB4B,IkBrmB5B,MlBy3BsC,qBkBx3BtC,gBACA,iBlBk3BsC,kBkBj3BtC,kFACA,4BACA,oBlB+9BkC,oBkB99BlC,gBlB+9BkC,UkB99BlC,2DjBHE,sCeHE,WESJ,0DFLI,uCEfN,aFgBQ,iBEMN,mBACE,alBs3BoC,QkBr3BpC,UAKE,WlBi+B4B,kCkB79BhC,0DAEE,clB6uB0B,OkB5uB1B,sBAGF,sBAEE,iBlBu1BoC,uBkBl1BtC,4BACE,oBACA,uCAIJ,gBACE,YlBsuB4B,OkBruB5B,elBquB4B,OkBpuB5B,alBquB4B,MHlgBxB,UALI,SIvQN,yCiB8CJ,gBACE,YlBkuB4B,MkBjuB5B,elBiuB4B,MkBhuB5B,alBiuB4B,KHtgBxB,UALI,QIvQN,yCiBwDA,kCACE,yPCxEN,YACE,cACA,WnBq6BwC,OmBp6BxC,anBq6BwC,MmBp6BxC,cnBq6BwC,QmBn6BxC,8BACE,WACA,mBAIJ,oBACE,cnB25BwC,MmB15BxC,eACA,iBAEA,sCACE,YACA,oBACA,cAIJ,kBACE,sCAEA,cACA,MnB04BwC,ImBz4BxC,OnBy4BwC,ImBx4BxC,iBACA,mBACA,gBACA,yCACA,+CACA,4BACA,2BACA,wBACA,OnB24BwC,oDmB14BxC,yBAGA,iClB3BE,oBkB+BF,8BAEE,cnBm4BsC,ImBh4BxC,yBACE,OnB03BsC,gBmBv3BxC,wBACE,anBs1BoC,QmBr1BpC,UACA,WnB8foB,kCmB3ftB,0BACE,iBnB5BM,QmB6BN,anB7BM,QmB+BN,yCAII,wPAIJ,sCAII,gKAKN,+CACE,iBnBjDM,QmBkDN,anBlDM,QmBuDJ,kPAIJ,2BACE,oBACA,YACA,QnBk2BuC,GmB31BvC,2FACE,eACA,QnBy1BqC,GmB30B3C,aACE,anBo1BgC,MmBl1BhC,+BACE,4KAEA,MnB80B8B,ImB70B9B,mBACA,0CACA,gClBjHA,kBeHE,WGsHF,qCHlHE,uCG0GJ,+BHzGM,iBGmHJ,qCACE,8JAGF,uCACE,oBnB60B4B,amBx0B1B,2JAKN,gCACE,cnBwzB8B,MmBvzB9B,eAEA,kDACE,oBACA,cAKN,mBACE,qBACA,anBsyBgC,KmBnyBlC,WACE,kBACA,sBACA,oBAIE,mDACE,oBACA,YACA,QnBspBwB,ImB/oB1B,8EACE,kLCnLN,YACE,WACA,cACA,UACA,gBACA,+BAEA,kBACE,UAIA,mDpB8gCuC,iDoB7gCvC,+CpB6gCuC,iDoB1gCzC,8BACE,SAGF,kCACE,MpB+/BuC,KoB9/BvC,OpB8/BuC,KoB7/BvC,oBACA,gBH1BF,iBjBkCQ,QoBNN,OpB6/BuC,EC1gCvC,mBeHE,WImBF,4FJfE,uCIMJ,kCJLM,iBIgBJ,yCHjCF,iBjB8hCyC,QoBx/BzC,2CACE,MpBw+B8B,KoBv+B9B,OpBw+B8B,MoBv+B9B,oBACA,OpBu+B8B,QoBt+B9B,iBpBu+B8B,uBoBt+B9B,2BnB7BA,mBmBkCF,8BACE,MpBo+BuC,KoBn+BvC,OpBm+BuC,KoBl+BvC,gBHpDF,iBjBkCQ,QoBoBN,OpBm+BuC,EC1gCvC,mBeHE,WI6CF,4FJzCE,uCIiCJ,8BJhCM,iBI0CJ,qCH3DF,iBjB8hCyC,QoB99BzC,8BACE,MpB88B8B,KoB78B9B,OpB88B8B,MoB78B9B,oBACA,OpB68B8B,QoB58B9B,iBpB68B8B,uBoB58B9B,2BnBvDA,mBmB4DF,qBACE,oBAEA,2CACE,iBpBg9BqC,0BoB78BvC,uCACE,iBpB48BqC,0BqBniC3C,eACE,kBAEA,gGAGE,OrBwiCoC,gDqBviCpC,WrBuiCoC,gDqBtiCpC,YrBuiCoC,KqBpiCtC,qBACE,kBACA,MACA,OACA,UACA,YACA,oBACA,gBACA,iBACA,uBACA,mBACA,oBACA,kDACA,qBLRE,WKSF,kDLLE,uCKTJ,qBLUM,iBKON,oEAEE,oBAEA,8FACE,oBAGF,oMAEE,YrB4gCkC,SqB3gClC,erB4gCkC,QqBzgCpC,sGACE,YrBugCkC,SqBtgClC,erBugCkC,QqBngCtC,4BACE,YrBigCoC,SqBhgCpC,erBigCoC,QqB1/BpC,mLACE,2CACA,UrB2/BkC,oDqBz/BlC,+MACE,kBACA,mBACA,WACA,OrBm/BgC,MqBl/BhC,WACA,iBrB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CA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCDkGA,aC/GA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCDkGA,YC/GA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCDkGA,WC/GA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCDkGA,UC/GA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCD4HA,qBChHA,wBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBDmGA,uBChHA,wBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBDmGA,qBChHA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBDmGA,kBChHA,wBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBDmGA,qBChHA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBDmGA,oBChHA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBDmGA,mBChHA,wBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBDmGA,kBChHA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBD+GF,UACE,0BACA,qCACA,y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E,iBAGF,qCACE,wBACA,gBAGF,oCACE,aAGF,+BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0Bf9NJ,WegOI,KAGA,iDACE,aAGF,+CACE,aACA,YACA,UACA,oBvB5LR,0BuBsIA,qBAEI,iBACA,2BAEA,iCACE,mBAEA,gDACE,kBAGF,2CACE,kDACA,iDAIJ,wCACE,iBAGF,sCACE,wBACA,gBAGF,qCACE,aAGF,gCAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0Bf9NJ,WegOI,KAGA,kDACE,aAGF,gDACE,aACA,YACA,UACA,oBAtDR,eAEI,iBACA,2BAEA,2BACE,mBAEA,0CACE,kBAGF,qCACE,kDACA,iDAIJ,kCACE,iBAGF,gCACE,wBACA,gBAGF,+BACE,aAGF,0BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0Bf9NJ,WegOI,KAGA,4CACE,aAGF,0CACE,aACA,YACA,UACA,mBAiBZ,yCAGE,6CACA,mDACA,sDACA,+BACA,8BACA,oCACA,2DACA,+QAME,0CACE,+QCzRN,MAEE,yBACA,yBACA,iCACA,wBACA,2BACA,+CACA,2DACA,iDACA,uBACA,wFACA,gCACA,8BACA,uDACA,sBACA,mBACA,kBACA,gCACA,oCACA,gCAGA,kBACA,aACA,sBACA,YACA,6BACA,2BACA,qBACA,mCACA,2BACA,qE/BjBE,2C+BqBF,SACE,eACA,cAGF,kBACE,mBACA,sBAEA,8BACE,mB/BtBF,0DACA,2D+ByBA,6BACE,sB/BbF,8DACA,6D+BmBF,8DAEE,aAIJ,WAGE,cACA,wDACA,2BAGF,YACE,4CACA,iCAGF,eACE,oDACA,gBACA,oCAGF,sBACE,gBAQA,sBACE,oCAQJ,aACE,kEACA,gBACA,+BACA,uCACA,4EAEA,yB/B7FE,wF+BkGJ,aACE,kEACA,+BACA,uCACA,yEAEA,wB/BxGE,wF+BkHJ,kBACE,qDACA,oDACA,oDACA,gBAEA,mCACE,mCACA,sCAIJ,mBACE,qDACA,oDAIF,kBACE,kBACA,MACA,QACA,SACA,OACA,2C/B1IE,iD+B8IJ,yCAGE,WAGF,wB/B3II,0DACA,2D+B+IJ,2B/BlII,8DACA,6D+B8IF,kBACE,0CxB3HA,yBwBuHJ,YAQI,aACA,mBAGA,kBAEE,YACA,gBAEA,wBACE,cACA,cAKA,mC/B3KJ,0BACA,6B+B6KM,iGAGE,0BAEF,oGAGE,6BAIJ,oC/B5KJ,yBACA,4B+B8KM,mGAGE,yBAEF,sGAGE,6BCpOZ,WAEE,2CACA,qCACA,+KACA,oDACA,oDACA,sDACA,6FACA,sCACA,mCACA,+CACA,8CACA,0OACA,uCACA,mDACA,+DACA,iPACA,4EACA,uCACA,oCACA,6DACA,sDAIF,kBACE,kBACA,aACA,mBACA,WACA,4EpC4PI,UALI,KoCrPR,oCACA,gBACA,4CACA,ShCrBE,gBgCuBF,qBjB1BI,WiB2BJ,+BjBvBI,uCiBUN,kBjBTQ,iBiBwBN,kCACE,uCACA,+CACA,gGAEA,yCACE,qDACA,iDAKJ,yBACE,cACA,yCACA,0CACA,iBACA,WACA,8CACA,4BACA,mDjBjDE,WiBkDF,wCjB9CE,uCiBqCJ,yBjBpCM,iBiBgDN,wBACE,UAGF,wBACE,UACA,UACA,oDAIJ,kBACE,gBAGF,gBACE,gCACA,wCACA,+EAEA,8BhC7DE,yDACA,0DgC+DA,kEhChEA,+DACA,gEgCoEF,oCACE,aAIF,6BhC5DE,6DACA,4DgC+DE,2EhChEF,mEACA,kEgCoEA,iDhCrEA,6DACA,4DgC0EJ,gBACE,8EASA,iCACE,eACA,chC9GA,gBgCiHA,0DACA,4DAIE,oJhCtHF,gBgC6HA,qDhC7HA,gBgCqIA,8CACE,ySACA,gTC1JN,YAEE,6BACA,6BACA,oCAEA,qBACA,gCACA,yDACA,uCACA,6DAGA,aACA,eACA,sEACA,iDrC+QI,UALI,+BqCxQR,gBACA,0FAMA,kCACE,iDAEA,0CACE,WACA,kDACA,yCACA,uFAIJ,wBACE,6CCrCJ,YAEE,mCACA,oCtC4RI,0BALI,KsCrRR,4CACA,sCACA,qDACA,qDACA,uDACA,wDACA,gDACA,2DACA,wDACA,iDACA,yEACA,mCACA,mCACA,6CACA,0DACA,oDACA,8DAGA,ahCpBA,eACA,gBgCuBF,WACE,kBACA,cACA,sEtCgQI,UALI,+BsCzPR,iCACA,qBACA,yCACA,iFnBpBI,WmBqBJ,mHnBjBI,uCmBQN,WnBPQ,iBmBkBN,iBACE,UACA,uCAEA,+CACA,qDAGF,iBACE,UACA,uCACA,+CACA,QnC2uCgC,EmC1uChC,iDAGF,qCAEE,UACA,wClBtDF,iBkBuDuB,+BACrB,sDAGF,yCAEE,0CACA,oBACA,kDACA,wDAKF,wCACE,YnC8sCgC,gCmCzsC9B,kClC9BF,0DACA,6DkCmCE,iClClDF,2DACA,8DkCkEJ,eClGE,kCACA,mCvC0RI,0BALI,QuCnRR,0DDmGF,eCtGE,kCACA,mCvC0RI,0BALI,SuCnRR,0DCFF,OAEE,6BACA,6BxCuRI,qBALI,OwChRR,4BACA,uBACA,kDAGA,qBACA,4DxC+QI,UALI,0BwCxQR,wCACA,cACA,4BACA,kBACA,mBACA,wBpCJE,4CoCSF,aACE,aAKJ,YACE,kBACA,SChCF,OAEE,2BACA,2BACA,2BACA,+BACA,0BACA,qCACA,6EACA,kDACA,+BAGA,kBACA,4DACA,4CACA,4BACA,oCACA,8BrCHE,4CqCQJ,eAEE,cAIF,YACE,YtC6kB4B,IsC5kB5B,iCAQF,mBACE,ctCs+C8B,KsCn+C9B,8BACE,kBACA,MACA,QACA,UACA,qBAQF,eACE,kDACA,2CACA,yDACA,uDAJF,iBACE,oDACA,6CACA,2DACA,yDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,YACE,+CACA,wCACA,sDACA,oDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,cACE,iDACA,0CACA,wDACA,sDAJF,aACE,gDACA,yCACA,uDACA,qDAJF,YACE,+CACA,wCACA,sDACA,oDC5DF,gCACE,yBvCyhDgC,MuCphDpC,4BAGE,2B1CkRI,wBALI,Q0C3QR,yCACA,qDACA,qDACA,8BACA,8BACA,8CAGA,aACA,iCACA,gB1CsQI,UALI,6B0C/PR,uCtCRE,+CsCaJ,cACE,aACA,sBACA,uBACA,gBACA,mCACA,kBACA,mBACA,2CvBxBI,WuByBJ,kCvBrBI,uCuBYN,cvBXQ,iBuBuBR,2NAEE,oEAGF,4BACE,iBAGF,0CACE,WAIA,uBACE,kDAGE,uCAJJ,uBAKM,gBC3DR,YAEE,4CACA,sCACA,qDACA,qDACA,uDACA,qCACA,uCACA,wDACA,6DACA,uDACA,0DACA,yDACA,0DACA,+CACA,mCACA,mCACA,6CAGA,aACA,sBAGA,eACA,gBvCXE,iDuCeJ,qBACE,qBACA,sBAEA,8CAEE,oCACA,0BASJ,wBACE,WACA,wCACA,mBAGA,4DAEE,UACA,8CACA,qBACA,sDAGF,+BACE,+CACA,uDAQJ,iBACE,kBACA,cACA,gFACA,iCACA,qBACA,yCACA,iFAEA,6BvCvDE,+BACA,gCuC0DF,4BvC7CE,mCACA,kCuCgDF,oDAEE,0CACA,oBACA,kDAIF,wBACE,UACA,wCACA,gDACA,sDAIF,kCACE,mBAEA,yCACE,sDACA,mDAaF,uBACE,mBAGE,qEvCvDJ,6DAZA,0BuCwEI,qEvCxEJ,2DAYA,4BuCiEI,+CACE,aAGF,yDACE,mDACA,oBAEA,gEACE,uDACA,oDhCtFR,yBgC8DA,0BACE,mBAGE,wEvCvDJ,6DAZA,0BuCwEI,wEvCxEJ,2DAYA,4BuCiEI,kDACE,aAGF,4DACE,mDACA,oBAEA,mEACE,uDACA,qDhCtFR,yBgC8DA,0BACE,mBAGE,wEvCvDJ,6DAZA,0BuCwEI,wEvCxEJ,2DAYA,4BuCiEI,kDACE,aAGF,4DACE,mDACA,oBAEA,mEACE,uDACA,qDhCtFR,yBgC8DA,0BACE,mBAGE,wEvCvDJ,6DAZA,0BuCwEI,wEvCxEJ,2DAYA,4BuCiEI,kDACE,aAGF,4DACE,mDACA,oBAEA,mEACE,uDACA,qDhCtFR,0BgC8DA,0BACE,mBAGE,wEvCvDJ,6DAZA,0BuCwEI,wEvCxEJ,2DAYA,4BuCiEI,kDACE,aAGF,4DACE,mDACA,oBAEA,mEACE,uDACA,qDhCtFR,0BgC8DA,2BACE,mBAGE,yEvCvDJ,6DAZA,0BuCwEI,yEvCxEJ,2DAYA,4BuCiEI,mDACE,aAGF,6DACE,mDACA,oBAEA,oEACE,uDACA,qDhCtFR,0BgC8DA,4BACE,mBAGE,0EvCvDJ,6DAZA,0BuCwEI,0EvCxEJ,2DAYA,4BuCiEI,oDACE,aAGF,8DACE,mDACA,oBAEA,qEACE,uDACA,qDhCtFR,0BgC8DA,6BACE,mBAGE,2EvCvDJ,6DAZA,0BuCwEI,2EvCxEJ,2DAYA,4BuCiEI,qDACE,aAGF,+DACE,mDACA,oBAEA,sEACE,uDACA,qDAcZ,kBvChJI,gBuCmJF,mCACE,mDAEA,8CACE,sBAaJ,yBACE,uDACA,gDACA,8DACA,6DACA,iEACA,8DACA,kEACA,0DACA,2DACA,qEAVF,2BACE,yDACA,kDACA,gEACA,6DACA,mEACA,8DACA,oEACA,4DACA,6DACA,uEAVF,yBACE,uDACA,gDACA,8DACA,6DACA,iEACA,8DACA,kEACA,0DACA,2DACA,qEAVF,sBACE,oDACA,6CACA,2DACA,6DACA,8DACA,8DACA,+DACA,uDACA,wDACA,kEAVF,yBACE,uDACA,gDACA,8DACA,6DACA,iEACA,8DACA,kEACA,0DACA,2DACA,qEAVF,wBACE,sDACA,+CACA,6DACA,6DACA,gEACA,8DACA,iEACA,yDACA,0DACA,oEAVF,uBACE,qDACA,8CACA,4DACA,6DACA,+DACA,8DACA,gEACA,wDACA,yDACA,mEAVF,sBACE,oDACA,6CACA,2DACA,6DACA,8DACA,8DACA,+DACA,uDACA,wDACA,kEC5LJ,WAEE,2BACA,qVACA,4BACA,mCACA,oEACA,gCACA,sCACA,wEAGA,uBACA,MzCqpD2B,IyCppD3B,OzCopD2B,IyCnpD3B,oBACA,gCACA,0EACA,SxCJE,sBwCMF,oCAGA,iBACE,gCACA,qBACA,0CAGF,iBACE,UACA,4CACA,0CAGF,wCAEE,oBACA,iBACA,6CAQJ,iBAHE,wCASE,gCATF,wCCjDF,OAEE,wBACA,8BACA,6BACA,2BACA,4B7CyRI,qBALI,S6ClRR,mBACA,iDACA,gDACA,4DACA,kDACA,4CACA,mDACA,wDACA,mEAGA,gCACA,e7C2QI,UALI,0B6CpQR,4BACA,oBACA,oCACA,4BACA,uEACA,sCzCRE,4CyCWF,eACE,UAGF,kBACE,aAIJ,iBACE,wBAEA,kBACA,+BACA,kBACA,eACA,oBAEA,mCACE,sCAIJ,cACE,aACA,mBACA,4DACA,mCACA,2CACA,4BACA,qFzChCE,0FACA,2FyCkCF,yBACE,kDACA,sCAIJ,YACE,kCACA,qBC9DF,OAEE,wBACA,wBACA,yBACA,0BACA,mBACA,iCACA,4DACA,gDACA,qDACA,+CACA,4FACA,kCACA,kCACA,qCACA,uDACA,uDACA,kCACA,8BACA,uBACA,uDACA,uDAGA,eACA,MACA,OACA,+BACA,aACA,WACA,YACA,kBACA,gBAGA,UAOF,cACE,kBACA,WACA,8BAEA,oBAGA,0B3B5CI,W2B6CF,uBACA,U3Ck8CgC,oBgB5+C9B,uC2BwCJ,0B3BvCM,iB2B2CN,0BACE,U3Cg8CgC,K2C57ClC,kCACE,U3C67CgC,Y2Cz7CpC,yBACE,6CAEA,wCACE,gBACA,gBAGF,qCACE,gBAIJ,uBACE,aACA,mBACA,iDAIF,eACE,kBACA,aACA,sBACA,WAEA,4BACA,oBACA,oCACA,4BACA,uE1CrFE,4C0CyFF,UAIF,gBAEE,2BACA,uBACA,2BClHA,eACA,MACA,OACA,QDkH0B,0BCjH1B,YACA,aACA,iBD+G4D,sBC5G5D,+BACA,6BD2G0F,2BAK5F,cACE,aACA,cACA,mBACA,uCACA,4F1CrGE,2DACA,4D0CuGF,yBACE,4FACA,gJAKJ,aACE,gBACA,8CAKF,YACE,kBAGA,cACA,gCAIF,cACE,aACA,cACA,eACA,mBACA,yBACA,sEACA,2CACA,yF1CzHE,+DACA,8D0C8HF,gBACE,2CnC3GA,yBmCiHF,OACE,2BACA,4CAIF,cACE,gCACA,kBACA,iBAGF,UACE,yBnC9HA,yBmCmIF,oBAEE,yBnCrIA,0BmC0IF,UACE,0BAUA,kBACE,YACA,eACA,YACA,SAEA,iCACE,YACA,S1CzMJ,gB0C6ME,gE1C7MF,gB0CkNE,8BACE,gBnC1JJ,4BmCwIA,0BACE,YACA,eACA,YACA,SAEA,yCACE,YACA,S1CzMJ,gB0C6ME,gF1C7MF,gB0CkNE,sCACE,iBnC1JJ,4BmCwIA,0BACE,YACA,eACA,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AiEM,4BACA,+BACA,0CAEA,gCACE,aAGF,8BACE,aACA,YACA,UACA,mBAEA,2C3CnCN,4B2C5CF,cAEI,eACA,SACA,mCACA,aACA,sBACA,eACA,gCACA,kBACA,wCACA,4BACA,UnC5BA,WmC8BA,gCnC1BA,gEmCYJ,cnCXM,iBRuDJ,4B2C5BE,8BACE,MACA,OACA,gCACA,qFACA,4BAGF,4BACE,MACA,QACA,gCACA,oFACA,2BAGF,4BACE,MACA,QACA,OACA,kCACA,gBACA,sFACA,4BAGF,+BACE,QACA,OACA,kCACA,gBACA,mFACA,2BAGF,sDAEE,eAGF,8DAGE,oB3C5BJ,yB2C/BF,cAiEM,4BACA,+BACA,0CAEA,gCACE,aAGF,8BACE,aACA,YACA,UACA,mBAEA,2C3CnCN,4B2C5CF,cAEI,eACA,SACA,mCACA,aACA,sBACA,eACA,gCACA,kBACA,wCACA,4BACA,UnC5BA,WmC8BA,gCnC1BA,gEmCYJ,cnCXM,iBRuDJ,4B2C5BE,8BACE,MACA,OACA,gCACA,qFACA,4BAGF,4BACE,MACA,QACA,gCACA,oFACA,2BAGF,4BACE,MACA,QACA,OACA,kCACA,gBACA,sFACA,4BAGF,+BACE,QACA,OACA,kCACA,gBACA,mFACA,2BAGF,sDAEE,eAGF,8DAGE,oB3C5BJ,yB2C/BF,cAiEM,4BACA,+BACA,0CAEA,gCACE,aAGF,8BACE,aACA,YACA,UACA,mBAEA,2C3CnCN,6B2C5CF,cAEI,eACA,SACA,mCACA,aACA,sBACA,eACA,gCACA,kBACA,wCACA,4BACA,UnC5BA,WmC8BA,gCnC1BA,iEmCYJ,cnCXM,iBRuDJ,6B2C5BE,8BACE,MACA,OACA,gCACA,qFACA,4BAGF,4BACE,MACA,QACA,gCACA,oFACA,2BAGF,4BACE,MACA,QACA,OACA,kCACA,gBACA,sFACA,4BAGF,+BACE,QACA,OACA,kCACA,gBACA,mFACA,2BAGF,sDAEE,eAGF,8DAGE,oB3C5BJ,0B2C/BF,cAiEM,4BACA,+BACA,0CAEA,gCACE,aAGF,8BACE,aACA,YACA,UACA,mBAEA,2C3CnCN,6B2C5CF,eAEI,eACA,SACA,mCACA,aACA,sBACA,eACA,gCACA,kBACA,wCACA,4BACA,UnC5BA,WmC8BA,gCnC1BA,iEmCYJ,enCXM,iBRuDJ,6B2C5BE,+BACE,MACA,OACA,gCACA,qFACA,4BAGF,6BACE,MACA,QACA,gCACA,oFACA,2BAGF,6BACE,MACA,QACA,OACA,kCACA,gBACA,sFACA,4BAGF,gCACE,QACA,OACA,kCACA,gBACA,mFACA,2BAGF,wDAEE,eAGF,iEAGE,oB3C5BJ,0B2C/BF,eAiEM,4BACA,+BACA,0CAEA,iCACE,aAGF,+BACE,aACA,YACA,UACA,mBAEA,2C3CnCN,6B2C5CF,gBAEI,eACA,SACA,mCACA,aACA,sBACA,eACA,gCACA,kBACA,wCACA,4BACA,UnC5BA,WmC8BA,gCnC1BA,iEmCYJ,gBnCXM,iBRuDJ,6B2C5BE,gCACE,MACA,OACA,gCACA,qFACA,4BAGF,8BACE,MACA,QACA,gCACA,oFACA,2BAGF,8BACE,MACA,QACA,OACA,kCACA,gBACA,sFACA,4BAGF,iCACE,QACA,OACA,kCACA,gBACA,mFACA,2BAGF,0DAEE,eAGF,oEAGE,oB3C5BJ,0B2C/BF,gBAiEM,4BACA,+BACA,0CAEA,kCACE,aAGF,gCACE,aACA,YACA,UACA,mBAEA,2C3CnCN,6B2C5CF,iBAEI,eACA,SACA,mCACA,aACA,sBACA,eACA,gCACA,kBACA,wCACA,4BACA,UnC5BA,WmC8BA,gCnC1BA,iEmCYJ,iBnCXM,iBRuDJ,6B2C5BE,iCACE,MACA,OACA,gCACA,qFACA,4BAGF,+BACE,MACA,QACA,gCACA,oFACA,2BAGF,+BACE,MACA,QACA,OACA,kCACA,gBACA,sFACA,4BAGF,kCACE,QACA,OACA,kCACA,gBACA,mFACA,2BAGF,4DAEE,eAGF,uEAGE,oB3C5BJ,0B2C/BF,iBAiEM,4BACA,+BACA,0CAEA,mCACE,aAGF,iCACE,aACA,YACA,UACA,mBAEA,2CA/ER,WAEI,eACA,SACA,mCACA,aACA,sBACA,eACA,gCACA,kBACA,wCACA,4BACA,UnC5BA,WmC8BA,+BnC1BA,uCmCYJ,WnCXM,iBmC2BF,2BACE,MACA,OACA,gCACA,qFACA,4BAGF,yBACE,MACA,QACA,gCACA,oFACA,2BAGF,yBACE,MACA,QACA,OACA,kCACA,gBACA,sFACA,4BAGF,4BACE,QACA,OACA,kCACA,gBACA,mFACA,2BAGF,gDAEE,eAGF,qDAGE,mBA2BR,oBPpHE,eACA,MACA,OACA,Q5C0mCkC,K4CzmClC,YACA,aACA,iB5CUS,K4CPT,mCACA,iC5Cm+CkC,GmDr3CpC,kBACE,aACA,mBACA,oEAEA,6BACE,sFACA,uIAIJ,iBACE,gBACA,kDAGF,gBACE,YACA,oEACA,gBC7IF,aACE,qBACA,eACA,sBACA,YACA,8BACA,QpDgzCkC,GoD9yClC,yBACE,qBACA,WAKJ,gBACE,gBAGF,gBACE,gBAGF,gBACE,iBAKA,+BACE,mDAIJ,4BACE,IACE,QpDmxCgC,IoD/wCpC,kBACE,+EACA,oBACA,8CAGF,4BACE,KACE,wBH9CF,iBACE,cACA,WACA,WIHF,iBACE,sBACA,iFAFF,mBACE,sBACA,mFAFF,iBACE,sBACA,iFAFF,cACE,sBACA,8EAFF,iBACE,sBACA,iFAFF,gBACE,sBACA,gFAFF,eACE,sBACA,+EAFF,cACE,sBACA,8ECFF,cACE,wEACA,kGAGE,wCAGE,8DACA,wFATN,gBACE,0EACA,oGAGE,4CAGE,8DACA,wFATN,cACE,wEACA,kGAGE,wCAGE,8DACA,wFATN,WACE,qEACA,+FAGE,kCAGE,+DACA,yFATN,cACE,wEACA,kGAGE,wCAGE,+DACA,yFATN,aACE,uEACA,iGAGE,sCAGE,8DACA,wFATN,YACE,sEACA,gGAGE,oCAGE,gEACA,0FATN,WACE,qEACA,+FAGE,kCAGE,6DACA,uFAOR,oBACE,+EACA,yGAGE,oDAEE,kFACA,4GC1BN,kBACE,UAEA,kJCHF,WACE,oBACA,IxD6c4B,QwD5c5B,mBACA,kFACA,sBxD2c4B,MwD1c5B,2BAEA,eACE,cACA,MxDuc0B,IwDtc1B,OxDsc0B,IwDrc1B,kBxCIE,WwCHF,0BxCOE,uCwCZJ,exCaM,iBw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","file":"bootstrap.min.css"} \ No newline at end of file diff --git a/dist/css/main.css b/dist/css/main.css new file mode 100644 index 0000000..c83b532 --- /dev/null +++ b/dist/css/main.css @@ -0,0 +1,272 @@ +:root { + /* + Color Palette + https://coolors.co/palette/033270-1368aa-4091c9-9dcee2-fedfd4-f29479-f26a4f-ef3c2d-cb1b16-65010c + --yale-blue: #033270ff; + --green-blue: #1368aaff; + --celestial-blue: #4091c9ff; + --light-blue: #9dcee2ff; + --misty-rose: #fedfd4ff; + --salmon: #f29479ff; + --tomato: #f26a4fff; + --vermilion: #ef3c2dff; + --engineering-orange: #cb1b16ff; + --rosewood: #65010cff; + */ + --split-foreground: #000000; + /* Combination of Salmon/Tomato */ + --split-background: #F27F64; + --join-foreground: #000000; + /* Combination of Light/Celestial Blue */ + --join-background: #6FB0D6; + + /* Color Palettes for subnet highlights + https://coolors.co/palette/f0d7df-f9e0e2-f8eaec-f7ddd9-f7e6da-e3e9dd-c4dbd9-d4e5e3-cae0e4-c8c7d6 + https://coolors.co/palette/54478c-2c699a-048ba8-0db39e-16db93-83e377-b9e769-efea5a-f1c453-f29e4c + https://coolors.co/palette/e2e2df-d2d2cf-e2cfc4-f7d9c4-faedcb-c9e4de-c6def1-dbcdf0-f2c6de-f9c6c9 + https://coolors.co/palette/54478c-2c699a-048ba8-0db39e-16db93-83e377-b9e769-efea5a-f1c453-f29e4c + https://coolors.co/palette/ffadad-ffd6a5-fdffb6-caffbf-9bf6ff-a0c4ff-bdb2ff-ffc6ff-e6e6e6 + */ + --subpal-1-1: #ffadadff; + --subpal-1-2: #ffd6a5ff; + --subpal-1-3: #fdffb6ff; + --subpal-1-4: #caffbfff; + --subpal-1-5: #9bf6ffff; + --subpal-1-6: #a0c4ffff; + --subpal-1-7: #bdb2ffff; + --subpal-1-8: #ffc6ffff; + --subpal-1-9: #e6e6e6ff; + --subpal-1-10: #ffffffff; +} + +.table>:not(caption)>*>* { + background-color: unset; +} + +#bottom_nav { + height:2rem; +} + +#bottom_nav span { + border-bottom:1px black dotted; +} + +#whats_new { + cursor:pointer !important; + text-align: right; + width:15rem; + float:right; +} + +#whats_new a { + width:15rem; + text-align: right; + text-decoration: none; + border-bottom:1px var(--bs-success) dotted; +} + + +#copy_url { + cursor:pointer !important; + text-align: center; + width:11rem; +} + +#copy_url span { + width:11rem; + text-align: center; +} + +#color_palette { + min-width: 0rem; +} + +#color_palette #colors_word_close { + line-height: 2rem; + cursor:pointer; +} + +#color_palette #colors_word_open { + display:inline-block; + height:2rem; + cursor:pointer; + white-space: nowrap; +} + +#color_palette div { + display:inline-block; + height:2rem; + cursor:pointer; + white-space: nowrap; +} + +#color_palette div[id^='palette_picker_'] { + width:2rem; + border:1px solid; +} + +#color_palette #palette_picker_1 { + background-color: var(--subpal-1-1); +} +#color_palette #palette_picker_2 { + background-color: var(--subpal-1-2); +} +#color_palette #palette_picker_3 { + background-color: var(--subpal-1-3); +} +#color_palette #palette_picker_4 { + background-color: var(--subpal-1-4); +} +#color_palette #palette_picker_5 { + background-color: var(--subpal-1-5); +} +#color_palette #palette_picker_6 { + background-color: var(--subpal-1-6); +} +#color_palette #palette_picker_7 { + background-color: var(--subpal-1-7); +} +#color_palette #palette_picker_8 { + background-color: var(--subpal-1-8); +} +#color_palette #palette_picker_9 { + background-color: var(--subpal-1-9); +} +#color_palette #palette_picker_10 { + background-color: var(--subpal-1-10); +} + +.container-xxl { + min-width: 576px; +} + +#navigation a { + color:#000000; + text-decoration: none; +} + +#subnet_input #network { + flex-grow: 0; + flex-basis: 11rem; +} +#subnet_input #netsize { + flex-grow: 0; + flex-basis: 4rem; +} + +#calc { + vertical-align: middle; +} + +#calc>tbody>tr>td, #calc>tbody>tr>th, #calc>tfoot>tr>td, #calc>tfoot>tr>th, #calc>thead>tr>td, #calc>thead>tr>th { + /* Equivalent to p-1 */ + padding: 0.25rem; + /* Equivalent to p-2 */ + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +/* +#joinHeader { + border:none; +} + +#calc thead { + border-right-width: 1px; + border-bottom-width: 0px; +}*/ + +#calc span.split { + color: var(--split-background); +} + +#calc span.join { + color: var(--join-background); +} + +#calc td.split { + background-color: var(--split-background); + color: var(--split-foreground); + cursor: pointer; + min-width: 2.3rem; + width: 1%; + font-size:1rem; +} + +#notifyModal .modal-content { + background-color: var(--bs-alert-bg); +} + +#calc td.join { + background-color: var(--join-background); + color: var(--join-foreground); + cursor: pointer; + min-width: 2.3rem; + width: 1%; + font-size:1rem; +} + +#calc td.split, #calc td.join { + padding: 0; +} + +#calc td.split span, #calc td.join span { + padding-right: 0.4rem; +} +#calc .note { + padding-left:0.5rem; + padding-right:0.5rem; +} + +#calc .note label,input { + width: 100%; +} + +#calc .row_address { + white-space: nowrap; + padding-left:0.5rem; + padding-right:0.5rem; +} + +#calc .row_range { + /* TODO: Make this a checkbox? + white-space: nowrap; + */ + padding-left:0.5rem; + padding-right:0.5rem; +} + +#calc .row_usable { + /* TODO: Make this a checkbox? + white-space: nowrap; + */ + padding-left:0.5rem; + padding-right:0.5rem; +} + +#calc .row_hosts { + width:1%; + white-space: nowrap; + padding-left:0.5rem; + padding-right:0.5rem; +} + + +#calc .note input { + border: none !important; + border-color: transparent !important; + background-color: transparent; +} + +/* https://stackoverflow.com/a/47245068/606974 */ +.rotate { + vertical-align: middle; + text-align: end; +} +.rotate span { + -ms-writing-mode: tb-rl; + -webkit-writing-mode: vertical-rl; + writing-mode: vertical-rl; + white-space: nowrap; + padding-top: 0.25rem; +} diff --git a/dist/favicon.ico b/dist/favicon.ico new file mode 100644 index 0000000..553e1b8 Binary files /dev/null and b/dist/favicon.ico differ diff --git a/dist/icon/android-chrome-192x192.png b/dist/icon/android-chrome-192x192.png new file mode 100644 index 0000000..ad02a35 Binary files /dev/null and b/dist/icon/android-chrome-192x192.png differ diff --git a/dist/icon/android-chrome-512x512.png b/dist/icon/android-chrome-512x512.png new file mode 100644 index 0000000..effcdab Binary files /dev/null and b/dist/icon/android-chrome-512x512.png differ diff --git a/dist/icon/apple-touch-icon.png b/dist/icon/apple-touch-icon.png new file mode 100644 index 0000000..57b5d52 Binary files /dev/null and b/dist/icon/apple-touch-icon.png differ diff --git a/dist/icon/browserconfig.xml b/dist/icon/browserconfig.xml new file mode 100644 index 0000000..a25e942 --- /dev/null +++ b/dist/icon/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/dist/icon/favicon-16x16.png b/dist/icon/favicon-16x16.png new file mode 100644 index 0000000..7656957 Binary files /dev/null and b/dist/icon/favicon-16x16.png differ diff --git a/dist/icon/favicon-32x32.png b/dist/icon/favicon-32x32.png new file mode 100644 index 0000000..e767c9a Binary files /dev/null and b/dist/icon/favicon-32x32.png differ diff --git a/dist/icon/mstile-150x150.png b/dist/icon/mstile-150x150.png new file mode 100644 index 0000000..acf262d Binary files /dev/null and b/dist/icon/mstile-150x150.png differ diff --git a/dist/icon/safari-pinned-tab.svg b/dist/icon/safari-pinned-tab.svg new file mode 100644 index 0000000..481ea96 --- /dev/null +++ b/dist/icon/safari-pinned-tab.svg @@ -0,0 +1,32 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + + diff --git a/dist/icon/site.webmanifest b/dist/icon/site.webmanifest new file mode 100644 index 0000000..197232a --- /dev/null +++ b/dist/icon/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "Visual Subnet Calc", + "short_name": "Visual Subnet Calc", + "icons": [ + { + "src": "icon/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icon/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 0000000..71dfc96 --- /dev/null +++ b/dist/index.html @@ -0,0 +1,237 @@ + + + + + + Visual Subnet Calculator - Split/Join + + + + + + + + + + + + + +
+ +

Visual Subnet Calculator

+ +
+
+
+
+
+
+
+
/
+
+
+
+
+
+
+
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Subnet AddressRange of AddressesUsable IPsHosts + Note +
Split/Join
+
Loading...
+
+
Change Colors »
+
+
+
+
+
+
+
+
+
+
+
+
+
« Stop Changing Colors
+
Copy Shareable URL
+ +
+ + + + + + + + + + + + + + + +
+ + diff --git a/dist/js/lz-string.min.js b/dist/js/lz-string.min.js new file mode 100644 index 0000000..f7c26ae --- /dev/null +++ b/dist/js/lz-string.min.js @@ -0,0 +1 @@ +var LZString=function(){var r=String.fromCharCode,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",e={};function t(r,o){if(!e[r]){e[r]={};for(var n=0;n>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null==o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;e>=1}else{for(t=1,e=0;e>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e>=1;0==--l&&(l=Math.pow(2,h),h++),s[p]=f++,c=String(a)}if(""!==c){if(Object.prototype.hasOwnProperty.call(u,c)){if(c.charCodeAt(0)<256){for(e=0;e>=1}else{for(t=1,e=0;e>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e>=1;0==--l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;e>=1;for(;;){if(m<<=1,v==o-1){d.push(n(m));break}v++}return d.join("")},decompress:function(r){return null==r?"":""==r?null:i._decompress(r.length,32768,function(o){return r.charCodeAt(o)})},_decompress:function(o,n,e){var t,i,s,u,a,p,c,l=[],f=4,h=4,d=3,m="",v=[],g={val:e(0),position:n,index:1};for(t=0;t<3;t+=1)l[t]=t;for(s=0,a=Math.pow(2,2),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 2:return""}for(l[3]=c,i=c,v.push(c);;){if(g.index>o)return"";for(s=0,a=Math.pow(2,d),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(c=s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 2:return v.join("")}if(0==f&&(f=Math.pow(2,d),d++),l[c])m=l[c];else{if(c!==h)return null;m=i+i.charAt(0)}v.push(m),l[h++]=i+m.charAt(0),i=m,0==--f&&(f=Math.pow(2,d),d++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString}); \ No newline at end of file diff --git a/dist/js/main.js b/dist/js/main.js new file mode 100644 index 0000000..b587241 --- /dev/null +++ b/dist/js/main.js @@ -0,0 +1,933 @@ +let subnetMap = {}; +let subnetNotes = {}; +let maxNetSize = 0; +let infoColumnCount = 5 +// NORMAL mode: +// - Smallest subnet: /32 +// - Two reserved addresses per subnet of size <= 30: +// - Net+0 = Network Address +// - Last = Broadcast Address +// AWS mode: +// - Smallest subnet: /28 +// - Two reserved addresses per subnet: +// - Net+0 = Network Address +// - Net+1 = AWS Reserved - VPC Router +// - Net+2 = AWS Reserved - VPC DNS +// - Net+3 = AWS Reserved - Future Use +// - Last = Broadcast Address +// Azure mode: +// - Smallest subnet: /29 +// - Two reserved addresses per subnet: +// - Net+0 = Network Address +// - Net+1 = Reserved - Default Gateway +// - Net+2 = Reserved - DNS Mapping +// - Net+3 = Reserved - DNS Mapping +// - Last = Broadcast Address +let noteTimeout; +let operatingMode = 'Standard' +let previousOperatingMode = 'Standard' +let inflightColor = 'NONE' +let urlVersion = '1' +let configVersion = '2' + +const netsizePatterns = { + Standard: '^([12]?[0-9]|3[0-2])$', + AZURE: '^([12]?[0-9])$', + AWS: '^(1?[0-9]|2[0-8])$', +}; + +const minSubnetSizes = { + Standard: 32, + AZURE: 29, + AWS: 28, +}; + +$('input#network').on('paste', function (e) { + let pastedData = window.event.clipboardData.getData('text') + if (pastedData.includes('/')) { + let [network, netSize] = pastedData.split('/') + $('#network').val(network) + $('#netsize').val(netSize) + } + e.preventDefault() +}); + +$("input#network").on('keydown', function (e) { + if (e.key === '/') { + e.preventDefault() + $('input#netsize').focus().select() + } +}); + +$('input#network,input#netsize').on('input', function() { + $('#input_form')[0].classList.add('was-validated'); +}) + +$('#color_palette div').on('click', function() { + // We don't really NEED to convert this to hex, but it's really low overhead to do the + // conversion here and saves us space in the export/save + inflightColor = rgba2hex($(this).css('background-color')) +}) + +$('#calcbody').on('click', '.row_address, .row_range, .row_usable, .row_hosts, .note, input', function(event) { + if (inflightColor !== 'NONE') { + mutate_subnet_map('color', this.dataset.subnet, '', inflightColor) + // We could re-render here, but there is really no point, keep performant and just change the background color now + //renderTable(); + $(this).closest('tr').css('background-color', inflightColor) + } +}) + +$('#btn_go').on('click', function() { + $('#input_form').removeClass('was-validated'); + $('#input_form').validate(); + if ($('#input_form').valid()) { + $('#input_form')[0].classList.add('was-validated'); + reset(); + // Additional actions upon validation can be added here + } else { + show_warning_modal('
Please correct the errors in the form!
'); + } + +}) + +$('#dropdown_standard').click(function() { + previousOperatingMode = operatingMode; + operatingMode = 'Standard'; + + if(!switchMode(operatingMode)) { + operatingMode = previousOperatingMode; + $('#dropdown_'+ operatingMode.toLowerCase()).addClass('active'); + } + +}); + +$('#dropdown_azure').click(function() { + previousOperatingMode = operatingMode; + operatingMode = 'AZURE'; + + if(!switchMode(operatingMode)) { + operatingMode = previousOperatingMode; + $('#dropdown_'+ operatingMode.toLowerCase()).addClass('active'); + } + +}); + +$('#dropdown_aws').click(function() { + previousOperatingMode = operatingMode; + operatingMode = 'AWS'; + + if(!switchMode(operatingMode)) { + operatingMode = previousOperatingMode; + $('#dropdown_'+ operatingMode.toLowerCase()).addClass('active'); + } +}); + + +$('#importBtn').on('click', function() { + importConfig(JSON.parse($('#importExportArea').val())) +}) + +$('#bottom_nav #colors_word_open').on('click', function() { + $('#bottom_nav #color_palette').removeClass('d-none'); + $('#bottom_nav #colors_word_close').removeClass('d-none'); + $('#bottom_nav #colors_word_open').addClass('d-none'); +}) + +$('#bottom_nav #colors_word_close').on('click', function() { + $('#bottom_nav #color_palette').addClass('d-none'); + $('#bottom_nav #colors_word_close').addClass('d-none'); + $('#bottom_nav #colors_word_open').removeClass('d-none'); + inflightColor = 'NONE' +}) + +$('#bottom_nav #copy_url').on('click', function() { + // TODO: Provide a warning here if the URL is longer than 2000 characters, probably using a modal. + let url = window.location.origin + getConfigUrl() + navigator.clipboard.writeText(url); + $('#bottom_nav #copy_url span').text('Copied!') + // Swap the text back after 3sec + setTimeout(function(){ + $('#bottom_nav #copy_url span').text('Copy Shareable URL') + }, 2000) +}) + +$('#btn_import_export').on('click', function() { + $('#importExportArea').val(JSON.stringify(exportConfig(false), null, 2)) +}) + +function reset() { + + set_usable_ips_title(operatingMode); + + let cidrInput = $('#network').val() + '/' + $('#netsize').val() + let rootNetwork = get_network($('#network').val(), $('#netsize').val()) + let rootCidr = rootNetwork + '/' + $('#netsize').val() + if (cidrInput !== rootCidr) { + show_warning_modal('
Your network input is not on a network boundary for this network size. It has been automatically changed:
' + $('#network').val() + ' -> ' + rootNetwork + '
') + $('#network').val(rootNetwork) + cidrInput = $('#network').val() + '/' + $('#netsize').val() + } + if (Object.keys(subnetMap).length > 0) { + // This page already has data imported, so lets see if we can just change the range + if (isMatchingSize(Object.keys(subnetMap)[0], cidrInput)) { + subnetMap = changeBaseNetwork(cidrInput) + } else { + // This is a page with existing data of a different subnet size, so make it blank + // Could be an opportunity here to do the following: + // - Prompt the user to confirm they want to clear the existing data + // - Resize the existing data anyway by making the existing network a subnetwork of their new input (if it + // is a larger network), or by just trimming the network to the new size (if it is a smaller network), + // or even resizing all of the containing networks by change in size of the base network. For example a + // base network going from /16 -> /18 would be all containing networks would be resized smaller (/+2), + // or bigger (/-2) if going from /18 -> /16. + subnetMap = {} + subnetMap[rootCidr] = {} + } + } else { + // This is a fresh page load with no existing data + subnetMap[rootCidr] = {} + } + maxNetSize = parseInt($('#netsize').val()) + renderTable(operatingMode); +} + +function changeBaseNetwork(newBaseNetwork) { + // Minifiy it, to make all the keys in the subnetMap relative to their original base network + // Then expand it, but with the new CIDR as the base network, effectively converting from old to new. + let miniSubnetMap = {} + minifySubnetMap(miniSubnetMap, subnetMap, Object.keys(subnetMap)[0]) + let newSubnetMap = {} + expandSubnetMap(newSubnetMap, miniSubnetMap, newBaseNetwork) + return newSubnetMap +} + +function isMatchingSize(subnet1, subnet2) { + return subnet1.split('/')[1] === subnet2.split('/')[1]; +} + +$('#calcbody').on('click', 'td.split,td.join', function(event) { + // HTML DOM Data elements! Yay! See the `data-*` attributes of the HTML tags + mutate_subnet_map(this.dataset.mutateVerb, this.dataset.subnet, '') + renderTable(operatingMode); +}) + +$('#calcbody').on('keyup', 'td.note input', function(event) { + // HTML DOM Data elements! Yay! See the `data-*` attributes of the HTML tags + let delay = 1000; + clearTimeout(noteTimeout); + noteTimeout = setTimeout(function(element) { + mutate_subnet_map('note', element.dataset.subnet, '', element.value) + }, delay, this); +}) + +$('#calcbody').on('focusout', 'td.note input', function(event) { + // HTML DOM Data elements! Yay! See the `data-*` attributes of the HTML tags + clearTimeout(noteTimeout); + mutate_subnet_map('note', this.dataset.subnet, '', this.value) +}) + + +function renderTable(operatingMode) { + // TODO: Validation Code + $('#calcbody').empty(); + let maxDepth = get_dict_max_depth(subnetMap, 0) + addRowTree(subnetMap, 0, maxDepth, operatingMode) +} + +function addRowTree(subnetTree, depth, maxDepth,operatingMode) { + for (let mapKey in subnetTree) { + if (mapKey.startsWith('_')) { continue; } + if (has_network_sub_keys(subnetTree[mapKey])) { + addRowTree(subnetTree[mapKey], depth + 1, maxDepth,operatingMode) + } else { + let subnet_split = mapKey.split('/') + let notesWidth = '30%'; + if ((maxDepth > 5) && (maxDepth <= 10)) { + notesWidth = '25%'; + } else if ((maxDepth > 10) && (maxDepth <= 15)) { + notesWidth = '20%'; + } else if ((maxDepth > 15) && (maxDepth <= 20)) { + notesWidth = '15%'; + } else if (maxDepth > 20) { + notesWidth = '10%'; + } + addRow(subnet_split[0], parseInt(subnet_split[1]), (infoColumnCount + maxDepth - depth), (subnetTree[mapKey]['_note'] || ''), notesWidth, (subnetTree[mapKey]['_color'] || ''),operatingMode) + } + } +} + +function addRow(network, netSize, colspan, note, notesWidth, color, operatingMode) { + let addressFirst = ip2int(network) + let addressLast = subnet_last_address(addressFirst, netSize) + let usableFirst = subnet_usable_first(addressFirst, netSize, operatingMode) + let usableLast = subnet_usable_last(addressFirst, netSize) + let hostCount = 1 + usableLast - usableFirst + let styleTag = '' + if (color !== '') { + styleTag = ' style="background-color: ' + color + '"' + } + + let rangeCol, usableCol; + if (netSize < 32) { + rangeCol = int2ip(addressFirst) + ' - ' + int2ip(addressLast); + usableCol = int2ip(usableFirst) + ' - ' + int2ip(usableLast); + } else { + rangeCol = int2ip(addressFirst); + usableCol = int2ip(usableFirst); + } + let rowId = 'row_' + network.replace('.', '-') + '_' + netSize + let rowCIDR = network + '/' + netSize + let newRow = + ' \n' + + ' ' + rowCIDR + '\n' + + ' ' + rangeCol + '\n' + + ' ' + usableCol + '\n' + + ' ' + hostCount + '\n' + + ' \n' + + ' /' + netSize + '\n' + if (netSize > maxNetSize) { + // This is wrong. Need to figure out a way to get the number of children so you can set rowspan and the number + // of ancestors so you can set colspan. + // DONE: If the subnet address (without the mask) matches a larger subnet address + // in the heirarchy that is a signal to add more join buttons to that row, since they start at the top row and + // via rowspan extend downward. + let matchingNetworkList = get_matching_network_list(network, subnetMap).slice(1) + for (const i in matchingNetworkList) { + let matchingNetwork = matchingNetworkList[i] + let networkChildrenCount = count_network_children(matchingNetwork, subnetMap, []) + newRow += ' /' + matchingNetwork.split('/')[1] + '\n' + } + } + newRow += ' '; + + $('#calcbody').append(newRow) +} + + +// Helper Functions +function ip2int(ip) { + return ip.split('.').reduce(function(ipInt, octet) { return (ipInt<<8) + parseInt(octet, 10)}, 0) >>> 0; +} + +function int2ip (ipInt) { + return ((ipInt>>>24) + '.' + (ipInt>>16 & 255) + '.' + (ipInt>>8 & 255) + '.' + (ipInt & 255)); +} + +function toBase36(num) { + return num.toString(36); +} + +function fromBase36(str) { + return parseInt(str, 36); +} + +/** + * Coordinate System for Subnet Representation + * + * This system aims to represent subnets efficiently within a larger network space. + * The goal is to produce the shortest possible string representation for subnets, + * which is particularly effective when dealing with hierarchical network designs. + * + * Key concept: + * - We represent a subnet by its ordinal position within a larger network, + * along with its mask size. + * - This approach is most efficient when subnets are relatively close together + * in the address space and of similar sizes. + * + * Benefits: + * 1. Compact representation: Often results in very short strings (e.g., "7k"). + * 2. Hierarchical: Naturally represents subnet hierarchy. + * 3. Efficient for common cases: Works best for typical network designs where + * subnets are grouped and of similar sizes. + * + * Trade-offs: + * - Less efficient for representing widely dispersed or highly varied subnet sizes. + * - Requires knowledge of the base network to interpret. + * + * Extreme Example... Representing the value 192.168.200.210/31 within the base + * network of 192.168.200.192/27. These are arbitrary but long subnets to represent + * as a string. + * - Normal Way - '192.168.200.210/31' + * - Nth Position Way - '9v' + * - '9' represents the 9th /31 subnet within the /27 + * - 'v' represents the /31 mask size converted to Base 36 (31 -> 'v') + */ + +/** + * Converts a specific subnet to its Nth position representation within a base network. + * + * @param {string} baseNetwork - The larger network containing the subnet (e.g., "10.0.0.0/16") + * @param {string} specificSubnet - The subnet to be represented (e.g., "10.0.112.0/20") + * @returns {string} A compact string representing the subnet's position and size (e.g., "7k") + */ +function getNthSubnet(baseNetwork, specificSubnet) { + const [baseIp, baseMask] = baseNetwork.split('/'); + const [specificIp, specificMask] = specificSubnet.split('/'); + + const baseInt = ip2int(baseIp); + const specificInt = ip2int(specificIp); + + const baseSize = 32 - parseInt(baseMask, 10); + const specificSize = 32 - parseInt(specificMask, 10); + + const offset = specificInt - baseInt; + const nthSubnet = offset >>> specificSize; + + return `${nthSubnet}${toBase36(parseInt(specificMask, 10))}`; +} + + +/** + * Reconstructs a subnet from its Nth position representation within a base network. + * + * @param {string} baseNetwork - The larger network containing the subnet (e.g., "10.0.0.0/16") + * @param {string} nthString - The compact representation of the subnet (e.g., "7k") + * @returns {string} The full subnet representation (e.g., "10.0.112.0/20") + */ +// Takes 10.0.0.0/16 and '7k' and returns 10.0.96.0/20 +// '10.0.96.0/20' being the 7th /20 (base36 'k' is 20 int) within the /16. +function getSubnetFromNth(baseNetwork, nthString) { + const [baseIp, baseMask] = baseNetwork.split('/'); + const baseInt = ip2int(baseIp); + + const size = fromBase36(nthString.slice(-1)); + const nth = parseInt(nthString.slice(0, -1), 10); + + const innerSizeInt = 32 - size; + const subnetInt = baseInt + (nth << innerSizeInt); + + return `${int2ip(subnetInt)}/${size}`; +} + +function subnet_last_address(subnet, netSize) { + return subnet + subnet_addresses(netSize) - 1; +} + +function subnet_addresses(netSize) { + return 2**(32-netSize); +} + +function subnet_usable_first(network, netSize, operatingMode) { + if (netSize < 31) { + // https://docs.aws.amazon.com/vpc/latest/userguide/subnet-sizing.html + // AWS reserves 3 additional IPs + // https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-faq#are-there-any-restrictions-on-using-ip-addresses-within-these-subnets + // Azure reserves 3 additional IPs + return network + (operatingMode == 'Standard' ? 1 : 4); + } else { + return network; + } +} + +function subnet_usable_last(network, netSize) { + let last_address = subnet_last_address(network, netSize); + if (netSize < 31) { + return last_address - 1; + } else { + return last_address; + } +} + +function get_dict_max_depth(dict, curDepth) { + let maxDepth = curDepth + for (let mapKey in dict) { + if (mapKey.startsWith('_')) { continue; } + let newDepth = get_dict_max_depth(dict[mapKey], curDepth + 1) + if (newDepth > maxDepth) { maxDepth = newDepth } + } + return maxDepth +} + + +function get_join_children(subnetTree, childCount) { + for (let mapKey in subnetTree) { + if (mapKey.startsWith('_')) { continue; } + if (has_network_sub_keys(subnetTree[mapKey])) { + childCount += get_join_children(subnetTree[mapKey]) + } else { + return childCount + } + } +} + +function has_network_sub_keys(dict) { + let allKeys = Object.keys(dict) + // Maybe an efficient way to do this with a Lambda? + for (let i in allKeys) { + if (!allKeys[i].startsWith('_') && allKeys[i] !== 'n' && allKeys[i] !== 'c') { + return true + } + } + return false +} + +function count_network_children(network, subnetTree, ancestryList) { + // TODO: This might be able to be optimized. Ultimately it needs to count the number of keys underneath + // the current key are unsplit networks (IE rows in the table, IE keys with a value of {}). + let childCount = 0 + for (let mapKey in subnetTree) { + if (mapKey.startsWith('_')) { continue; } + if (has_network_sub_keys(subnetTree[mapKey])) { + childCount += count_network_children(network, subnetTree[mapKey], ancestryList.concat([mapKey])) + } else { + if (ancestryList.includes(network)) { + childCount += 1 + } + } + } + return childCount +} + +function get_network_children(network, subnetTree) { + // TODO: This might be able to be optimized. Ultimately it needs to count the number of keys underneath + // the current key are unsplit networks (IE rows in the table, IE keys with a value of {}). + let subnetList = [] + for (let mapKey in subnetTree) { + if (mapKey.startsWith('_')) { continue; } + if (has_network_sub_keys(subnetTree[mapKey])) { + subnetList.push.apply(subnetList, get_network_children(network, subnetTree[mapKey])) + } else { + subnetList.push(mapKey) + } + } + return subnetList +} + +function get_matching_network_list(network, subnetTree) { + let subnetList = [] + for (let mapKey in subnetTree) { + if (mapKey.startsWith('_')) { continue; } + if (has_network_sub_keys(subnetTree[mapKey])) { + subnetList.push.apply(subnetList, get_matching_network_list(network, subnetTree[mapKey])) + } + if (mapKey.split('/')[0] === network) { + subnetList.push(mapKey) + } + } + return subnetList +} + +function get_consolidated_property(subnetTree, property) { + let allValues = get_property_values(subnetTree, property) + // https://stackoverflow.com/questions/14832603/check-if-all-values-of-array-are-equal + let allValuesMatch = allValues.every( (val, i, arr) => val === arr[0] ) + if (allValuesMatch) { + return allValues[0] + } else { + return '' + } +} + +function get_property_values(subnetTree, property) { + let propValues = [] + for (let mapKey in subnetTree) { + if (has_network_sub_keys(subnetTree[mapKey])) { + propValues.push.apply(propValues, get_property_values(subnetTree[mapKey], property)) + } else { + // The "else" above is a bit different because it will start tracking values for subnets which are + // in the hierarchy, but not displayed. Those are always blank so it messes up the value list + propValues.push(subnetTree[mapKey][property] || '') + } + } + return propValues +} + +function get_network(networkInput, netSize) { + let ipInt = ip2int(networkInput) + netSize = parseInt(netSize) + for (let i=31-netSize; i>=0; i--) { + ipInt &= ~ 1<
More Information:
Amazon Virtual Private Cloud > User Guide > Subnet CIDR Blocks > Subnet Sizing for IPv4' + break; + case 'AZURE': + var modal_error_message = 'The minimum IPv4 subnet size for Azure is /' + minSubnetSizes[operatingMode] + '.

More Information:
Azure Virtual Network FAQ > How small and how large can virtual networks and subnets be?' + break; + default: + var modal_error_message = 'The minimum size for an IPv4 subnet is /' + minSubnetSizes[operatingMode] + '.

More Information:
Wikipedia - Classless Inter-Domain Routing' + break; + } + show_warning_modal('
' + modal_error_message + '
') + } + } else if (verb === 'join') { + // Options: + // [ Selected ] Keep note if all the notes are the same, blank them out if they differ. Most intuitive + // [ Possible ] Lose note data for all deleted subnets. + // [ Possible ] Keep note from first subnet in the join scope. Reasonable but I think rarely will the note be kept by the user + // [ Possible ] Concatenate all notes. Ugly and won't really be useful for more than two subnets being joined + subnetTree[mapKey] = { + '_note': get_consolidated_property(subnetTree[mapKey], '_note'), + '_color': get_consolidated_property(subnetTree[mapKey], '_color') + } + } else if (verb === 'note') { + subnetTree[mapKey]['_note'] = propValue + } else if (verb === 'color') { + subnetTree[mapKey]['_color'] = propValue + } else { + // How did you get here? + } + } + } +} + +function switchMode(operatingMode) { + + let isSwitched = true; + + if (subnetMap !== null) { + if (validateSubnetSizes(subnetMap, minSubnetSizes[operatingMode])) { + + renderTable(operatingMode); + set_usable_ips_title(operatingMode); + + $('#netsize').attr('pattern', netsizePatterns[operatingMode]); + $('#input_form').removeClass('was-validated'); + $('#input_form').rules('remove', 'netsize'); + + switch (operatingMode) { + case 'AWS': + var validate_error_message = 'AWS Mode - Smallest size is /' + minSubnetSizes[operatingMode] + break; + case 'AZURE': + var validate_error_message = 'Azure Mode - Smallest size is /' + minSubnetSizes[operatingMode] + break; + default: + var validate_error_message = 'Smallest size is /' + minSubnetSizes[operatingMode] + break; + } + + + // Modify jquery validation rule + $('#input_form #netsize').rules('add', { + required: true, + pattern: netsizePatterns[operatingMode], + messages: { + required: 'Please enter a network size', + pattern: validate_error_message + } + }); + // Remove active class from all buttons if needed + $('#dropdown_standard, #dropdown_azure, #dropdown_aws').removeClass('active'); + $('#dropdown_' + operatingMode.toLowerCase()).addClass('active'); + isSwitched = true; + } else { + switch (operatingMode) { + case 'AWS': + var modal_error_message = 'One or more subnets are smaller than the minimum allowed for AWS.
The smallest size allowed is /' + minSubnetSizes[operatingMode] + '.
See: Amazon Virtual Private Cloud > User Guide > Subnet CIDR Blocks > Subnet Sizing for IPv4' + break; + case 'AZURE': + var modal_error_message = 'One or more subnets are smaller than the minimum allowed for Azure.
The smallest size allowed is /' + minSubnetSizes[operatingMode] + '.
See: Azure Virtual Network FAQ > How small and how large can virtual networks and subnets be?' + break; + default: + var validate_error_message = 'Unknown Error' + break; + } + show_warning_modal('
' + modal_error_message + '
'); + isSwitched = false; + } + } else { + //unlikely to get here. + reset(); + } + + return isSwitched; + + +} + +function validateSubnetSizes(subnetMap, minSubnetSize) { + let isValid = true; + const validate = (subnetTree) => { + for (let key in subnetTree) { + if (key.startsWith('_')) continue; // Skip special keys + let [_, size] = key.split('/'); + if (parseInt(size) > minSubnetSize) { + isValid = false; + return; // Early exit if any subnet is invalid + } + if (typeof subnetTree[key] === 'object') { + validate(subnetTree[key]); // Recursively validate subnets + } + } + }; + validate(subnetMap); + return isValid; +} + + +function set_usable_ips_title(operatingMode) { + switch (operatingMode) { + case 'AWS': + $('#useableHeader').html('Usable IPs (AWS)') + break; + case 'AZURE': + $('#useableHeader').html('Usable IPs (Azure)') + break; + default: + $('#useableHeader').html('Usable IPs') + break; + } + $('[data-bs-toggle="tooltip"]').tooltip() +} + +function show_warning_modal(message) { + var notifyModal = new bootstrap.Modal(document.getElementById('notifyModal'), {}); + $('#notifyModal .modal-body').html(message) + notifyModal.show() +} + +$( document ).ready(function() { + + // Initialize the jQuery Validation on the form + var validator = $('#input_form').validate({ + onfocusout: function (element) { + $(element).valid(); + }, + rules: { + network: { + required: true, + pattern: '^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' + }, + netsize: { + required: true, + pattern: '^([0-9]|[12][0-9]|3[0-2])$' + } + }, + messages: { + network: { + required: 'Please enter a network', + pattern: 'Must be a valid IPv4 Address' + }, + netsize: { + required: 'Please enter a network size', + pattern: 'Smallest size is /32' + } + }, + errorPlacement: function(error, element) { + //console.log(error); + //console.log(element); + if (error[0].innerHTML !== '') { + //console.log('Error Placement - Text') + if (!element.data('errorIsVisible')) { + bootstrap.Tooltip.getInstance(element).setContent({'.tooltip-inner': error[0].innerHTML}) + element.tooltip('show'); + element.data('errorIsVisible', true) + } + } else { + //console.log('Error Placement - Empty') + //console.log(element); + if (element.data('errorIsVisible')) { + element.tooltip('hide'); + element.data('errorIsVisible', false) + } + + } + //console.log(element); + }, + // This success function appears to be required as errorPlacement() does not fire without the success function + // being defined. + success: function(label, element) { }, + // When the form is valid, add the 'was-validated' class + submitHandler: function(form) { + form.classList.add('was-validated'); + form.submit(); // Submit the form + } + }); + + let autoConfigResult = processConfigUrl(); + if (!autoConfigResult) { + reset(); + } +}); + +function exportConfig(isMinified = true) { + const baseNetwork = Object.keys(subnetMap)[0] + let miniSubnetMap = {}; + if (isMinified) { + minifySubnetMap(miniSubnetMap, subnetMap, baseNetwork) + } + if (operatingMode !== 'Standard') { + return { + 'config_version': configVersion, + 'operating_mode': operatingMode, + 'base_network': baseNetwork, + 'subnets': isMinified ? miniSubnetMap : subnetMap, + } + } else { + return { + 'config_version': configVersion, + 'base_network': baseNetwork, + 'subnets': isMinified ? miniSubnetMap : subnetMap, + } + } +} + +function getConfigUrl() { + // Deep Copy + let defaultExport = JSON.parse(JSON.stringify(exportConfig(true))); + renameKey(defaultExport, 'config_version', 'v') + renameKey(defaultExport, 'base_network', 'b') + if (defaultExport.hasOwnProperty('operating_mode')) { + renameKey(defaultExport, 'operating_mode', 'm') + } + renameKey(defaultExport, 'subnets', 's') + //console.log(JSON.stringify(defaultExport)) + return '/index.html?c=' + urlVersion + LZString.compressToEncodedURIComponent(JSON.stringify(defaultExport)) +} + +function processConfigUrl() { + const params = new Proxy(new URLSearchParams(window.location.search), { + get: (searchParams, prop) => searchParams.get(prop), + }); + if (params['c'] !== null) { + // First character is the version of the URL string, in case the mechanism of encoding changes + let urlVersion = params['c'].substring(0, 1) + let urlData = params['c'].substring(1) + let urlConfig = JSON.parse(LZString.decompressFromEncodedURIComponent(params['c'].substring(1))) + renameKey(urlConfig, 'v', 'config_version') + if (urlConfig.hasOwnProperty('m')) { + renameKey(urlConfig, 'm', 'operating_mode') + } + renameKey(urlConfig, 's', 'subnets') + if (urlConfig['config_version'] === '1') { + // Version 1 Configs used full subnet strings as keys and just shortned the _note->_n and _color->_c keys + expandKeys(urlConfig['subnets']) + } else if (urlConfig['config_version'] === '2') { + // Version 2 Configs uses the Nth Position representation for subnet keys and requires the base_network + // option. It also uses n/c for note/color + if (urlConfig.hasOwnProperty('b')) { + renameKey(urlConfig, 'b', 'base_network') + } + let expandedSubnetMap = {}; + expandSubnetMap(expandedSubnetMap, urlConfig['subnets'], urlConfig['base_network']) + urlConfig['subnets'] = expandedSubnetMap + } + importConfig(urlConfig) + return true + } +} + +function minifySubnetMap(minifiedMap, referenceMap, baseNetwork) { + for (let subnet in referenceMap) { + if (subnet.startsWith('_')) continue; + + const nthRepresentation = getNthSubnet(baseNetwork, subnet); + minifiedMap[nthRepresentation] = {} + if (referenceMap[subnet].hasOwnProperty('_note')) { + minifiedMap[nthRepresentation]['n'] = referenceMap[subnet]['_note'] + } + if (referenceMap[subnet].hasOwnProperty('_color')) { + minifiedMap[nthRepresentation]['c'] = referenceMap[subnet]['_color'] + } + if (Object.keys(referenceMap[subnet]).some(key => !key.startsWith('_'))) { + minifySubnetMap(minifiedMap[nthRepresentation], referenceMap[subnet], baseNetwork); + } + } +} + +function expandSubnetMap(expandedMap, miniMap, baseNetwork) { + for (let mapKey in miniMap) { + if (mapKey === 'n' || mapKey === 'c') { + continue; + } + let subnetKey = getSubnetFromNth(baseNetwork, mapKey) + expandedMap[subnetKey] = {} + if (has_network_sub_keys(miniMap[mapKey])) { + expandSubnetMap(expandedMap[subnetKey], miniMap[mapKey], baseNetwork) + } else { + if (miniMap[mapKey].hasOwnProperty('n')) { + expandedMap[subnetKey]['_note'] = miniMap[mapKey]['n'] + } + if (miniMap[mapKey].hasOwnProperty('c')) { + expandedMap[subnetKey]['_color'] = miniMap[mapKey]['c'] + } + } + } +} + +// For Config Version 1 Backwards Compatibility +function expandKeys(subnetTree) { + for (let mapKey in subnetTree) { + if (mapKey.startsWith('_')) { + continue; + } + if (has_network_sub_keys(subnetTree[mapKey])) { + expandKeys(subnetTree[mapKey]) + } else { + if (subnetTree[mapKey].hasOwnProperty('_n')) { + renameKey(subnetTree[mapKey], '_n', '_note') + } + if (subnetTree[mapKey].hasOwnProperty('_c')) { + renameKey(subnetTree[mapKey], '_c', '_color') + } + + } + } +} + +function renameKey(obj, oldKey, newKey) { + if (oldKey !== newKey) { + Object.defineProperty(obj, newKey, + Object.getOwnPropertyDescriptor(obj, oldKey)); + delete obj[oldKey]; + } +} + +function importConfig(text) { + if (text['config_version'] === '1') { + var [subnetNet, subnetSize] = Object.keys(text['subnets'])[0].split('/') + } else if (text['config_version'] === '2') { + var [subnetNet, subnetSize] = text['base_network'].split('/') + } + $('#network').val(subnetNet) + $('#netsize').val(subnetSize) + subnetMap = text['subnets']; + operatingMode = text['operating_mode'] || 'Standard' + switchMode(operatingMode); + +} + +const rgba2hex = (rgba) => `#${rgba.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+\.{0,1}\d*))?\)$/).slice(1).map((n, i) => (i === 3 ? Math.round(parseFloat(n) * 255) : parseFloat(n)).toString(16).padStart(2, '0').replace('NaN', '')).join('')}` diff --git a/dist/robots.txt b/dist/robots.txt new file mode 100644 index 0000000..f6e6d1d --- /dev/null +++ b/dist/robots.txt @@ -0,0 +1,2 @@ +User-Agent: * +Allow: / diff --git a/dist/sitemap.xml b/dist/sitemap.xml new file mode 100644 index 0000000..d037261 --- /dev/null +++ b/dist/sitemap.xml @@ -0,0 +1,5 @@ + + + https://visualsubnetcalc.com/ + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5375355 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "visualsubnetcalc", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/repopack.config.json b/repopack.config.json new file mode 100644 index 0000000..8c4af2f --- /dev/null +++ b/repopack.config.json @@ -0,0 +1,19 @@ +{ + "output": { + "filePath": "repopack-output.txt", + "style": "xml", + "removeComments": false, + "removeEmptyLines": false, + "topFilesLength": 5, + "showLineNumbers": false + }, + "include": [], + "ignore": { + "useGitignore": true, + "useDefaultPatterns": false, + "customPatterns": [] + }, + "security": { + "enableSecurityCheck": true + } +} diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..68c5d18 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/src/cloudformation.yaml b/src/cloudformation.yaml new file mode 100644 index 0000000..359fee2 --- /dev/null +++ b/src/cloudformation.yaml @@ -0,0 +1,215 @@ +--- +AWSTemplateFormatVersion: '2010-09-09' +Description: Visual Subnet Calculator +Metadata: + AWS::CloudFormation::Interface: + ParameterGroups: + - Label: + default: Naming + Parameters: + - DomainName + ParameterLabels: + DomainName: + default: Domain Name +Parameters: + DomainName: + Type: String + Default: '' + Description: Domain Name for Route53 Hosted Zone and Static S3 Site +Resources: + OriginAccessIdentity: + Type: AWS::CloudFront::CloudFrontOriginAccessIdentity + Properties: + CloudFrontOriginAccessIdentityConfig: + Comment: Visual Subnet Calculator Static Website Amazon CloudFront Identity + StaticWebsite: + Type: AWS::S3::Bucket + Properties: + BucketName: !Sub + - visualsubnetcalc-static-website-${Unique} + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + AccessControl: Private + LoggingConfiguration: + DestinationBucketName: !Ref LoggingBucket + LogFilePrefix: s3-static-website/ + PublicAccessBlockConfiguration: + BlockPublicAcls: true + BlockPublicPolicy: true + IgnorePublicAcls: true + RestrictPublicBuckets: true + BucketEncryption: + ServerSideEncryptionConfiguration: + - ServerSideEncryptionByDefault: + SSEAlgorithm: AES256 + VersioningConfiguration: + Status: Enabled + LifecycleConfiguration: + Rules: + - Id: DeleteOldVersionAfter7Days + Status: Enabled + NoncurrentVersionExpiration: + NoncurrentDays: 7 + StaticWebsiteBucketPolicy: + Type: AWS::S3::BucketPolicy + Properties: + Bucket: !Sub + - visualsubnetcalc-static-website-${Unique} + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + PolicyDocument: + Version: '2012-10-17' + Id: WebAccess + Statement: + - Sid: CloudFrontReadForGetBucketObjects + Principal: + AWS: !Sub 'arn:${AWS::Partition}:iam::cloudfront:user/CloudFront Origin Access Identity ${OriginAccessIdentity}' + Effect: Allow + Action: + - s3:GetObject + - s3:GetObjectVersion + Resource: !Sub + - arn:${AWS::Partition}:s3:::visualsubnetcalc-static-website-${Unique}/* + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + - Sid: DenyPlaintextAccess + Principal: '*' + Effect: Deny + Action: s3:* + Resource: + - !Sub + - arn:${AWS::Partition}:s3:::visualsubnetcalc-static-website-${Unique} + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + - !Sub + - arn:${AWS::Partition}:s3:::visualsubnetcalc-static-website-${Unique}/* + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + Condition: + Bool: + aws:SecureTransport: 'false' + LoggingBucket: + Type: AWS::S3::Bucket + DeletionPolicy: Retain + Properties: + BucketName: !Sub + - visualsubnetcalc-logging-${Unique} + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + AccessControl: Private + PublicAccessBlockConfiguration: + BlockPublicAcls: true + BlockPublicPolicy: true + IgnorePublicAcls: true + RestrictPublicBuckets: true + OwnershipControls: + Rules: + - ObjectOwnership: BucketOwnerPreferred + BucketEncryption: + ServerSideEncryptionConfiguration: + - ServerSideEncryptionByDefault: + SSEAlgorithm: AES256 + VersioningConfiguration: + Status: Enabled + LifecycleConfiguration: + Rules: + - Id: DeleteOldVersionAfter7Days + Status: Enabled + NoncurrentVersionExpiration: + NoncurrentDays: 7 + LoggingBucketBucketPolicy: + Type: AWS::S3::BucketPolicy + DependsOn: LoggingBucket + Properties: + Bucket: !Sub + - visualsubnetcalc-logging-${Unique} + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + PolicyDocument: + Version: '2012-10-17' + Id: WebAccess + Statement: + - Sid: S3ServerAccessLogsPolicy + Effect: Allow + Principal: + Service: logging.s3.amazonaws.com + Action: + - s3:PutObject + Resource: !Sub + - arn:${AWS::Partition}:s3:::visualsubnetcalc-logging-${Unique}/* + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + Condition: + ArnEquals: + aws:SourceArn: + - !Sub + - arn:${AWS::Partition}:s3:::visualsubnetcalc-static-website-${Unique} + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + StringEquals: + aws:SourceAccount: !Ref 'AWS::AccountId' + - Sid: DenyPlaintextAccess + Principal: '*' + Effect: Deny + Action: s3:* + Resource: + - !Sub + - arn:${AWS::Partition}:s3:::visualsubnetcalc-logging-${Unique} + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + - !Sub + - arn:${AWS::Partition}:s3:::visualsubnetcalc-logging-${Unique}/* + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + Condition: + Bool: + aws:SecureTransport: 'false' + HostedZone: + Type: AWS::Route53::HostedZone + Properties: + HostedZoneConfig: + Comment: !Sub 'VisualSubnetCalc' + Name: !Ref 'DomainName' + Certificate: + Type: AWS::CertificateManager::Certificate + Properties: + DomainName: !Ref 'DomainName' + DomainValidationOptions: + - DomainName: !Ref 'DomainName' + HostedZoneId: !Ref 'HostedZone' + ValidationMethod: DNS + Tags: + - Key: Name + Value: !Sub 'VisualSubnetCalc' + CloudFrontAlias: + Type: AWS::Route53::RecordSet + Properties: + AliasTarget: + DNSName: !GetAtt 'CloudFront.DomainName' + HostedZoneId: Z2FDTNDATAQYW2 + Comment: To CloudFront S3 + HostedZoneId: !Ref 'HostedZone' + Name: !Sub '${DomainName}.' + Type: A + CloudFront: + Type: AWS::CloudFront::Distribution + Properties: + DistributionConfig: + Comment: Visual Subnet Calculator Static Website + Aliases: + - !Ref 'DomainName' + Logging: + Bucket: !GetAtt LoggingBucket.DomainName + Prefix: cloudfront + IncludeCookies: true + DefaultCacheBehavior: + ForwardedValues: + QueryString: false + TargetOriginId: !Sub 'S3-Static-Website' + ViewerProtocolPolicy: redirect-to-https + Compress: true + DefaultRootObject: index.html + Enabled: true + HttpVersion: http2 + Origins: + - DomainName: !Sub + - visualsubnetcalc-static-website-${Unique}.s3.${AWS::Region}.amazonaws.com + - Unique: !Select [ 4, !Split [ '-', !Select [ 2, !Split [ '/', !Ref 'AWS::StackId' ] ] ] ] + Id: !Sub 'S3-Static-Website' + S3OriginConfig: + OriginAccessIdentity: !Sub 'origin-access-identity/cloudfront/${OriginAccessIdentity}' + PriceClass: PriceClass_100 + IPV6Enabled: false + ViewerCertificate: + AcmCertificateArn: !Ref 'Certificate' + MinimumProtocolVersion: TLSv1.2_2021 + SslSupportMethod: sni-only diff --git a/src/demo.gif b/src/demo.gif new file mode 100644 index 0000000..5055edf Binary files /dev/null and b/src/demo.gif differ diff --git a/src/package-lock.json b/src/package-lock.json new file mode 100644 index 0000000..63aeda3 --- /dev/null +++ b/src/package-lock.json @@ -0,0 +1,675 @@ +{ + "name": "src", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "hasInstallScript": true, + "dependencies": { + "bootstrap": "^5.3.3", + "http-server": "^14.1.1", + "lz-string": "^1.5.0" + }, + "devDependencies": { + "@playwright/test": "^1.48.0", + "@types/node": "^22.7.5" + } + }, + "node_modules/@playwright/test": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.0.tgz", + "integrity": "sha512-W5lhqPUVPqhtc/ySvZI5Q8X2ztBOUgZ8LbAFy0JQgrXZs2xaILrUcNO3rQjwbLPfGK13+rZsDa1FpG+tqYkT5w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.48.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/playwright": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.0.tgz", + "integrity": "sha512-qPqFaMEHuY/ug8o0uteYJSRfMGFikhUysk8ZvAtfKmUK3kc/6oNl/y3EczF8OFGYIi/Ex2HspMfzYArk6+XQSA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.48.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.0.tgz", + "integrity": "sha512-RBvzjM9rdpP7UUFrQzRwR8L/xR4HyC1QXMzGYTbf1vjw25/ya9NRAVnXi/0fvFopjebvyPzsmoK58xxeEOaVvA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "license": "MIT", + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/src/package.json b/src/package.json new file mode 100644 index 0000000..745ac0a --- /dev/null +++ b/src/package.json @@ -0,0 +1,19 @@ +{ + "dependencies": { + "bootstrap": "^5.3.3", + "http-server": "^14.1.1", + "lz-string": "^1.5.0" + }, + "scripts": { + "postinstall": "sudo npm install -g sass@1.77.6", + "build": "sass --style compressed scss/custom.scss:../dist/css/bootstrap.min.css && cp node_modules/lz-string/libs/lz-string.min.js ../dist/js/lz-string.min.js", + "test": "npx playwright test", + "setup:certs": "mkdir -p certs; mkcert -cert-file certs/cert.pem -key-file certs/cert.key localhost 127.0.0.1", + "start": "node node_modules/http-server/bin/http-server ../dist -c-1", + "local-secure-start": "node node_modules/http-server/bin/http-server ../dist -c-1 -C certs/cert.pem -K certs/cert.key -S -p 8443" + }, + "devDependencies": { + "@playwright/test": "^1.48.0", + "@types/node": "^22.7.5" + } +} diff --git a/src/playwright.config.ts b/src/playwright.config.ts new file mode 100644 index 0000000..c702e26 --- /dev/null +++ b/src/playwright.config.ts @@ -0,0 +1,99 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// import path from 'path'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'https://localhost:8443', + ignoreHTTPSErrors: true, + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + permissions: ['clipboard-read', 'clipboard-write'], + viewport: { + width: 1920, + height: 1080, + }, + }, + }, + + { + name: 'firefox', + use: { + ...devices['Desktop Firefox'], + viewport: { + width: 1920, + height: 1080, + }, + }, + }, + + //{ + // name: 'webkit', + // use: { + // ...devices['Desktop Safari'], + // permissions: ['clipboard-read'], + // viewport: { + // width: 1920, + // height: 1080, + // }, + // }, + //}, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npm run build && npm run local-secure-start', + port: 8443, + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/src/scss/custom.scss b/src/scss/custom.scss new file mode 100644 index 0000000..822fbe7 --- /dev/null +++ b/src/scss/custom.scss @@ -0,0 +1,27 @@ +@import '../node_modules/bootstrap/scss/functions'; + +@import '../node_modules/bootstrap/scss/variables'; + +$new-breakpoints: ( + xxxl:1600px, + xxxxl:1800px, + //xxxxx:2000px, +); + +$grid-breakpoints: map-merge($grid-breakpoints, $new-breakpoints); + +$new-container-max-widths: ( + xxxl:1520px, + xxxxl:1720px, + //xxxxxl:1920px +); + +$container-max-widths: map-merge($container-max-widths, $new-container-max-widths); + +.custom-tooltip { + --bs-tooltip-bg: var(--bs-danger) !important; + --bs-tooltip-color: var(--bs-white) !important; + --bs-tooltip-opacity: 1 !important; +} + +@import "../node_modules/bootstrap/scss/bootstrap"; diff --git a/src/split_icon.png b/src/split_icon.png new file mode 100644 index 0000000..2c68ab0 Binary files /dev/null and b/src/split_icon.png differ diff --git a/src/tests/.gitignore b/src/tests/.gitignore new file mode 100644 index 0000000..6bfb121 --- /dev/null +++ b/src/tests/.gitignore @@ -0,0 +1,2 @@ +# This file contains a private dataset used for testing real world use cases +real-world-functional.spec.ts diff --git a/src/tests/deep-functional.spec.ts b/src/tests/deep-functional.spec.ts new file mode 100644 index 0000000..3d61eea --- /dev/null +++ b/src/tests/deep-functional.spec.ts @@ -0,0 +1,192 @@ +import { test, expect } from '@playwright/test'; + +async function getClipboardText(page) { + return page.evaluate(async () => { + return await navigator.clipboard.readText(); + }); +} + +test('Deep Functional Test', async ({ page }) => { + // The goal of this test is to identify any weird interdependencies or issues that may arise + // from doing a variety of actions on one page load. It's meant to emulate a complex human + // user interaction often with steps that don't make sense. + // This does a little of everything: + // - Manual Network Input + // - Subnet splitting/joining + // - Colors + // - Sharable URLs + // - AWS/Azure Mode + // - Import Reddit Example Config + // - Change Network Size + await page.goto('/'); + // Change 10.0.0.0/8 -> 172.16.0.0/12 + await page.getByLabel('Network Address').click(); + await page.getByLabel('Network Address').press('Shift+Home'); + await page.getByLabel('Network Address').fill('172.16.0.0'); + await page.getByLabel('Network Size').fill('12'); + await page.getByRole('button', { name: 'Go' }).click(); + // Do a bunch of splitting + await page.getByText('/12', { exact: true }).click(); + await page.getByLabel('172.24.0.0/13', { exact: true }).getByText('/13', { exact: true }).click(); + await page.getByLabel('172.24.0.0/14', { exact: true }).getByText('/14', { exact: true }).click(); + await page.getByLabel('172.26.0.0/15', { exact: true }).getByText('/15', { exact: true }).click(); + await page.getByLabel('172.26.0.0/16', { exact: true }).getByText('/16', { exact: true }).click(); + await page.getByRole('cell', { name: '/15 Split' }).click(); + await page.getByRole('cell', { name: '172.24.0.0/16 Split' }).click(); + await page.getByRole('cell', { name: '172.25.0.0/16 Split' }).click(); + await page.getByRole('cell', { name: '/14 Split' }).click(); + await page.getByRole('cell', { name: '172.30.0.0/15 Split' }).click(); + await page.getByRole('cell', { name: '172.31.0.0/16 Split' }).click(); + await page.getByLabel('172.31.128.0/17', { exact: true }).getByText('/17', { exact: true }).click(); + await page.getByLabel('172.31.192.0/18', { exact: true }).getByText('/18', { exact: true }).click(); + await page.getByLabel('172.31.224.0/19', { exact: true }).getByText('/19', { exact: true }).click(); + await page.getByLabel('172.31.192.0/19', { exact: true }).getByText('/19', { exact: true }).click(); + await page.getByRole('textbox', { name: '172.31.240.0/20 Note' }).click(); + await page.getByRole('textbox', { name: '172.31.240.0/20 Note' }).fill('Test A'); + await page.getByRole('textbox', { name: '172.31.224.0/20 Note' }).click(); + await page.getByRole('textbox', { name: '172.31.224.0/20 Note' }).fill('Test B'); + await page.getByRole('cell', { name: '172.31.240.0/20 Split' }).click(); + await page.getByRole('textbox', { name: '172.31.240.0/21 Note' }).click(); + await page.getByRole('textbox', { name: '172.31.240.0/21 Note' }).fill('Test A - 1'); + await page.getByRole('cell', { name: '172.31.248.0/21 Note' }).click(); + await page.getByRole('textbox', { name: '172.31.248.0/21 Note' }).fill('Test A - 2'); + await page.getByLabel('172.31.248.0/21', { exact: true }).getByText('/21', { exact: true }).click(); + await page.getByLabel('172.31.252.0/22', { exact: true }).getByText('/22', { exact: true }).click(); + await page.getByRole('cell', { name: '/21 Split' }).click(); + await page.getByRole('textbox', { name: '172.31.240.0/22 Note' }).click(); + await page.getByRole('textbox', { name: '172.31.240.0/22 Note' }).fill('Test A - 1A'); + await page.getByRole('textbox', { name: '172.31.244.0/22 Note' }).click(); + await page.getByRole('textbox', { name: '172.31.244.0/22 Note' }).fill('Test A - 1B'); + // Join a subnet + await page.getByLabel('172.31.240.0/21 Join').click(); + // Change some colors and do some more splitting + await page.getByText('Change Colors »').click(); + await page.getByLabel('Color 4').click(); + await page.getByRole('cell', { name: '172.26.128.0/17 Usable IPs' }).click(); + await page.getByText('« Stop Changing Colors').click(); + await page.getByRole('cell', { name: '172.26.128.0/17 Split' }).click(); + await page.getByRole('cell', { name: '172.26.192.0/18 Split' }).click(); + await page.getByText('Change Colors »').click(); + await page.getByLabel('Color 8').click(); + await page.getByRole('cell', { name: '172.26.128.0/18 Usable IPs' }).click(); + await page.getByText('« Stop Changing Colors').click(); + // Make sure we're still not changing colors + await page.getByRole('cell', { name: '172.26.128.0/18 Split' }).click(); + // Check a bunch of specific items + await expect(page.getByLabel('Network Address')).toHaveValue('172.16.0.0'); + await expect(page.getByLabel('Network Size')).toHaveValue('12'); + await expect(page.getByRole('textbox', { name: '172.31.254.0/23 Note' })).toHaveValue('Test A - 2'); + await expect(page.getByRole('textbox', { name: '172.31.252.0/23 Note' })).toHaveValue('Test A - 2'); + await expect(page.getByRole('textbox', { name: '/22 Note' })).toHaveValue('Test A - 2'); + await expect(page.getByRole('textbox', { name: '/21 Note' })).toBeEmpty(); + await expect(page.getByRole('textbox', { name: '172.31.224.0/20 Note' })).toHaveValue('Test B'); + await expect(page.getByLabel('172.16.0.0/13', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/13'); + await expect(page.getByLabel('172.24.0.0/17', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/17'); + await expect(page.getByLabel('172.26.128.0/19', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/19'); + await expect(page.getByLabel('172.27.0.0/16', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/16'); + await expect(page.getByLabel('172.28.0.0/15', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/15'); + await expect(page.getByLabel('172.30.0.0/16', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/16'); + await expect(page.getByLabel('172.31.0.0/17', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/17'); + await expect(page.getByLabel('172.31.128.0/18', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/18'); + await expect(page.getByLabel('172.31.192.0/20', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/20'); + await expect(page.getByLabel('172.31.240.0/21', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/21'); + await expect(page.getByLabel('172.31.248.0/22', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/22'); + await expect(page.getByLabel('172.31.252.0/23', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/23'); + await expect(page.getByLabel('/12 Join')).toContainText('/12'); + await expect(page.getByLabel('/13 Join')).toContainText('/13'); + await expect(page.getByLabel('172.26.128.0/17 Join')).toContainText('/17'); + await expect(page.getByLabel('172.31.128.0/17 Join')).toContainText('/17'); + await expect(page.getByLabel('172.31.192.0/19 Join')).toContainText('/19'); + await expect(page.getByLabel('172.31.224.0/19 Join')).toContainText('/19'); + await expect(page.getByLabel('/21 Join')).toContainText('/21'); + await expect(page.getByLabel('/22 Join')).toContainText('/22'); + await expect(page.getByRole('row', { name: '172.26.128.0/19' })).toHaveCSS('background-color', 'rgb(255, 198, 255)'); + await expect(page.getByRole('row', { name: '172.26.160.0/19' })).toHaveCSS('background-color', 'rgb(255, 198, 255)'); + await expect(page.getByRole('row', { name: '172.26.192.0/19' })).toHaveCSS('background-color', 'rgb(202, 255, 191)'); + await expect(page.getByRole('row', { name: '172.26.224.0/19' })).toHaveCSS('background-color', 'rgb(202, 255, 191)'); + // Check the Shareable URL + await page.getByText('Copy Shareable URL').click(); + let clipboardUrl = await getClipboardText(page); + expect(clipboardUrl).toContain('/index.html?c=1N4IgbiBcIEwgNCARlEBGA7DAdGgbNgAxED0aciAzlKIQMY0iEAmNAvomq5KDAKaMALADNGADgDmjfAAt2nDHJ5sOIAJxSe6MUuCq0a3StUBWUVrSFNvQkcQw0ukIJgBLcYIBWjBtADEwsJ0eIEgqmIm3lq+IAFBIaIqiIIAzO5aYnhRoDF+dACGgUiJiGIY2SC5BUWJxpxo1nUgKQJaIfIgGOagaIKNnCbWzbYdKY6MeG4deGnSMFmMMCYwANYdSylryvow5YsmglugAHaoACp8lAAuAAQAQmH2JiZHICaWADaMp9AIlaiPN5oNBfCyEGAwAC233Ol1uAEEbgBaG5wfTglLQrQwQiCPA-E6w643REotH2XEYAkgH4gC7E0mosLGFmsthAA'); + // Check the Export + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Import / Export' }).click(); + await expect(page.getByLabel('Import/Export Content')).toHaveValue('{\n "config_version": "2",\n "base_network": "172.16.0.0/12",\n "subnets": {\n "172.16.0.0/12": {\n "172.16.0.0/13": {},\n "172.24.0.0/13": {\n "172.24.0.0/14": {\n "172.24.0.0/15": {\n "172.24.0.0/16": {\n "172.24.0.0/17": {},\n "172.24.128.0/17": {}\n },\n "172.25.0.0/16": {\n "172.25.0.0/17": {},\n "172.25.128.0/17": {}\n }\n },\n "172.26.0.0/15": {\n "172.26.0.0/16": {\n "172.26.0.0/17": {},\n "172.26.128.0/17": {\n "172.26.128.0/18": {\n "172.26.128.0/19": {\n "_color": "#ffc6ff"\n },\n "172.26.160.0/19": {\n "_color": "#ffc6ff"\n }\n },\n "172.26.192.0/18": {\n "172.26.192.0/19": {\n "_color": "#caffbf"\n },\n "172.26.224.0/19": {\n "_color": "#caffbf"\n }\n }\n }\n },\n "172.27.0.0/16": {}\n }\n },\n "172.28.0.0/14": {\n "172.28.0.0/15": {},\n "172.30.0.0/15": {\n "172.30.0.0/16": {},\n "172.31.0.0/16": {\n "172.31.0.0/17": {},\n "172.31.128.0/17": {\n "172.31.128.0/18": {},\n "172.31.192.0/18": {\n "172.31.192.0/19": {\n "172.31.192.0/20": {},\n "172.31.208.0/20": {}\n },\n "172.31.224.0/19": {\n "172.31.224.0/20": {\n "_note": "Test B"\n },\n "172.31.240.0/20": {\n "172.31.240.0/21": {\n "_note": "",\n "_color": ""\n },\n "172.31.248.0/21": {\n "172.31.248.0/22": {\n "_note": "Test A - 2"\n },\n "172.31.252.0/22": {\n "172.31.252.0/23": {\n "_note": "Test A - 2"\n },\n "172.31.254.0/23": {\n "_note": "Test A - 2"\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n}'); + await page.getByLabel('Import/Export', { exact: true }).getByText('Close').click(); + // Set to AWS Mode + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - AWS' }).click(); + // Check AWS Mode Settings + await expect(page.getByLabel('172.31.254.0/23', { exact: true }).getByLabel('Usable IPs (AWS)')).toContainText('172.31.254.4 - 172.31.255.254'); + await expect(page.getByLabel('172.31.254.0/23', { exact: true }).getByLabel('Hosts')).toContainText('507'); + await page.getByText('Copy Shareable URL').click(); + clipboardUrl = await getClipboardText(page); + expect(clipboardUrl).toContain('/index.html?c=1N4IgbiBcIEwgNCARlEBGA7DAdGgbNgAxED0aciAtqgIIDqAygiAM5SiEDG7IhAJuwC+iNAMigYAUx4AWAGY8AHAHMe+ABZCRGTeMHCQATlXj0i3cANpDF-QYCsC02kImJhW4hhoLIGTABLJRkAKx5uaABiOTlOPBiQA0V7MNMIkGjY+IV9RBkAZiDTRTxU0HTIzgBDGKQcxEUMMpAK6tqcuxE0N06QfOlTeK0QDCdQNBkekXs3Po9h-J8ePEDhvEK1GFKeGHsYAGth3fzDvSsYJp37GVPQADtUABVJFgAXAAIAIUSve3tbkD2FwAGx4D2gzHSP0BaDQoOchBgMGopnBIGeb3eNHeAFp3nArIj8ij3DI8OD7k8Xh9sXiCV5CDIMBSQGiMTTcfjEnYebzBEA'); + // Set to Azure Mode + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - Azure' }).click(); + // Check Azure Mode Settings + await expect(page.getByLabel('172.31.254.0/23', { exact: true }).getByLabel('Usable IPs (Azure)')).toContainText('172.31.254.4 - 172.31.255.254'); + await expect(page.getByLabel('172.31.254.0/23', { exact: true }).getByLabel('Hosts')).toContainText('507'); + await page.getByText('Copy Shareable URL').click(); + clipboardUrl = await getClipboardText(page); + expect(clipboardUrl).toContain('/index.html?c=1N4IgbiBcIEwgNCARlEBGA7DAdGgbNgAxED0aciAtqgIIBaAqgEoCiCIAzlKIQMbchCAE24BfRGhGRQMAKYCALADMBADgDmA-AAsxEjLumjxIAJybp6VYeAm0pm8ZMBWFZbSELMwo8Qw0NiAKMACWagoAVgL80ADESkq8eAkgJqrOUZYxIPGJySrGiAoAzGGWqniZoNmxvACGCUgFiKoYVSA19Y0FThJoXr0gxfKWyXogGG6gaAoDEs5eQz7jxQECeKHjeKVaMJUCMM4wANbjh8WnRnYwbQfOCpegAHaoACqyHAAuAAQAQql+ZzOR4gZweAA2Ahe0HY2QBoLQaEh7kIMBg1Es0JA7y+3xo3wAtN84HZUcUMd4FHhoc83h8fviiSS-IQFBgaSAsTiGYTiaknALBaIgA'); + // Import Default Reddit Config + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Import / Export' }).click(); + await page.getByLabel('Import/Export Content').click(); + await page.getByLabel('Import/Export Content').press('ControlOrMeta+a'); + await page.getByLabel('Import/Export Content').fill('{\n "config_version": "2",\n "base_network": "10.0.0.0/20",\n "subnets": {\n "10.0.0.0/20": {\n "10.0.0.0/21": {\n "10.0.0.0/22": {\n "10.0.0.0/23": {\n "10.0.0.0/24": {\n "_note": "Data Center - Virtual Servers",\n "_color": "#9bf6ff"\n },\n "10.0.1.0/24": {\n "_note": "Data Center - Virtual Servers",\n "_color": "#9bf6ff"\n }\n },\n "10.0.2.0/23": {\n "10.0.2.0/24": {\n "_note": "Data Center - Virtual Servers",\n "_color": "#9bf6ff"\n },\n "10.0.3.0/24": {\n "_note": "Data Center - Physical Servers",\n "_color": "#a0c4ff"\n }\n }\n },\n "10.0.4.0/22": {\n "10.0.4.0/23": {\n "_note": "Building A - Wifi",\n "_color": "#ffd6a5"\n },\n "10.0.6.0/23": {\n "_note": "Building A - LAN",\n "_color": "#ffd6a5"\n }\n }\n },\n "10.0.8.0/21": {\n "10.0.8.0/22": {\n "10.0.8.0/23": {\n "10.0.8.0/24": {\n "_note": "Building A - Printers",\n "_color": "#ffd6a5"\n },\n "10.0.9.0/24": {\n "_note": "Building A - Voice",\n "_color": "#ffd6a5"\n }\n },\n "10.0.10.0/23": {\n "_note": "Building B - Wifi",\n "_color": "#fdffb6"\n }\n },\n "10.0.12.0/22": {\n "10.0.12.0/23": {\n "_note": "Building B - LAN",\n "_color": "#fdffb6"\n },\n "10.0.14.0/23": {\n "10.0.14.0/24": {\n "_note": "Building B - Printers",\n "_color": "#fdffb6"\n },\n "10.0.15.0/24": {\n "_note": "Building B - Voice",\n "_color": "#fdffb6"\n }\n }\n }\n }\n }\n }\n}'); + await page.getByRole('button', { name: 'Import' }).click(); + // Do all the Reddit Default Checks + await expect(page.getByLabel('Network Address')).toHaveValue('10.0.0.0'); + await expect(page.getByLabel('Network Size')).toHaveValue('20'); + await expect(page.getByLabel('10.0.0.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.0.0/24'); + await expect(page.getByLabel('10.0.1.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.1.0/24'); + await expect(page.getByLabel('10.0.2.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.2.0/24'); + await expect(page.getByLabel('10.0.3.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.3.0/24'); + await expect(page.getByLabel('10.0.4.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.4.0/23'); + await expect(page.getByLabel('10.0.6.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.6.0/23'); + await expect(page.getByLabel('10.0.8.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.8.0/24'); + await expect(page.getByLabel('10.0.9.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.9.0/24'); + await expect(page.getByLabel('10.0.10.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.10.0/23'); + await expect(page.getByLabel('10.0.12.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.12.0/23'); + await expect(page.getByLabel('10.0.14.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.14.0/24'); + await expect(page.getByLabel('10.0.15.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.15.0/24'); + await expect(page.getByRole('textbox', { name: '10.0.0.0/24 Note' })).toHaveValue('Data Center - Virtual Servers'); + await expect(page.getByRole('textbox', { name: '10.0.1.0/24 Note' })).toHaveValue('Data Center - Virtual Servers'); + await expect(page.getByRole('textbox', { name: '10.0.2.0/24 Note' })).toHaveValue('Data Center - Virtual Servers'); + await expect(page.getByRole('textbox', { name: '10.0.3.0/24 Note' })).toHaveValue('Data Center - Physical Servers'); + await expect(page.getByRole('textbox', { name: '10.0.4.0/23 Note' })).toHaveValue('Building A - Wifi'); + await expect(page.getByRole('textbox', { name: '10.0.6.0/23 Note' })).toHaveValue('Building A - LAN'); + await expect(page.getByRole('textbox', { name: '10.0.8.0/24 Note' })).toHaveValue('Building A - Printers'); + await expect(page.getByRole('textbox', { name: '10.0.9.0/24 Note' })).toHaveValue('Building A - Voice'); + await expect(page.getByRole('textbox', { name: '10.0.10.0/23 Note' })).toHaveValue('Building B - Wifi'); + await expect(page.getByRole('textbox', { name: '10.0.12.0/23 Note' })).toHaveValue('Building B - LAN'); + await expect(page.getByRole('textbox', { name: '10.0.14.0/24 Note' })).toHaveValue('Building B - Printers'); + await expect(page.getByRole('textbox', { name: '10.0.15.0/24 Note' })).toHaveValue('Building B - Voice'); + await expect(page.getByRole('row', { name: '10.0.0.0/24' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await expect(page.getByRole('row', { name: '10.0.1.0/24' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await expect(page.getByRole('row', { name: '10.0.2.0/24' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await expect(page.getByRole('row', { name: '10.0.3.0/24' })).toHaveCSS('background-color', 'rgb(160, 196, 255)'); + await expect(page.getByRole('row', { name: '10.0.4.0/23' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.6.0/23' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.8.0/24' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.9.0/24' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.10.0/23' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + await expect(page.getByRole('row', { name: '10.0.12.0/23' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + await expect(page.getByRole('row', { name: '10.0.14.0/24' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + await expect(page.getByRole('row', { name: '10.0.15.0/24' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + // Now change the whole network address + await page.getByLabel('Network Address').click(); + await page.getByLabel('Network Address').press('ControlOrMeta+a'); + await page.getByLabel('Network Address').fill('192.168.0.0'); + await page.getByRole('button', { name: 'Go' }).click(); + await expect(page.getByLabel('192.168.0.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('192.168.0.0/24'); +}); + + + +//test('Test', async ({ page }) => { +// await page.goto('/'); +//}); diff --git a/src/tests/default-homepage.spec.ts b/src/tests/default-homepage.spec.ts new file mode 100644 index 0000000..f76aef9 --- /dev/null +++ b/src/tests/default-homepage.spec.ts @@ -0,0 +1,22 @@ +import { test, expect } from '@playwright/test'; + +test('Default Homepage Rendering', async ({ page }) => { + await page.goto('/'); + await expect(page).toHaveTitle(/Visual Subnet Calculator/); + await expect(page.getByRole('heading')).toContainText('Visual Subnet Calculator'); + await expect(page.getByLabel('Network Address')).toHaveValue('10.0.0.0'); + await expect(page.getByLabel('Network Size')).toHaveValue('16'); + await expect(page.locator('#useableHeader')).toContainText('Usable IPs'); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.0.0/16'); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Range of Addresses')).toContainText('10.0.0.0 - 10.0.255.255'); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Usable IPs')).toContainText('10.0.0.1 - 10.0.255.254'); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Hosts')).toContainText('65534'); + await expect(page.getByRole('textbox', { name: '10.0.0.0/16 Note' })).toBeEmpty(); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/16'); + // This "default no color" check could maybe be improved. May not be reliable cross-browser. + await expect(page.getByRole('row', { name: '10.0.0.0/16' })).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)'); + await expect(page.getByLabel('Change Colors').locator('span')).toContainText('Change Colors »'); + await expect(page.locator('#copy_url')).toContainText('Copy Shareable URL'); +}); + + diff --git a/src/tests/import-export.spec.ts b/src/tests/import-export.spec.ts new file mode 100644 index 0000000..b3a1207 --- /dev/null +++ b/src/tests/import-export.spec.ts @@ -0,0 +1,47 @@ +import { test, expect } from '@playwright/test'; + +test('Default Export Content', async ({ page }) => { + await page.goto('/'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Import / Export' }).click(); + await expect(page.locator('#importExportModalLabel')).toContainText('Import/Export'); + await expect(page.getByLabel('Import/Export', { exact: true })).toContainText('Close'); + await expect(page.locator('#importBtn')).toContainText('Import'); + await expect(page.getByLabel('Import/Export Content')).toHaveValue('{\n "config_version": "2",\n "base_network": "10.0.0.0/16",\n "subnets": {\n "10.0.0.0/16": {}\n }\n}'); +}); + +test('Default (AWS) Export Content', async ({ page }) => { + await page.goto('/'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - AWS' }).click(); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Import / Export' }).click(); + await expect(page.getByLabel('Import/Export Content')).toHaveValue('{\n "config_version": "2",\n "operating_mode": "AWS",\n "base_network": "10.0.0.0/16",\n "subnets": {\n "10.0.0.0/16": {}\n }\n}'); +}); + +test('Default (Azure) Export Content', async ({ page }) => { + await page.goto('/'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - Azure' }).click(); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Import / Export' }).click(); + await expect(page.getByLabel('Import/Export Content')).toHaveValue('{\n "config_version": "2",\n "operating_mode": "AZURE",\n "base_network": "10.0.0.0/16",\n "subnets": {\n "10.0.0.0/16": {}\n }\n}'); + await page.getByLabel('Import/Export', { exact: true }).getByText('Close').click(); +}); + +test('Import 192.168.0.0/24', async ({ page }) => { + await page.goto('/'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Import / Export' }).click(); + await page.getByLabel('Import/Export Content').click(); + await page.getByLabel('Import/Export Content').fill('{\n "config_version": "2",\n "base_network": "192.168.0.0/24",\n "subnets": {\n "192.168.0.0/24": {}\n }\n}'); + await page.getByRole('button', { name: 'Import' }).click(); + await expect(page.getByLabel('Network Address')).toHaveValue('192.168.0.0'); + await expect(page.getByLabel('Network Size')).toHaveValue('24'); + await expect(page.getByLabel('192.168.0.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('192.168.0.0/24'); +}); + +//test('Test', async ({ page }) => { +// await page.goto('/'); +//}); + diff --git a/src/tests/real-world-functional.spec.ts.gpg b/src/tests/real-world-functional.spec.ts.gpg new file mode 100644 index 0000000..904ff8a Binary files /dev/null and b/src/tests/real-world-functional.spec.ts.gpg differ diff --git a/src/tests/subnet-basic.spec.ts b/src/tests/subnet-basic.spec.ts new file mode 100644 index 0000000..bcdea33 --- /dev/null +++ b/src/tests/subnet-basic.spec.ts @@ -0,0 +1,174 @@ +import { test, expect } from '@playwright/test'; + +async function getClipboardText(page) { + return page.evaluate(async () => { + return await navigator.clipboard.readText(); + }); +} + +test('Renders Max Depth /0 to /32', async ({ page }) => { + await page.goto('/'); + await page.getByLabel('Network Address').click(); + await page.getByLabel('Network Address').press('Shift+Home'); + await page.getByLabel('Network Address').fill('0.0.0.0'); + await page.getByLabel('Network Address').press('Tab'); + await page.getByLabel('Network Size').fill('0'); + await page.getByRole('button', { name: 'Go' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/0 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/1 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/2 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/3 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/4 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/5 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/6 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/7 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/8 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/9 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/10 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/11 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/12 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/13 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/14 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/15 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/16 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/17 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/18 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/19 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/20 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/21 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/22 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/23 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/24 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/25 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/26 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/27 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/28 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/29 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/30 Split' }).click(); + await page.getByRole('cell', { name: '0.0.0.0/31 Split' }).click(); + await expect(page.getByLabel('0.0.0.0/32', { exact: true }).getByLabel('Subnet Address')).toContainText('0.0.0.0/32'); + await expect(page.getByLabel('0.0.0.0/32', { exact: true }).getByLabel('Range of Addresses')).toContainText('0.0.0.0'); + await expect(page.getByLabel('0.0.0.0/32', { exact: true }).getByLabel('Usable IPs')).toContainText('0.0.0.0'); + await expect(page.getByLabel('0.0.0.0/32', { exact: true }).getByLabel('Hosts')).toContainText('1'); + await expect(page.getByLabel('0.0.0.0/32', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/32'); + await expect(page.getByLabel('/31 Join')).toContainText('/31'); + await expect(page.getByLabel('128.0.0.0/1', { exact: true }).getByLabel('Subnet Address')).toContainText('128.0.0.0/1'); +}); + +test('Change To 192.168.0.0/24', async ({ page }) => { + await page.goto('/'); + await page.getByLabel('Network Address').click(); + await page.getByLabel('Network Address').fill('192.168.0.0'); + await page.getByLabel('Network Size').click(); + await page.getByLabel('Network Size').fill('24'); + await page.getByRole('button', { name: 'Go' }).click(); + await expect(page.getByLabel('192.168.0.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('192.168.0.0/24'); + await expect(page.getByLabel('192.168.0.0/24', { exact: true }).getByLabel('Range of Addresses')).toContainText('192.168.0.0 - 192.168.0.255'); + await expect(page.getByLabel('192.168.0.0/24', { exact: true }).getByLabel('Usable IPs')).toContainText('192.168.0.1 - 192.168.0.254'); + await expect(page.getByLabel('192.168.0.0/24', { exact: true }).getByLabel('Hosts')).toContainText('254'); + await expect(page.getByLabel('192.168.0.0/24', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/24'); + await expect(page.getByRole('textbox', { name: '192.168.0.0/24 Note' })).toBeEmpty(); +}); + +test('Deep /32 Split', async ({ page }) => { + await page.goto('/'); + await page.getByText('/16', { exact: true }).click(); + await page.getByLabel('10.0.128.0/17', { exact: true }).getByText('/17', { exact: true }).click(); + await page.getByLabel('10.0.128.0/18', { exact: true }).getByText('/18', { exact: true }).click(); + await page.getByLabel('10.0.160.0/19', { exact: true }).getByText('/19', { exact: true }).click(); + await page.getByLabel('10.0.176.0/20', { exact: true }).getByText('/20', { exact: true }).click(); + await page.getByLabel('10.0.184.0/21', { exact: true }).getByText('/21', { exact: true }).click(); + await page.getByLabel('10.0.176.0/21', { exact: true }).getByText('/21', { exact: true }).click(); + await page.getByLabel('10.0.176.0/22', { exact: true }).getByText('/22', { exact: true }).click(); + await page.getByLabel('10.0.176.0/23', { exact: true }).getByText('/23', { exact: true }).click(); + await page.getByLabel('10.0.176.0/24', { exact: true }).getByText('/24', { exact: true }).click(); + await page.getByLabel('10.0.176.0/25', { exact: true }).getByText('/25', { exact: true }).click(); + await page.getByLabel('10.0.176.0/26', { exact: true }).getByText('/26', { exact: true }).click(); + await page.getByLabel('10.0.176.0/27', { exact: true }).getByText('/27', { exact: true }).click(); + await page.getByLabel('10.0.176.0/28', { exact: true }).getByText('/28', { exact: true }).click(); + await page.getByLabel('10.0.176.0/29', { exact: true }).getByText('/29', { exact: true }).click(); + await page.getByLabel('10.0.176.0/30', { exact: true }).getByText('/30', { exact: true }).click(); + await page.getByLabel('10.0.176.0/31', { exact: true }).getByText('/31', { exact: true }).click(); + await page.getByRole('textbox', { name: '10.0.176.0/32 Note' }).click(); + await page.getByRole('textbox', { name: '10.0.176.0/32 Note' }).fill('Test Text'); + await page.getByText('Change Colors »').click(); + await page.locator('#palette_picker_6').click(); + await page.getByRole('cell', { name: '10.0.176.0/32 Subnet Address' }).click(); + await page.getByText('« Stop Changing Colors').click(); + await page.getByLabel('Network Address').click(); + await page.getByLabel('Network Address').fill('99.0.0.0'); + await page.getByRole('button', { name: 'Go' }).click(); + await expect(page.getByLabel('99.0.176.0/32', { exact: true }).getByLabel('Subnet Address')).toContainText('99.0.176.0/32'); + await expect(page.getByLabel('99.0.176.0/32', { exact: true }).getByLabel('Hosts')).toContainText('1'); + await expect(page.getByRole('textbox', { name: '99.0.176.0/32 Note' })).toHaveValue('Test Text'); + await expect(page.getByLabel('99.0.176.0/32', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/32'); +}); + +test('Usable IPs - Standard', async ({ page }) => { + await page.goto('/'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - Standard' }).click(); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Usable IPs')).toContainText('10.0.0.1 - 10.0.255.254'); +}); + +test('Usable IPs - AWS', async ({ page }) => { + await page.goto('/'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - AWS' }).click(); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Usable IPs')).toContainText('10.0.0.4 - 10.0.255.254'); +}); + +test('Usable IPs - Azure', async ({ page }) => { + await page.goto('/'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - Azure' }).click(); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Usable IPs')).toContainText('10.0.0.4 - 10.0.255.254'); +}); + +test('Note Splitting', async ({ page }) => { + await page.goto('/'); + await page.getByLabel('Note Split/Join').click(); + await page.getByLabel('Note Split/Join').fill('This should be duplicated!'); + await page.getByRole('cell', { name: '/16 Split' }).click(); + await expect(page.getByRole('textbox', { name: '10.0.0.0/17 Note' })).toHaveValue('This should be duplicated!'); + await expect(page.getByRole('textbox', { name: '10.0.128.0/17 Note' })).toHaveValue('This should be duplicated!'); +}); + +test('Note Joining Same', async ({ page }) => { + await page.goto('/index.html?c=1N4IgbiBcIEwgNCARlEBGADAOm7g9GgGwIgDOUoGA5hSBgBa0B2qAKvQJakAEp9A9gFcANgBNuSAKbdRggA7COAYwCGAF0miAhCAC+iNI0igW0dl14CR4qTPmLVG7Xt2ugA'); + await page.getByLabel('/16 Join').click(); + await expect(page.getByLabel('Note Split/Join')).toHaveValue('This should be duplicated!'); +}); + +test('Note Joining Different', async ({ page }) => { + await page.goto('/index.html?c=1N4IgbiBcIEwgNCARlEBGADAOm7g9GgGwIgDOUoGA5hSBgBa0B2qAKvQJakAEp9A9gFcANgBNuSAKbdRggA7COAYwCGAF0miAhNwCCIAL6I0jSKBbR2XXgJHipM+YtUbt3AEKGD3oA'); + await page.getByLabel('/16 Join').click(); + await expect(page.getByLabel('Note Split/Join')).toBeEmpty(); +}); + +test('Color Splitting', async ({ page }) => { + await page.goto('/'); + await page.getByText('Change Colors »').click(); + await page.getByLabel('Color 5').click(); + await page.getByRole('cell', { name: '/16 Subnet Address' }).click(); + await page.getByText('« Stop Changing Colors').click(); + await page.getByText('/16', { exact: true }).click(); + await expect(page.getByRole('row', { name: '10.0.0.0/17' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await expect(page.getByRole('row', { name: '10.0.128.0/17' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); +}); + +test('Color Joining Same', async ({ page }) => { + await page.goto('/index.html?c=1N4IgbiBcIEwgNCARlEBGADAOm7g9GgGwIgDOUoGA5hSBgBa0DGqAxAJxIBmhXXIAX0RpGkUC2gduvfgLkCgA'); + await page.getByLabel('/16 Join').click(); + await expect(page.getByRole('row', { name: '10.0.0.0/16' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); +}); + +test('Color Joining Different', async ({ page }) => { + await page.goto('/index.html?c=1N4IgbiBcIEwgNCARlEBGADAOm7g9GgGwIgDOUoGA5hSBgBa0DGqAxAJxIBmhXXIAX0RpGkUC2isuAEz5JiAxQKA'); + await page.getByLabel('/16 Join').click(); + await expect(page.getByRole('row', { name: '10.0.0.0/16' })).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)'); +}); + +//test('Test', async ({ page }) => { +// await page.goto('/'); +//}); diff --git a/src/tests/ui-error-handling.spec.ts b/src/tests/ui-error-handling.spec.ts new file mode 100644 index 0000000..a24c345 --- /dev/null +++ b/src/tests/ui-error-handling.spec.ts @@ -0,0 +1,76 @@ +import { test, expect } from '@playwright/test'; + +test('Bad Network Address', async ({ page }) => { + await page.goto('/'); + await page.getByLabel('Network Address').click(); + await page.getByLabel('Network Address').fill('1'); + await page.locator('html').click(); + await expect(page.locator('#network')).toHaveClass(/error/i); + await expect(page.getByText('Must be a valid IPv4 Address')).toBeVisible(); +}); + +test('Bad Network Size', async ({ page }) => { + await page.goto('/'); + await page.getByLabel('Network Size').click(); + await page.getByLabel('Network Size').fill('33'); + await page.locator('html').click(); + await expect(page.locator('#netsize')).toHaveClass(/error/i); + await expect(page.getByText('Smallest size is /32')).toBeVisible(); +}); + +test('Prevent Go on Bad Input', async ({ page }) => { + await page.goto('/'); + await page.getByLabel('Network Size').click(); + await page.getByLabel('Network Size').fill('33'); + await page.locator('html').click(); + await page.getByRole('button', { name: 'Go' }).click(); + await expect(page.locator('#notifyModalLabel')).toContainText('Warning!'); + await expect(page.locator('#notifyModalDescription')).toContainText('Please correct the errors in the form!'); +}); + + +test('Network Boundary Correction', async ({ page }) => { + await page.goto('/'); + await page.getByLabel('Network Address').click(); + await page.getByLabel('Network Address').fill('123.45.67.89'); + await page.getByLabel('Network Size').click(); + await page.getByLabel('Network Size').fill('20'); + await page.getByRole('button', { name: 'Go' }).click(); + await expect(page.locator('#notifyModalLabel')).toContainText('Warning!'); + await expect(page.locator('#notifyModalDescription')).toContainText('Your network input is not on a network boundary for this network size. It has been automatically changed:'); + await expect(page.locator('#notifyModalDescription')).toContainText('123.45.67.89 -> 123.45.64.0'); + await page.getByLabel('Warning!').getByLabel('Close').click(); + await expect(page.getByLabel('Network Address')).toHaveValue('123.45.64.0'); + await page.getByLabel('Network Size').click(); + await expect(page.getByRole('cell', { name: '123.45.64.0/20 Subnet Address' })).toContainText('123.45.64.0/20'); + await page.getByRole('cell', { name: '/20 Split' }).click(); + await page.getByLabel('/20 Join').click(); + await expect(page.getByLabel('123.45.64.0/20', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/20'); +}); + +test('Subnet Too Small for AWS Mode', async ({ page }) => { + await page.goto('/'); + await expect(page.locator('#useableHeader')).toContainText('Usable IPs'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - AWS' }).click(); + await page.getByLabel('Network Size').click(); + await page.getByLabel('Network Size').fill('29'); + await page.getByRole('button', { name: 'Go' }).click(); + await expect(page.locator('#notifyModalLabel')).toContainText('Warning!'); + await expect(page.locator('#notifyModalDescription')).toContainText('Please correct the errors in the form!'); + await expect(page.getByText('AWS Mode - Smallest size is /28')).toBeVisible(); +}); + +test('Subnet Too Small for Azure Mode', async ({ page }) => { + await page.goto('/'); + await expect(page.locator('#useableHeader')).toContainText('Usable IPs'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - Azure' }).click(); + await page.getByLabel('Network Size').click(); + await page.getByLabel('Network Size').fill('30'); + await page.getByRole('button', { name: 'Go' }).click(); + await expect(page.locator('#notifyModalLabel')).toContainText('Warning!'); + await expect(page.locator('#notifyModalDescription')).toContainText('Please correct the errors in the form!'); + await expect(page.getByText('Azure Mode - Smallest size is /29')).toBeVisible(); +}); + diff --git a/src/tests/ui-usage.spec.ts b/src/tests/ui-usage.spec.ts new file mode 100644 index 0000000..76af731 --- /dev/null +++ b/src/tests/ui-usage.spec.ts @@ -0,0 +1,168 @@ +import { test, expect } from '@playwright/test'; + +test('CIDR Input Typing', async ({ page }) => { + await page.goto('/'); + await page.getByLabel('Network Address').click(); + await page.getByLabel('Network Address').press('End'); + await page.getByLabel('Network Address').press('Shift+Home'); + await page.getByLabel('Network Address').press('Delete'); + await page.keyboard.type('192.168.0.0/24'); + await page.getByRole('button', { name: 'Go' }).click(); + await expect(page.getByRole('cell', { name: '192.168.0.0/24 Subnet Address' })).toContainText('192.168.0.0/24'); +}); + +test('CIDR Input Paste', async ({ page }) => { + await page.goto('/'); + await page.getByLabel('Network Address').click(); + await page.getByLabel('Network Address').press('End'); + await page.getByLabel('Network Address').press('Shift+Home'); + // From: https://github.com/microsoft/playwright/issues/2511 + await page.locator('#network').evaluate((formEl) => { + const data = `172.16.0.0/12`; + const clipboardData = new DataTransfer(); + const dataType = 'text/plain'; + clipboardData.setData(dataType, data); + const clipboardEvent = new ClipboardEvent('paste', { + clipboardData, + dataType, + data + }); + formEl.dispatchEvent(clipboardEvent); + }); + + await page.getByRole('button', { name: 'Go' }).click(); + await expect(page.getByRole('cell', { name: '172.16.0.0/12 Subnet Address' })).toContainText('172.16.0.0/12'); +}); + +test('About Dialog', async ({ page }) => { + await page.goto('/'); + await page.locator('#info_icon').click(); + await expect(page.locator('#aboutModalLabel')).toContainText('About Visual Subnet Calculator'); + await expect(page.getByLabel('About Visual Subnet Calculator')).toContainText('Design Tenets'); + await expect(page.getByLabel('About Visual Subnet Calculator')).toContainText('Credits'); + await expect(page.getByLabel('About Visual Subnet Calculator').getByText('Close')).toBeVisible(); +}); + +test('GitHub Link', async ({ page }) => { + await page.goto('/'); + const page1Promise = page.waitForEvent('popup'); + await page.getByLabel('GitHub').click(); + const page1 = await page1Promise; + await expect(page1.locator('#repository-container-header')).toContainText('ckabalan / visualsubnetcalc Public'); +}); + +test('Table Header Standard Mode', async ({ page }) => { + await page.goto('/'); + await expect(page.locator('#useableHeader')).toContainText('Usable IPs'); +}); + +test('Table Header AWS Mode', async ({ page }) => { + await page.goto('/'); + await expect(page.locator('#useableHeader')).toContainText('Usable IPs'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - AWS' }).click(); + await expect(page.getByRole('cell', { name: 'Usable IPs', exact: true })).toContainText('Usable IPs (AWS)'); + await page.getByRole('link', { name: 'AWS' }).hover() + await expect(page.getByText('AWS reserves 5 addresses in')).toBeVisible(); +}); + +test('Table Header Azure Mode', async ({ page }) => { + await page.goto('/'); + await expect(page.locator('#useableHeader')).toContainText('Usable IPs'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - Azure' }).click(); + await expect(page.getByRole('cell', { name: 'Usable IPs', exact: true })).toContainText('Usable IPs (Azure)'); + await page.getByRole('link', { name: 'Azure' }).hover() + await expect(page.getByText('Azure reserves 5 addresses in')).toBeVisible(); +}); + + +test('Table Header AWS then Standard', async ({ page }) => { + await page.goto('/'); + await expect(page.locator('#useableHeader')).toContainText('Usable IPs'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - AWS' }).click(); + await expect(page.getByRole('cell', { name: 'Usable IPs', exact: true })).toContainText('Usable IPs (AWS)'); + await page.getByRole('button', { name: 'Tools' }).click(); + await page.getByRole('link', { name: 'Mode - Standard' }).click(); + await expect(page.getByRole('cell', { name: 'Usable IPs', exact: true })).toContainText('Usable IPs'); + await expect(page.getByRole('cell', { name: 'Usable IPs', exact: true })).not.toContainText('(AWS)'); +}); + +test('Color Palette', async ({ page }) => { + await page.goto('/'); + await expect(page.getByLabel('Change Colors').locator('span')).toContainText('Change Colors »'); + await page.getByText('Change Colors »').click(); + await expect(page.getByLabel('Color 1', { exact: true })).toBeVisible(); + await expect(page.getByLabel('Color 2', { exact: true })).toBeVisible(); + await expect(page.getByLabel('Color 3', { exact: true })).toBeVisible(); + await expect(page.getByLabel('Color 4', { exact: true })).toBeVisible(); + await expect(page.getByLabel('Color 5', { exact: true })).toBeVisible(); + await expect(page.getByLabel('Color 6', { exact: true })).toBeVisible(); + await expect(page.getByLabel('Color 7', { exact: true })).toBeVisible(); + await expect(page.getByLabel('Color 8', { exact: true })).toBeVisible(); + await expect(page.getByLabel('Color 9', { exact: true })).toBeVisible(); + await expect(page.getByLabel('Color 10', { exact: true })).toBeVisible(); + await expect(page.getByLabel('Stop Changing Colors').locator('span')).toContainText('« Stop Changing Colors'); + await page.getByText('« Stop Changing Colors').click(); + await expect(page.getByLabel('Change Colors').locator('span')).toContainText('Change Colors »'); +}); + +test('Test Default Colors', async ({ page }) => { + await page.goto('/index.html?c=1N4IgbiBcIEwgNCARlEBGADAOm7g9GgGwIgDOUoGA5hSBgBa0YCWTAVkwNYUC+ia3SMB590HIbEHDEAZikjRaVhJjjQAFnmIArPNEy1IQlpAB2PSP6MVyjYYAcJgJx6dhzCbQDelkDNtG7jCecj6Ipu6avPy6PgoiQA'); + await page.getByText('Change Colors »').click(); + // Set the top 10 rows to the default colors and check that they are correct + await page.getByLabel('Color 1', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.0.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.0.0/20' })).toHaveCSS('background-color', 'rgb(255, 173, 173)'); + await page.getByLabel('Color 2', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.16.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.16.0/20' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await page.getByLabel('Color 3', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.32.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.32.0/20' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + await page.getByLabel('Color 4', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.48.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.48.0/20' })).toHaveCSS('background-color', 'rgb(202, 255, 191)'); + await page.getByLabel('Color 5', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.64.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.64.0/20' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await page.getByLabel('Color 6', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.80.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.80.0/20' })).toHaveCSS('background-color', 'rgb(160, 196, 255)'); + await page.getByLabel('Color 7', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.96.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.96.0/20' })).toHaveCSS('background-color', 'rgb(189, 178, 255)'); + await page.getByLabel('Color 8', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.112.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.112.0/20' })).toHaveCSS('background-color', 'rgb(255, 198, 255)'); + await page.getByLabel('Color 9', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.128.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.128.0/20' })).toHaveCSS('background-color', 'rgb(230, 230, 230)'); + await page.getByLabel('Color 10', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.144.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.144.0/20' })).toHaveCSS('background-color', 'rgb(255, 255, 255)'); + // Set rows 11 and 12 to Colors 1 and 2 respectively and check that they are correct + await page.getByLabel('Color 1', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.160.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.160.0/20' })).toHaveCSS('background-color', 'rgb(255, 173, 173)'); + await page.getByLabel('Color 2', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.176.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.176.0/20' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + // Set rows 11 and 12 to Color 10 (white) to make sure you can change colors later + await page.getByLabel('Color 10', { exact: true }).click(); + await page.getByRole('cell', { name: '10.0.160.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.160.0/20' })).toHaveCSS('background-color', 'rgb(255, 255, 255)'); + await page.getByRole('cell', { name: '10.0.176.0/20 Subnet Address' }).click(); + await expect(page.getByRole('row', { name: '10.0.176.0/20' })).toHaveCSS('background-color', 'rgb(255, 255, 255)'); + await page.getByText('« Stop Changing Colors').click(); + // Make sure when you're not in color change mode you cannot change colors + await page.getByRole('cell', { name: '10.0.0.0/20 Subnet Address' }).click(); + // Should still be the old color instead of white (the last palette color selected) + await expect(page.getByRole('row', { name: '10.0.0.0/20' })).toHaveCSS('background-color', 'rgb(255, 173, 173)'); +}); + + + + + diff --git a/src/tests/url-sharing.spec.ts b/src/tests/url-sharing.spec.ts new file mode 100644 index 0000000..3dfe22a --- /dev/null +++ b/src/tests/url-sharing.spec.ts @@ -0,0 +1,134 @@ +import { test, expect } from '@playwright/test'; + +async function getClipboardText(page) { + return page.evaluate(async () => { + return await navigator.clipboard.readText(); + }); +} + +test('Default URL Share', async ({ page }) => { + await page.goto('/'); + await page.getByText('Copy Shareable URL').click(); + const clipboardUrl = await getClipboardText(page); + expect(clipboardUrl).toContain('/index.html?c=1N4IgbiBcIEwgNCARlEBGADAOm7g9GgGwIgDOUoGA5hQL71A'); +}); + +test('Default URL Render', async ({ page }) => { + // This should match default-homepage.spec.ts + await page.goto('/index.html?c=1N4IgbiBcIEwgNCARlEBGADAOm7g9GgGwIgDOUoGA5hQL71A'); + await expect(page).toHaveTitle(/Visual Subnet Calculator/); + await expect(page.getByRole('heading')).toContainText('Visual Subnet Calculator'); + await expect(page.getByLabel('Network Address')).toHaveValue('10.0.0.0'); + await expect(page.getByLabel('Network Size')).toHaveValue('16'); + await expect(page.locator('#useableHeader')).toContainText('Usable IPs'); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.0.0/16'); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Range of Addresses')).toContainText('10.0.0.0 - 10.0.255.255'); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Usable IPs')).toContainText('10.0.0.1 - 10.0.255.254'); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Hosts')).toContainText('65534'); + await expect(page.getByRole('textbox', { name: '10.0.0.0/16 Note' })).toBeEmpty(); + await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Split', { exact: true })).toContainText('/16'); + // This "default no color" check could maybe be improved. May not be reliable cross-browser. + await expect(page.getByRole('row', { name: '10.0.0.0/16' })).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)'); + await expect(page.getByLabel('Change Colors').locator('span')).toContainText('Change Colors »'); + await expect(page.locator('#copy_url')).toContainText('Copy Shareable URL'); +}); + +test('Reddit Example URL Render (URL v1 - Config v1)', async ({ page }) => { + // This is great to make sure older URLs still load and render properly + await page.goto('/index.html?c=1N4IgbiBcIIwgNCAzlUMAMA6LOD0AmdVWHbbAuSNUvffYjM2gZgZvPwBZiB9AOyggAIgEMALiIAEAYQCmfMbIBOkgLSSAagEslYgK4iANpIDKysMpSIeAY0EBiAJwAjAGYA2V65ABfRIywYDm4qEH5BUQkZeUUVdW1dA2MzJQslKzC7aCc3T28fPxIyfA5WUIDMEvQCENBw6EipOQVlNU0dfSNTc0sETIcXDy9ff1JmYN4BBvEmmNb1AAUACwBPJC0bLpS0jNsHEXQbTmGCworODnpy0gvq-DK6qZAAIT0tQwATLT4Ac0kAQTaAHUtK4tH09tkvB93CIAKwjIpYdylSaCV7vL6-AFtAAy-wAchCsiB7NDYQjTqMyAAODiUai0y5sJl3B5IzB0u61MJPDGfb5-QGLJTfWK7Elk1ww+GIiqOCaheovN4C7HCzQAew2smJDnJsoK1MCLDR0H5WL+z2BoPB1kl0q8zncvjOpBgVQIV0ZgU99zNKsxgsk1vU+KJ9v1HydLrdZBgtwI7IqCcVj3RqstIbaC1FLXSeqh0dczrl7rhad5GaD2NDWp1hdJjpLsdOpyAA'); + await expect(page.getByLabel('Network Address')).toHaveValue('10.0.0.0'); + await expect(page.getByLabel('Network Size')).toHaveValue('20'); + await expect(page.getByLabel('10.0.0.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.0.0/24'); + await expect(page.getByLabel('10.0.1.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.1.0/24'); + await expect(page.getByLabel('10.0.2.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.2.0/24'); + await expect(page.getByLabel('10.0.3.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.3.0/24'); + await expect(page.getByLabel('10.0.4.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.4.0/23'); + await expect(page.getByLabel('10.0.6.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.6.0/23'); + await expect(page.getByLabel('10.0.8.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.8.0/24'); + await expect(page.getByLabel('10.0.9.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.9.0/24'); + await expect(page.getByLabel('10.0.10.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.10.0/23'); + await expect(page.getByLabel('10.0.12.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.12.0/23'); + await expect(page.getByLabel('10.0.14.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.14.0/24'); + await expect(page.getByLabel('10.0.15.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.15.0/24'); + await expect(page.getByRole('textbox', { name: '10.0.0.0/24 Note' })).toHaveValue('Data Center - Virtual Servers'); + await expect(page.getByRole('textbox', { name: '10.0.1.0/24 Note' })).toHaveValue('Data Center - Virtual Servers'); + await expect(page.getByRole('textbox', { name: '10.0.2.0/24 Note' })).toHaveValue('Data Center - Virtual Servers'); + await expect(page.getByRole('textbox', { name: '10.0.3.0/24 Note' })).toHaveValue('Data Center - Physical Servers'); + await expect(page.getByRole('textbox', { name: '10.0.4.0/23 Note' })).toHaveValue('Building A - Wifi'); + await expect(page.getByRole('textbox', { name: '10.0.6.0/23 Note' })).toHaveValue('Building A - LAN'); + await expect(page.getByRole('textbox', { name: '10.0.8.0/24 Note' })).toHaveValue('Building A - Printers'); + await expect(page.getByRole('textbox', { name: '10.0.9.0/24 Note' })).toHaveValue('Building A - Voice'); + await expect(page.getByRole('textbox', { name: '10.0.10.0/23 Note' })).toHaveValue('Building B - Wifi'); + await expect(page.getByRole('textbox', { name: '10.0.12.0/23 Note' })).toHaveValue('Building B - LAN'); + await expect(page.getByRole('textbox', { name: '10.0.14.0/24 Note' })).toHaveValue('Building B - Printers'); + await expect(page.getByRole('textbox', { name: '10.0.15.0/24 Note' })).toHaveValue('Building B - Voice'); + await expect(page.getByRole('row', { name: '10.0.0.0/24' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await expect(page.getByRole('row', { name: '10.0.1.0/24' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await expect(page.getByRole('row', { name: '10.0.2.0/24' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await expect(page.getByRole('row', { name: '10.0.3.0/24' })).toHaveCSS('background-color', 'rgb(160, 196, 255)'); + await expect(page.getByRole('row', { name: '10.0.4.0/23' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.6.0/23' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.8.0/24' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.9.0/24' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.10.0/23' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + await expect(page.getByRole('row', { name: '10.0.12.0/23' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + await expect(page.getByRole('row', { name: '10.0.14.0/24' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + await expect(page.getByRole('row', { name: '10.0.15.0/24' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); +}); + +test('Reddit Example URL Conversion (URL v1 - Config v1 to v2)', async ({ page }) => { + // Basically if a user loads a URL (say v1), we load it, but then only produce the latest version URL (v2) when they copy the URL + await page.goto('/index.html?c=1N4IgbiBcIIwgNCAzlUMAMA6LOD0AmdVWHbbAuSNUvffYjM2gZgZvPwBZiB9AOyggAIgEMALiIAEAYQCmfMbIBOkgLSSAagEslYgK4iANpIDKysMpSIeAY0EBiAJwAjAGYA2V65ABfRIywYDm4qEH5BUQkZeUUVdW1dA2MzJQslKzC7aCc3T28fPxIyfA5WUIDMEvQCENBw6EipOQVlNU0dfSNTc0sETIcXDy9ff1JmYN4BBvEmmNb1AAUACwBPJC0bLpS0jNsHEXQbTmGCworODnpy0gvq-DK6qZAAIT0tQwATLT4Ac0kAQTaAHUtK4tH09tkvB93CIAKwjIpYdylSaCV7vL6-AFtAAy-wAchCsiB7NDYQjTqMyAAODiUai0y5sJl3B5IzB0u61MJPDGfb5-QGLJTfWK7Elk1ww+GIiqOCaheovN4C7HCzQAew2smJDnJsoK1MCLDR0H5WL+z2BoPB1kl0q8zncvjOpBgVQIV0ZgU99zNKsxgsk1vU+KJ9v1HydLrdZBgtwI7IqCcVj3RqstIbaC1FLXSeqh0dczrl7rhad5GaD2NDWp1hdJjpLsdOpyAA'); + await page.getByText('Copy Shareable URL').click(); + const clipboardUrl = await getClipboardText(page); + expect(clipboardUrl).toContain('/index.html?c=1N4IgbiBcIEwgNCARlEBGADAOm7g9DBgiAM5SgYDW5IGANjRgLaMB2jA9je9ACICGAF34ACAMIBTVoIkAnEQFoRANQCWswQFd+dEQGU5YOWUQBjVAGIAnEgBmANlu2QAX0RoukUDxADh4qRl5JTUNbV0DWSNZExBzaGs7R2cXN3QeUBhPb1Q-UUlpOUUVdS0dfUNjYniQRIcnV0QAZmyQHzyAwuCRAAUACwBPElVTcsjo2JqLfgxTABYG1LS0Fi9YDLbUACFNVToAE1VWAHMRAEFigHVVW1Vqyyd9+34AVkaQJo2fHb3Dk-PigAZM4AOXuCUezzeS3cDDWMFWoDmGwAHK1vrsDkdThclD1ZEcgpMHrYnq93lZ0dtMX8ccVlBwRhJwbVIeTUogXl9qb9sSItlcbnczA99k4kPZXGkmoiQPZudAflj-gKlMCwSKIWLbBL3gB2DZoOZUxU0vmq3oErrErXiyXLF4mkBK2n8+mM0zMzWs7W6pb+oA'); +}); + +test('Reddit Example URL Render (URL v1 - Config v2)', async ({ page }) => { + // This is great to make sure older URLs still load and render properly + await page.goto('/index.html?c=1N4IgbiBcIEwgNCARlEBGADAOm7g9DBgiAM5SgYDW5IGANjRgLaMB2jA9je9ACICGAF34ACAMIBTVoIkAnEQFoRANQCWswQFd+dEQGU5YOWUQBjVAGIAnEgBmANlu2QAX0RoukUDxADh4qRl5JTUNbV0DWSNZExBzaGs7R2cXN3QeUBhPb1Q-UUlpOUUVdS0dfUNjYniQRIcnV0QAZmyQHzyAwuCRAAUACwBPElVTcsjo2JqLfgxTABYG1LS0Fi9YDLbUACFNVToAE1VWAHMRAEFigHVVW1Vqyyd9+34AVkaQJo2fHb3Dk-PigAZM4AOXuCUezzeS3cDDWMFWoDmGwAHK1vrsDkdThclD1ZEcgpMHrYnq93lZ0dtMX8ccVlBwRhJwbVIeTUogXl9qb9sSItlcbnczA99k4kPZXGkmoiQPZudAflj-gKlMCwSKIWLbBL3gB2DZoOZUxU0vmq3oErrErXiyXLF4mkBK2n8+mM0zMzWs7W6pb+oA'); + await expect(page.getByLabel('Network Address')).toHaveValue('10.0.0.0'); + await expect(page.getByLabel('Network Size')).toHaveValue('20'); + await expect(page.getByLabel('10.0.0.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.0.0/24'); + await expect(page.getByLabel('10.0.1.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.1.0/24'); + await expect(page.getByLabel('10.0.2.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.2.0/24'); + await expect(page.getByLabel('10.0.3.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.3.0/24'); + await expect(page.getByLabel('10.0.4.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.4.0/23'); + await expect(page.getByLabel('10.0.6.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.6.0/23'); + await expect(page.getByLabel('10.0.8.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.8.0/24'); + await expect(page.getByLabel('10.0.9.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.9.0/24'); + await expect(page.getByLabel('10.0.10.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.10.0/23'); + await expect(page.getByLabel('10.0.12.0/23', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.12.0/23'); + await expect(page.getByLabel('10.0.14.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.14.0/24'); + await expect(page.getByLabel('10.0.15.0/24', { exact: true }).getByLabel('Subnet Address')).toContainText('10.0.15.0/24'); + await expect(page.getByRole('textbox', { name: '10.0.0.0/24 Note' })).toHaveValue('Data Center - Virtual Servers'); + await expect(page.getByRole('textbox', { name: '10.0.1.0/24 Note' })).toHaveValue('Data Center - Virtual Servers'); + await expect(page.getByRole('textbox', { name: '10.0.2.0/24 Note' })).toHaveValue('Data Center - Virtual Servers'); + await expect(page.getByRole('textbox', { name: '10.0.3.0/24 Note' })).toHaveValue('Data Center - Physical Servers'); + await expect(page.getByRole('textbox', { name: '10.0.4.0/23 Note' })).toHaveValue('Building A - Wifi'); + await expect(page.getByRole('textbox', { name: '10.0.6.0/23 Note' })).toHaveValue('Building A - LAN'); + await expect(page.getByRole('textbox', { name: '10.0.8.0/24 Note' })).toHaveValue('Building A - Printers'); + await expect(page.getByRole('textbox', { name: '10.0.9.0/24 Note' })).toHaveValue('Building A - Voice'); + await expect(page.getByRole('textbox', { name: '10.0.10.0/23 Note' })).toHaveValue('Building B - Wifi'); + await expect(page.getByRole('textbox', { name: '10.0.12.0/23 Note' })).toHaveValue('Building B - LAN'); + await expect(page.getByRole('textbox', { name: '10.0.14.0/24 Note' })).toHaveValue('Building B - Printers'); + await expect(page.getByRole('textbox', { name: '10.0.15.0/24 Note' })).toHaveValue('Building B - Voice'); + await expect(page.getByRole('row', { name: '10.0.0.0/24' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await expect(page.getByRole('row', { name: '10.0.1.0/24' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await expect(page.getByRole('row', { name: '10.0.2.0/24' })).toHaveCSS('background-color', 'rgb(155, 246, 255)'); + await expect(page.getByRole('row', { name: '10.0.3.0/24' })).toHaveCSS('background-color', 'rgb(160, 196, 255)'); + await expect(page.getByRole('row', { name: '10.0.4.0/23' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.6.0/23' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.8.0/24' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.9.0/24' })).toHaveCSS('background-color', 'rgb(255, 214, 165)'); + await expect(page.getByRole('row', { name: '10.0.10.0/23' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + await expect(page.getByRole('row', { name: '10.0.12.0/23' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + await expect(page.getByRole('row', { name: '10.0.14.0/24' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); + await expect(page.getByRole('row', { name: '10.0.15.0/24' })).toHaveCSS('background-color', 'rgb(253, 255, 182)'); +}); + + +//test('Test', async ({ page }) => { +// await page.goto('/'); +//}); +