diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index dcd89a2..ec258a9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -22,11 +22,9 @@ jobs: uses: akhileshns/heroku-deploy@v3.12.12 with: heroku_api_key: 5fcb9b2b-db25-41f5-80b1-c1da5f3fbd1d - heroku_app_name: ${{secrets.HEROKU_APP_NAME}} + heroku_app_name: bebeshare-deploy heroku_email: blood_nail@naver.com - - diff --git a/.gitignore b/.gitignore index a63ec65..8be218a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ ### Java ### # Compiled class file -*.class +*.class out/ InitClass.java .idea @@ -30,4 +30,6 @@ InitClass.java hs_err_pid* replay_pid* -# End of https://www.toptal.com/developers/gitignore/api/java \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/java + +.gradle diff --git a/.gradle/7.1/executionHistory/executionHistory.bin b/.gradle/7.1/executionHistory/executionHistory.bin index 416ae09..0223029 100644 Binary files a/.gradle/7.1/executionHistory/executionHistory.bin and b/.gradle/7.1/executionHistory/executionHistory.bin differ diff --git a/.gradle/7.1/executionHistory/executionHistory.lock b/.gradle/7.1/executionHistory/executionHistory.lock index 4c6108b..a0b412f 100644 Binary files a/.gradle/7.1/executionHistory/executionHistory.lock and b/.gradle/7.1/executionHistory/executionHistory.lock differ diff --git a/.gradle/7.1/fileHashes/fileHashes.bin b/.gradle/7.1/fileHashes/fileHashes.bin index ec95360..448e0e5 100644 Binary files a/.gradle/7.1/fileHashes/fileHashes.bin and b/.gradle/7.1/fileHashes/fileHashes.bin differ diff --git a/.gradle/7.1/fileHashes/fileHashes.lock b/.gradle/7.1/fileHashes/fileHashes.lock index 9576c3d..d1ae657 100644 Binary files a/.gradle/7.1/fileHashes/fileHashes.lock and b/.gradle/7.1/fileHashes/fileHashes.lock differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 4855ee7..7e13fbb 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index 378faa4..0781ef8 100644 Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock index 13facb4..83831f0 100644 Binary files a/.gradle/checksums/checksums.lock and b/.gradle/checksums/checksums.lock differ diff --git a/.gradle/checksums/md5-checksums.bin b/.gradle/checksums/md5-checksums.bin index c2de805..8124357 100644 Binary files a/.gradle/checksums/md5-checksums.bin and b/.gradle/checksums/md5-checksums.bin differ diff --git a/.gradle/checksums/sha1-checksums.bin b/.gradle/checksums/sha1-checksums.bin index bd59425..be679ba 100644 Binary files a/.gradle/checksums/sha1-checksums.bin and b/.gradle/checksums/sha1-checksums.bin differ diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 7113768..5386160 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,7 +6,7 @@ - + diff --git a/Procfile b/Procfile index 60b2c0b..5f07522 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web java -Dserver.port=$PORT $JAVA_OPTS -Dspring.profiles.active=prod -jar build/libs/7th-bebeShare-0.0.1-SNAPSHOT.jar' +web java -Dserver.port=$PORT $JAVA_OPTS -Dspring.profiles.active=prod -jar build/libs/bebeshare-deploy.jar \ No newline at end of file diff --git a/README.md b/README.md index 4a48cb4..2b50759 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,74 @@ -1. 프로젝트 Description +# 무료 나눔 플랫폼 - bebeShare - 💓 +
-- bebeShare +### 배포 링크 🔗 [https://bebeshare-deploy.herokuapp.com/](https://bebeshare-deploy.herokuapp.com/) +### API 링크 🔗 +### Github 링크 🔗 [https://github.com/Couch-Coders/7th-bebeShare](https://github.com/Couch-Coders/7th-bebeShare) +
-- 안쓰는 육아용품을 서로 무료로 나눔 하는 웹사이트. 가입한 유저들은 나눔할 육아용품을 올리고 나눔받을 사람을 찾는다. +### 육아용품 무료 나눔 웹사이트 +## ver.01 +### :baby_bottle: 사용하지 않는 육아용품을 나눔하고 나눔받을 수 있는 서비스 +> - 나눔을 희망하는 유저(쉐어)는 육아용품을 게시하고 나눔할 수 있습니다 +> - 나눔받기를 희망하는 유저(베베)는 댓글을 통해 나눔받기 신청을 할 수 있습니다 +> - 댓글을 통해 해당 물품을 나눔 받을 수 있습니다 -- 댓글을 통해 나눔의사를 밝히고 해당 물품을 나눔 받는다. +### :three: 나눔받기 횟수의 제한 +> - 유저는 일정기간 제한된 나눔받기 횟수만큼 나눔을 받을 수 있습니다 +> - 제공된 나눔받기 횟수를 모두 소진하더라도 나눔을 할 경우 나눔횟수가 추가됩니다 +> - 나눔하기 횟수는 제한이 없습니다 +### :heavy_check_mark: 관심목록 찜 기능 +> - 베베는 상품 상세 페이지에서 상품을 찜할 수 있습니다 -2. 프로젝트 정보 (ver 0.1) +### :alarm_clock: 알림을 통해 내가 업로드한 상품을 찜한 회원 확인 +> - 쉐어가 업로드한 상품을 베베가 찜하면 쉐어는 알림을 통해 확인할 수 있습니다 -- 현재 프로젝트는 상품나눔 게시글 작성 , 댓글을 통한 서로 나눔 -- 마이페이지 나눔 받을 횟수 , 나눔 한 횟수 , 나눔받을수 있는 횟수 대략 적인정보. -- 나눔내역 나눔받은 내역 , 찜목록 , 댓글 목록등을 나타낸다. -- 우선 기본적인 Default 기능이 완료 되면. 추후 기능을 늘려간다. +### :family: 마이페이지 +> - 마이페이지에서 나눔내역 횟수, 나눔목록, 찜목록, 댓글 목록을 볼 수 있습니다 +## ver.02 추가 예정 기능(희망) +> - 채팅을 통한 유저간 소통 +> - 알림 기능 +> - 유저들 간의 커뮤니티 기능 -- 추후 추가될 기능 (희망) +
-채팅을 통한 유저들의 소통 , 알림 기능 , 유저들 간의 커뮤니티 게시판 목록 +## 👨‍💻 팀원 소개 +| [권기준](https://github.com/superkkj) | [이태기](https://github.com/TevLee) | [홍유진](https://github.com/omnireader0) | +| :--------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------: | +| | | | +| BackEnd | BackEnd | BackEnd | +
+ +## :watch: 개발 기간 +- 2022.03.15 ~ + +## 개발 환경 +

+ + + + + + + +

+ +## 인프라 +

+ + +

+ +## 🛠 기획 및 설계 +- [DB 명세서](https://lean-owner-437.notion.site/DB-dc8f9dfa82504658b3324594b1e9f214) +![db800x715](https://user-images.githubusercontent.com/48271665/162228879-9fa529cc-c351-4397-92c7-673392d27cbf.png) + +- [API 명세서](https://lean-owner-437.notion.site/API-90cc212689ad4070b10fa83f822301bf) diff --git a/build.gradle b/build.gradle index 55cac96..725251d 100644 --- a/build.gradle +++ b/build.gradle @@ -39,16 +39,20 @@ repositories { } dependencies { + implementation group: 'com.google.firebase', name: 'firebase-admin', version: '8.0.1' + implementation('org.springframework.boot:spring-boot-starter-web') implementation 'junit:junit:4.13.1' implementation 'org.springframework.boot:spring-boot-starter-security' testImplementation('org.springframework.boot:spring-boot-starter-test') - implementation('org.projectlombok:lombok:1.18.10') - annotationProcessor('org.projectlombok:lombok:1.18.10') + implementation('org.projectlombok:lombok:1.18.20') + annotationProcessor('org.projectlombok:lombok:1.18.20') implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client' + implementation group: 'org.postgresql', name: 'postgresql', version: '42.3.3' + implementation('org.springframework.boot:spring-boot-starter-mustache') @@ -70,9 +74,21 @@ dependencies { implementation 'javax.annotation:javax.annotation-api:1.3.2' - - - + //websocket + implementation 'org.springframework.boot:spring-boot-starter-websocket' + implementation 'org.webjars:sockjs-client:1.1.2' + implementation 'org.webjars:stomp-websocket:2.3.3-1' + + //view + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect' + implementation 'org.springframework.boot:spring-boot-starter-freemarker' + implementation 'org.springframework.boot:spring-boot-devtools' + implementation 'org.webjars.bower:bootstrap:4.3.1' + implementation 'org.webjars.bower:vue:2.5.16' + implementation 'org.webjars.bower:axios:0.17.1' + implementation 'com.google.code.gson:gson:2.8.0' + runtimeOnly 'com.h2database:h2' } @@ -95,4 +111,13 @@ configurations { } querydsl.extendsFrom compileClasspath } -//querydsl 추가 끝 \ No newline at end of file +/** * comileQuerydsl.doFirst 추가 */ +// compileQuerydsl.doFirst { +// if(file(querydslDir).exists()) +// delete(file(querydslDir)) +// } +//querydsl 추가 끝 +bootJar { + archivesBaseName='bebeshare-deploy' + archiveFileName='bebeshare-deploy.jar' +} diff --git a/build/generated/querydsl/bebeShare/QBaseEntity.java b/build/generated/querydsl/bebeShare/QBaseEntity.java new file mode 100644 index 0000000..67350bf --- /dev/null +++ b/build/generated/querydsl/bebeShare/QBaseEntity.java @@ -0,0 +1,43 @@ +package bebeShare; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = 1239751561L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final DateTimePath createdDate = createDateTime("createdDate", java.time.LocalDateTime.class); + + public final NumberPath createedById = createNumber("createedById", Long.class); + + public final NumberPath modifiedById = createNumber("modifiedById", Long.class); + + public final DateTimePath modifiedDate = createDateTime("modifiedDate", java.time.LocalDateTime.class); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/build/generated/querydsl/bebeShare/domain/code/QCode.java b/build/generated/querydsl/bebeShare/domain/code/QCode.java new file mode 100644 index 0000000..a67ae01 --- /dev/null +++ b/build/generated/querydsl/bebeShare/domain/code/QCode.java @@ -0,0 +1,57 @@ +package bebeShare.domain.code; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCode is a Querydsl query type for Code + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QCode extends EntityPathBase { + + private static final long serialVersionUID = 465556057L; + + public static final QCode code1 = new QCode("code1"); + + public final bebeShare.QBaseEntity _super = new bebeShare.QBaseEntity(this); + + public final StringPath code = createString("code"); + + public final StringPath codeName = createString("codeName"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final NumberPath createedById = _super.createedById; + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final NumberPath modifiedById = _super.modifiedById; + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public final StringPath useYn = createString("useYn"); + + public QCode(String variable) { + super(Code.class, forVariable(variable)); + } + + public QCode(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCode(PathMetadata metadata) { + super(Code.class, metadata); + } + +} + diff --git a/build/generated/querydsl/bebeShare/domain/comment/QComment.java b/build/generated/querydsl/bebeShare/domain/comment/QComment.java new file mode 100644 index 0000000..61448d1 --- /dev/null +++ b/build/generated/querydsl/bebeShare/domain/comment/QComment.java @@ -0,0 +1,74 @@ +package bebeShare.domain.comment; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QComment is a Querydsl query type for Comment + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QComment extends EntityPathBase { + + private static final long serialVersionUID = -1348103589L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QComment comment = new QComment("comment"); + + public final bebeShare.QBaseEntity _super = new bebeShare.QBaseEntity(this); + + public final StringPath commentContent = createString("commentContent"); + + public final StringPath commentStatus = createString("commentStatus"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final NumberPath createedById = _super.createedById; + + public final StringPath deleteYn = createString("deleteYn"); + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final NumberPath modifiedById = _super.modifiedById; + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public final bebeShare.domain.product.QProduct product; + + public final bebeShare.domain.user.QUser user; + + public QComment(String variable) { + this(Comment.class, forVariable(variable), INITS); + } + + public QComment(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QComment(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QComment(PathMetadata metadata, PathInits inits) { + this(Comment.class, metadata, inits); + } + + public QComment(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.product = inits.isInitialized("product") ? new bebeShare.domain.product.QProduct(forProperty("product"), inits.get("product")) : null; + this.user = inits.isInitialized("user") ? new bebeShare.domain.user.QUser(forProperty("user")) : null; + } + +} + diff --git a/build/generated/querydsl/bebeShare/domain/like/QDibs.java b/build/generated/querydsl/bebeShare/domain/like/QDibs.java new file mode 100644 index 0000000..8a019ff --- /dev/null +++ b/build/generated/querydsl/bebeShare/domain/like/QDibs.java @@ -0,0 +1,68 @@ +package bebeShare.domain.like; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QDibs is a Querydsl query type for Dibs + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QDibs extends EntityPathBase { + + private static final long serialVersionUID = 1428990104L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QDibs dibs = new QDibs("dibs"); + + public final bebeShare.QBaseEntity _super = new bebeShare.QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final NumberPath createedById = _super.createedById; + + public final NumberPath Id = createNumber("Id", Long.class); + + //inherited + public final NumberPath modifiedById = _super.modifiedById; + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public final bebeShare.domain.product.QProduct product; + + public final bebeShare.domain.user.QUser user; + + public QDibs(String variable) { + this(Dibs.class, forVariable(variable), INITS); + } + + public QDibs(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QDibs(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QDibs(PathMetadata metadata, PathInits inits) { + this(Dibs.class, metadata, inits); + } + + public QDibs(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.product = inits.isInitialized("product") ? new bebeShare.domain.product.QProduct(forProperty("product"), inits.get("product")) : null; + this.user = inits.isInitialized("user") ? new bebeShare.domain.user.QUser(forProperty("user")) : null; + } + +} + diff --git a/build/generated/querydsl/bebeShare/domain/posts/QPosts.java b/build/generated/querydsl/bebeShare/domain/posts/QPosts.java new file mode 100644 index 0000000..e9aff16 --- /dev/null +++ b/build/generated/querydsl/bebeShare/domain/posts/QPosts.java @@ -0,0 +1,57 @@ +package bebeShare.domain.posts; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.Generated; +import com.querydsl.core.types.Path; + + +/** + * QPosts is a Querydsl query type for Posts + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QPosts extends EntityPathBase { + + private static final long serialVersionUID = -1653705725L; + + public static final QPosts posts = new QPosts("posts"); + + public final bebeShare.QBaseEntity _super = new bebeShare.QBaseEntity(this); + + public final StringPath author = createString("author"); + + public final StringPath content = createString("content"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final NumberPath createedById = _super.createedById; + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final NumberPath modifiedById = _super.modifiedById; + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public final StringPath title = createString("title"); + + public QPosts(String variable) { + super(Posts.class, forVariable(variable)); + } + + public QPosts(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QPosts(PathMetadata metadata) { + super(Posts.class, metadata); + } + +} + diff --git a/build/generated/querydsl/bebeShare/domain/product/QProduct.java b/build/generated/querydsl/bebeShare/domain/product/QProduct.java new file mode 100644 index 0000000..2d4500d --- /dev/null +++ b/build/generated/querydsl/bebeShare/domain/product/QProduct.java @@ -0,0 +1,85 @@ +package bebeShare.domain.product; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QProduct is a Querydsl query type for Product + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QProduct extends EntityPathBase { + + private static final long serialVersionUID = 20299643L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QProduct product = new QProduct("product"); + + public final bebeShare.QBaseEntity _super = new bebeShare.QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final NumberPath createedById = _super.createedById; + + public final StringPath deleteYn = createString("deleteYn"); + + public final ListPath dibs = this.createList("dibs", bebeShare.domain.like.Dibs.class, bebeShare.domain.like.QDibs.class, PathInits.DIRECT2); + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final NumberPath modifiedById = _super.modifiedById; + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public final StringPath productCategory = createString("productCategory"); + + public final StringPath productContent = createString("productContent"); + + public final StringPath productImage1 = createString("productImage1"); + + public final StringPath productImage2 = createString("productImage2"); + + public final StringPath productImage3 = createString("productImage3"); + + public final StringPath productName = createString("productName"); + + public final StringPath productStatus = createString("productStatus"); + + public final NumberPath shareId = createNumber("shareId", Long.class); + + public final bebeShare.domain.user.QUser user; + + public QProduct(String variable) { + this(Product.class, forVariable(variable), INITS); + } + + public QProduct(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QProduct(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QProduct(PathMetadata metadata, PathInits inits) { + this(Product.class, metadata, inits); + } + + public QProduct(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.user = inits.isInitialized("user") ? new bebeShare.domain.user.QUser(forProperty("user")) : null; + } + +} + diff --git a/build/generated/querydsl/bebeShare/domain/user/QUser.java b/build/generated/querydsl/bebeShare/domain/user/QUser.java new file mode 100644 index 0000000..ca4047a --- /dev/null +++ b/build/generated/querydsl/bebeShare/domain/user/QUser.java @@ -0,0 +1,68 @@ +package bebeShare.domain.user; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QUser is a Querydsl query type for User + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QUser extends EntityPathBase { + + private static final long serialVersionUID = 1932643609L; + + public static final QUser user = new QUser("user"); + + public final bebeShare.QBaseEntity _super = new bebeShare.QBaseEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final NumberPath createedById = _super.createedById; + + public final StringPath email = createString("email"); + + public final NumberPath giveCnt = createNumber("giveCnt", Integer.class); + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final NumberPath modifiedById = _super.modifiedById; + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public final StringPath name = createString("name"); + + public final StringPath picture = createString("picture"); + + public final ListPath products = this.createList("products", bebeShare.domain.product.Product.class, bebeShare.domain.product.QProduct.class, PathInits.DIRECT2); + + public final EnumPath role = createEnum("role", Role.class); + + public final NumberPath shareChanceCnt = createNumber("shareChanceCnt", Integer.class); + + public final NumberPath shareCnt = createNumber("shareCnt", Integer.class); + + public QUser(String variable) { + super(User.class, forVariable(variable)); + } + + public QUser(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QUser(PathMetadata metadata) { + super(User.class, metadata); + } + +} + diff --git a/build/generated/querydsl/bebeShare/web/dto/productDto/QProductInfoResponseDto.java b/build/generated/querydsl/bebeShare/web/dto/productDto/QProductInfoResponseDto.java new file mode 100644 index 0000000..8148671 --- /dev/null +++ b/build/generated/querydsl/bebeShare/web/dto/productDto/QProductInfoResponseDto.java @@ -0,0 +1,21 @@ +package bebeShare.web.dto.productDto; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.ConstructorExpression; +import javax.annotation.Generated; + +/** + * bebeShare.web.dto.productDto.QProductInfoResponseDto is a Querydsl Projection type for ProductInfoResponseDto + */ +@Generated("com.querydsl.codegen.DefaultProjectionSerializer") +public class QProductInfoResponseDto extends ConstructorExpression { + + private static final long serialVersionUID = 248330593L; + + public QProductInfoResponseDto(com.querydsl.core.types.Expression ProductId, com.querydsl.core.types.Expression Productname, com.querydsl.core.types.Expression ProductImage1, com.querydsl.core.types.Expression dibsId, com.querydsl.core.types.Expression InsertDt) { + super(ProductInfoResponseDto.class, new Class[]{long.class, String.class, String.class, long.class, java.time.LocalDateTime.class}, ProductId, Productname, ProductImage1, dibsId, InsertDt); + } + +} + diff --git a/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QGiveInfoResponseDto.java b/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QGiveInfoResponseDto.java new file mode 100644 index 0000000..2bdbf18 --- /dev/null +++ b/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QGiveInfoResponseDto.java @@ -0,0 +1,21 @@ +package bebeShare.web.dto.userDto.dto; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.ConstructorExpression; +import javax.annotation.Generated; + +/** + * bebeShare.web.dto.userDto.dto.QGiveInfoResponseDto is a Querydsl Projection type for GiveInfoResponseDto + */ +@Generated("com.querydsl.codegen.DefaultProjectionSerializer") +public class QGiveInfoResponseDto extends ConstructorExpression { + + private static final long serialVersionUID = 1355540888L; + + public QGiveInfoResponseDto(com.querydsl.core.types.Expression productId, com.querydsl.core.types.Expression productName, com.querydsl.core.types.Expression productImage1, com.querydsl.core.types.Expression insertDt) { + super(GiveInfoResponseDto.class, new Class[]{long.class, String.class, String.class, java.time.LocalDateTime.class}, productId, productName, productImage1, insertDt); + } + +} + diff --git a/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QLikeInfoResponseDto.java b/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QLikeInfoResponseDto.java new file mode 100644 index 0000000..ce9542c --- /dev/null +++ b/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QLikeInfoResponseDto.java @@ -0,0 +1,21 @@ +package bebeShare.web.dto.userDto.dto; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.ConstructorExpression; +import javax.annotation.Generated; + +/** + * bebeShare.web.dto.userDto.dto.QLikeInfoResponseDto is a Querydsl Projection type for LikeInfoResponseDto + */ +@Generated("com.querydsl.codegen.DefaultProjectionSerializer") +public class QLikeInfoResponseDto extends ConstructorExpression { + + private static final long serialVersionUID = -573355950L; + + public QLikeInfoResponseDto(com.querydsl.core.types.Expression productId, com.querydsl.core.types.Expression productName, com.querydsl.core.types.Expression productImage1, com.querydsl.core.types.Expression insertDt) { + super(LikeInfoResponseDto.class, new Class[]{long.class, String.class, String.class, java.time.LocalDateTime.class}, productId, productName, productImage1, insertDt); + } + +} + diff --git a/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QMemberCommentResponseDto.java b/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QMemberCommentResponseDto.java new file mode 100644 index 0000000..847882a --- /dev/null +++ b/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QMemberCommentResponseDto.java @@ -0,0 +1,21 @@ +package bebeShare.web.dto.userDto.dto; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.ConstructorExpression; +import javax.annotation.Generated; + +/** + * bebeShare.web.dto.userDto.dto.QMemberCommentResponseDto is a Querydsl Projection type for MemberCommentResponseDto + */ +@Generated("com.querydsl.codegen.DefaultProjectionSerializer") +public class QMemberCommentResponseDto extends ConstructorExpression { + + private static final long serialVersionUID = 1947621696L; + + public QMemberCommentResponseDto(com.querydsl.core.types.Expression commentId, com.querydsl.core.types.Expression productName, com.querydsl.core.types.Expression commentContent, com.querydsl.core.types.Expression insertDt) { + super(MemberCommentResponseDto.class, new Class[]{long.class, String.class, String.class, java.time.LocalDateTime.class}, commentId, productName, commentContent, insertDt); + } + +} + diff --git a/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QShareInfoResponseDto.java b/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QShareInfoResponseDto.java new file mode 100644 index 0000000..c6c1495 --- /dev/null +++ b/build/generated/querydsl/bebeShare/web/dto/userDto/dto/QShareInfoResponseDto.java @@ -0,0 +1,21 @@ +package bebeShare.web.dto.userDto.dto; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.ConstructorExpression; +import javax.annotation.Generated; + +/** + * bebeShare.web.dto.userDto.dto.QShareInfoResponseDto is a Querydsl Projection type for ShareInfoResponseDto + */ +@Generated("com.querydsl.codegen.DefaultProjectionSerializer") +public class QShareInfoResponseDto extends ConstructorExpression { + + private static final long serialVersionUID = -220659464L; + + public QShareInfoResponseDto(com.querydsl.core.types.Expression productId, com.querydsl.core.types.Expression productName, com.querydsl.core.types.Expression productImage1, com.querydsl.core.types.Expression insertDt) { + super(ShareInfoResponseDto.class, new Class[]{long.class, String.class, String.class, java.time.LocalDateTime.class}, productId, productName, productImage1, insertDt); + } + +} + diff --git a/build/tmp/compileQuerydsl/previous-compilation-data.bin b/build/tmp/compileQuerydsl/previous-compilation-data.bin new file mode 100644 index 0000000..b8ca112 Binary files /dev/null and b/build/tmp/compileQuerydsl/previous-compilation-data.bin differ diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..e70bd49 --- /dev/null +++ b/firebase.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "bebeshare-image", + "private_key_id": "ed1c006cd0cbe5095891fa824fc535c9db14968b", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCRRqywE82VCnu/\nheWiZQajC2DBhqyAiNvXqo2djzsZD+mjoIIXIxZZPrC7EjT0saoa+23T+449r2DM\nlHDQxqGK+PRCp0/BfaN8Dn+G87ykq+7b8NfQgB/kkQH/IAiuWaQNGxSPloJjZUBc\nllT0g9DK3hIWrCTclTehaymrlpXTatUXtAKq1jSe0M4rG4ksedgZ281yemDuogBN\nAi0lgLHuZu9THxfTtpYDmuDFf0x3kQaal2Qvb0tkZNKymUNjXXVpwGpv5gZQ3KNZ\nfLudgYM3I5vYZariNYLDM5IvqITjHQEN929l0EQLfEo4IYqWXcljc6CgXtPwImSj\nLkXiZW+lAgMBAAECggEAAI6gKZS0hyEhKbIzwpRXRYIiVDEAsbAqAlZkcKQ/T8X1\n2Wt2KZc4MLjC02orIH0bRTs4R/CBB8+HtCvQOvISuzEKjsQ21BZ37V6I3VWgoD5g\njiC1qIEKnkUdbYML8CSRMn5WF9mLP80ARYVLZ3H8olUzsI6RyElyNdZECfpr3Kxc\nu1YMLgXnV3neuec6eqDt/v9QNN8Q76dvdEagINI6Ixxnq+IxY1MBq4loUFKRYhDu\nThd65IEp8eZHftMU08R1Pg3mbR8Yj1cyGYRKYppzMDmHO19y+sS+fju4GgI0kxGR\nAgUDiiKHPIO/t7lHE6x4xzLc5oy9pnI0xlxOZnmxSQKBgQDG0yBGDmBEtg8cLA/o\nybg1nUEqGM1ALqkrS6QGqCE2ybIiAI2KlFlNJJyMbJPKqU0Lv8QTRhy5gR+q+jyo\n53tYjmsDqdgI8H0yCwRkaGGVD6nhRUNeGUGFB/uq1ogRqvIt9wHS0jtzdDYMD1gl\ntgsADCZQ+h1WjiV14TC4XANkmwKBgQC7DXWsPf0I/JKim/N4d7rjEgSzdZQzB5KG\nh7zOGTECRL+MhPTBWMQqcJHVpBMxCFf5IlgV2aWidbcsBzj4AbREZg2cvFsL3uyT\nNk5W+eBP7bSuHPcpQL8ZQXP/ZFucs5wlrQGauje/O0ddQOXHDD30dN3YvFm7UzID\nOx4NEX4gvwKBgHbGg342cl454Lb0v6BSeWBWDCrI3DzeYyNBMcDkSctAHNFhQS0r\nSFnkaD0fU/76utMtAUZ+WQSc1b0/dmN0veP+WIG8whk9CZ2OpVYSYVE6JUM1LHSX\nY+PEDB1XwbvEQp8g847tFqT3JJ55wC/vG40wtOclM8eUbV6JY6CPH1vHAoGAYSwm\n22oAj7CWhL87hnO8tMXhh1EnwjLG3fiaDv9rRGBumhNgCymQDvQX7sKj7a8F9Ljw\nxbkhoPpCRC8kW0KXYYkavTfknJAcmoV1wR1ieGNmn6UQiW/HVtl35089gHSWQ8RS\ntwzSdRfYhQt30yX68YnczgFbJEOeEaueeu+BdIUCgYEAqOkw+vnNSWXTSQb+Uzrl\nTEn8Af0Dc3tavt8FZG05HmGclU/LVFVMZdsSDd1pUxHPgBEyp1Q2NTq4T9t8vr8K\njHDe5sibUEHlT0E0ZBe0FKcDm6M/tFBzzc01fxHJ+6OZgC+bJgXVC1zcnSrEHhiU\nGlJcjN1SRAc7NNFkwxApTSk=\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-n7s06@bebeshare-image.iam.gserviceaccount.com", + "client_id": "116660085712625798330", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-n7s06%40bebeshare-image.iam.gserviceaccount.com" +} diff --git a/src/main/java/bebeShare/Application.java b/src/main/java/bebeShare/Application.java index 1cdbc1a..4122207 100644 --- a/src/main/java/bebeShare/Application.java +++ b/src/main/java/bebeShare/Application.java @@ -1,7 +1,11 @@ package bebeShare; +import org.apache.catalina.connector.Connector; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.support.ResourceBundleMessageSource; @@ -25,4 +29,16 @@ public MessageSource messageSource() { return MS; } + @Bean + public ConfigurableServletWebServerFactory webServerFactory() { + TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); + factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { + @Override + public void customize(Connector connector) { + connector.setProperty("relaxedQueryChars", "|{}[]"); + } + }); + return factory; + } + } diff --git a/src/main/java/bebeShare/config/auth/SecurityConfig.java b/src/main/java/bebeShare/config/auth/SecurityConfig.java index f73cc14..de0afd9 100644 --- a/src/main/java/bebeShare/config/auth/SecurityConfig.java +++ b/src/main/java/bebeShare/config/auth/SecurityConfig.java @@ -23,7 +23,7 @@ protected void configure(HttpSecurity http) throws Exception { .headers().frameOptions().disable() .and() .authorizeRequests() - .antMatchers("/", "/css/**", "/images/**", "/js/**", "/h2-console/**", "/profiles").permitAll() + .antMatchers("/","/api/v1/categories","/api/v1/products","/resources/**","/static/**", "/css/**", "/images/**", "/js/**", "/h2-console/**", "/profiles","/products/images/**").permitAll() .antMatchers("/api/v1/**").hasRole(Role.USER.name()) .anyRequest().authenticated() .and() diff --git a/src/main/java/bebeShare/config/auth/dto/SessionUser.java b/src/main/java/bebeShare/config/auth/dto/SessionUser.java index b3a1e44..65686d0 100644 --- a/src/main/java/bebeShare/config/auth/dto/SessionUser.java +++ b/src/main/java/bebeShare/config/auth/dto/SessionUser.java @@ -10,7 +10,7 @@ @ToString @Getter @RequiredArgsConstructor -public class SessionUser implements Serializable { +public class SessionUser extends User implements Serializable { private Long id; private String name; diff --git a/src/main/java/bebeShare/config/chat/ChatConfig.java b/src/main/java/bebeShare/config/chat/ChatConfig.java new file mode 100644 index 0000000..74abb9b --- /dev/null +++ b/src/main/java/bebeShare/config/chat/ChatConfig.java @@ -0,0 +1,25 @@ +package bebeShare.config.chat; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +public class ChatConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/ws/chat").setAllowedOriginPatterns("*").withSockJS(); + } + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + + registry.enableSimpleBroker("/queue", "/topic"); + + registry.setApplicationDestinationPrefixes("/app"); + } +} \ No newline at end of file diff --git a/src/main/java/bebeShare/config/firebase/FirebaseConfig.java b/src/main/java/bebeShare/config/firebase/FirebaseConfig.java new file mode 100644 index 0000000..4b1b292 --- /dev/null +++ b/src/main/java/bebeShare/config/firebase/FirebaseConfig.java @@ -0,0 +1,39 @@ +package bebeShare.config.firebase; + +import com.google.auth.oauth2.GoogleCredentials; +import com.google.cloud.storage.Bucket; +import com.google.firebase.FirebaseApp; +import com.google.firebase.FirebaseOptions; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.cloud.StorageClient; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +import java.io.FileInputStream; +import java.io.IOException; + +@Configuration +@Slf4j +public class FirebaseConfig { + @Bean + public FirebaseApp firebaseApp() throws IOException{ + log.info("Initializing Firebase."); + FileInputStream serviceAccount = new FileInputStream("firebase.json"); + + FirebaseOptions options = new FirebaseOptions.Builder() + .setCredentials(GoogleCredentials.fromStream(serviceAccount)) + .setStorageBucket("bebeshare-image.appspot.com") + .build(); + + FirebaseApp app = FirebaseApp.initializeApp(options); + log.info("FirebaseApp initialized" + app.getName()); + return app; + } + + @Bean + public Bucket bucket() throws IOException{ + return StorageClient.getInstance(firebaseApp()).bucket(); + } +} diff --git a/src/main/java/bebeShare/config/redis/RedisConfig.java b/src/main/java/bebeShare/config/redis/RedisConfig.java index f10892c..5390218 100644 --- a/src/main/java/bebeShare/config/redis/RedisConfig.java +++ b/src/main/java/bebeShare/config/redis/RedisConfig.java @@ -1,10 +1,10 @@ package bebeShare.config.redis; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.data.redis.LettuceClientConfigurationBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.session.data.redis.config.ConfigureRedisAction; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer; @@ -14,16 +14,19 @@ @RequiredArgsConstructor public class RedisConfig extends AbstractHttpSessionApplicationInitializer { - @Value("${spring.redis.host}") - private String host; - - @Value("${spring.redis.port}") - private Integer port; - + @Bean + public LettuceClientConfigurationBuilderCustomizer lettuceClientConfigurationBuilderCustomizer() { + return clientConfigurationBuilder -> { + if (clientConfigurationBuilder.build().isUseSsl()) { + clientConfigurationBuilder.useSsl().disablePeerVerification(); + } + }; + } @Bean - public LettuceConnectionFactory connectionFactory() { - return new LettuceConnectionFactory(host, port); // ip, port + public static ConfigureRedisAction configureRedisAction() { + return ConfigureRedisAction.NO_OP; } + } \ No newline at end of file diff --git a/src/main/java/bebeShare/domain/chat/ChatMessage.java b/src/main/java/bebeShare/domain/chat/ChatMessage.java new file mode 100644 index 0000000..bb4262d --- /dev/null +++ b/src/main/java/bebeShare/domain/chat/ChatMessage.java @@ -0,0 +1,24 @@ +package bebeShare.domain.chat; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ChatMessage { + + public enum MessageType { + ENTER, TALK + } + + private MessageType type; + //채팅방 ID + private String roomId; + //보내는 사람 + private String sender; + //내용 + private String message; +} \ No newline at end of file diff --git a/src/main/java/bebeShare/domain/chat/ChatRoom.java b/src/main/java/bebeShare/domain/chat/ChatRoom.java new file mode 100644 index 0000000..8442bf6 --- /dev/null +++ b/src/main/java/bebeShare/domain/chat/ChatRoom.java @@ -0,0 +1,22 @@ +package bebeShare.domain.chat; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Data +@NoArgsConstructor +public class ChatRoom { + + private String roomId; + private String roomName; + + + public static ChatRoom create(String name) { + ChatRoom room = new ChatRoom(); + room.roomId = UUID.randomUUID().toString(); + room.roomName = name; + return room; + } +} \ No newline at end of file diff --git a/src/main/java/bebeShare/domain/chat/controller/ChatRoomController.java b/src/main/java/bebeShare/domain/chat/controller/ChatRoomController.java new file mode 100644 index 0000000..fe019ba --- /dev/null +++ b/src/main/java/bebeShare/domain/chat/controller/ChatRoomController.java @@ -0,0 +1,48 @@ +package bebeShare.domain.chat.controller; + +import bebeShare.domain.chat.ChatRoom; +import bebeShare.domain.chat.service.ChatService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@RequiredArgsConstructor +@RequestMapping("/chat") +public class ChatRoomController { + private final ChatService chatService; + + // 채팅 리스트 화면 + @GetMapping("/room") + public String rooms(Model model) { + return "/chat/room"; + } + // 모든 채팅방 목록 반환 + @GetMapping("/rooms") + @ResponseBody + public List room() { + return chatService.findAllRoom(); + } + + // 채팅방 생성 + @PostMapping("/room") + @ResponseBody + public ChatRoom createRoom(@RequestParam String name) { + return chatService.createRoom(name); + } + // 채팅방 입장 화면 + @GetMapping("/room/enter/{roomId}") + public String roomDetail(Model model, @PathVariable String roomId) { + model.addAttribute("roomId", roomId); + return "/chat/roomdetail"; + } + // 특정 채팅방 조회 + @GetMapping("/room/{roomId}") + @ResponseBody + public ChatRoom roomInfo(@PathVariable String roomId) { + return chatService.findById(roomId); + } +} \ No newline at end of file diff --git a/src/main/java/bebeShare/domain/chat/controller/MessageController.java b/src/main/java/bebeShare/domain/chat/controller/MessageController.java new file mode 100644 index 0000000..52bea51 --- /dev/null +++ b/src/main/java/bebeShare/domain/chat/controller/MessageController.java @@ -0,0 +1,22 @@ +package bebeShare.domain.chat.controller; + +import bebeShare.domain.chat.ChatMessage; +import lombok.RequiredArgsConstructor; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.simp.SimpMessageSendingOperations; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class MessageController { + + private final SimpMessageSendingOperations sendingOperations; + + @MessageMapping("/chat/message") + public void enter(ChatMessage message) { + if (ChatMessage.MessageType.ENTER.equals(message.getType())) { + message.setMessage(message.getSender()+"님이 입장하였습니다."); + } + sendingOperations.convertAndSend("/topic/chat/room/"+message.getRoomId(),message); + } +} \ No newline at end of file diff --git a/src/main/java/bebeShare/domain/chat/service/ChatService.java b/src/main/java/bebeShare/domain/chat/service/ChatService.java new file mode 100644 index 0000000..059b84d --- /dev/null +++ b/src/main/java/bebeShare/domain/chat/service/ChatService.java @@ -0,0 +1,44 @@ +package bebeShare.domain.chat.service; + +import bebeShare.domain.chat.ChatRoom; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.*; + +@Service +@Slf4j +@RequiredArgsConstructor +public class ChatService { + + private Map chatRooms; + + @PostConstruct + //의존관게 주입완료되면 실행되는 코드 + private void init() { + chatRooms = new LinkedHashMap<>(); + } + + //채팅방 불러오기 + public List findAllRoom() { + //채팅방 최근 생성 순으로 반환 + List result = new ArrayList<>(chatRooms.values()); + Collections.reverse(result); + + return result; + } + + //채팅방 하나 불러오기 + public ChatRoom findById(String roomId) { + return chatRooms.get(roomId); + } + + //채팅방 생성 + public ChatRoom createRoom(String name) { + ChatRoom chatRoom = ChatRoom.create(name); + chatRooms.put(chatRoom.getRoomId(), chatRoom); + return chatRoom; + } +} diff --git a/src/main/java/bebeShare/domain/code/Code.java b/src/main/java/bebeShare/domain/code/Code.java index ac1e8e5..74cb076 100644 --- a/src/main/java/bebeShare/domain/code/Code.java +++ b/src/main/java/bebeShare/domain/code/Code.java @@ -24,8 +24,7 @@ public class Code extends BaseEntity { private String useYn; @Builder - public Code(Long id, String code, String codeName, String useYn) { - this.id = id; + public Code(String code, String codeName, String useYn) { this.code = code; this.codeName = codeName; this.useYn = useYn; diff --git a/src/main/java/bebeShare/domain/code/CodeRepository.java b/src/main/java/bebeShare/domain/code/CodeRepository.java index b291056..63679c4 100644 --- a/src/main/java/bebeShare/domain/code/CodeRepository.java +++ b/src/main/java/bebeShare/domain/code/CodeRepository.java @@ -11,4 +11,7 @@ public interface CodeRepository extends JpaRepository { @Query("select new bebeShare.web.dto.codeDto.CodeResponseDto(c) from Code c where c.code = :code") List lookup(@Param("code") String code); + + + List findByCode(@Param("code") String code); } diff --git a/src/main/java/bebeShare/domain/comment/Comment.java b/src/main/java/bebeShare/domain/comment/Comment.java index a78b665..985dbb5 100644 --- a/src/main/java/bebeShare/domain/comment/Comment.java +++ b/src/main/java/bebeShare/domain/comment/Comment.java @@ -50,15 +50,13 @@ public Comment(User user , Product product ,String commentContent ,String delete this.commentStatus = commentStatus; } - public void update(Long id, CommentUpdateRequestsDto c) { - this.id = id; - this.product = c.getProduct(); - this.user = c.getUser(); + public void update(CommentUpdateRequestsDto c) { + this.id = c.getCommentId(); this.commentContent = c.getCommentContent(); this.deleteYn = c.getDeleteYn(); this.commentStatus = c.getCommentStatus(); } - public void delete(CommentDeleteRequestDto c){ - this.deleteYn = c.getDeleteYn(); + public void delete(){ + this.deleteYn = "Y"; } } diff --git a/src/main/java/bebeShare/domain/comment/CommentRepository.java b/src/main/java/bebeShare/domain/comment/CommentRepository.java index 44df4ea..f571732 100644 --- a/src/main/java/bebeShare/domain/comment/CommentRepository.java +++ b/src/main/java/bebeShare/domain/comment/CommentRepository.java @@ -1,9 +1,11 @@ package bebeShare.domain.comment; +import bebeShare.web.dto.commentDto.CommentUpdateRequestsDto; +import bebeShare.web.dto.commentDto.CommentUpdateResponseDto; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.querydsl.QuerydslPredicateExecutor; -public interface CommentRepository extends JpaRepository { - +public interface CommentRepository extends JpaRepository , CommentRepositoryCustom,QuerydslPredicateExecutor { } diff --git a/src/main/java/bebeShare/domain/comment/CommentRepositoryCustom.java b/src/main/java/bebeShare/domain/comment/CommentRepositoryCustom.java new file mode 100644 index 0000000..af158f6 --- /dev/null +++ b/src/main/java/bebeShare/domain/comment/CommentRepositoryCustom.java @@ -0,0 +1,17 @@ +package bebeShare.domain.comment; + +import bebeShare.web.dto.commentDto.CommentInfoResponseDto; +import bebeShare.web.dto.commentDto.CommentUpdateRequestsDto; +import bebeShare.web.dto.commentDto.CommentUpdateResponseDto; +import bebeShare.web.dto.commentDto.CommentsRequest; +import bebeShare.web.dto.productDto.RejectShareRequest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface CommentRepositoryCustom { + + Page findByProductId(CommentsRequest commentsRequest, Pageable pageable); + + Long updateByCommentId(CommentUpdateRequestsDto updateRequestsDto); + +} diff --git a/src/main/java/bebeShare/domain/comment/CommentRepositoryImpl.java b/src/main/java/bebeShare/domain/comment/CommentRepositoryImpl.java new file mode 100644 index 0000000..fa0aea6 --- /dev/null +++ b/src/main/java/bebeShare/domain/comment/CommentRepositoryImpl.java @@ -0,0 +1,77 @@ +package bebeShare.domain.comment; + +import bebeShare.web.dto.commentDto.*; +import bebeShare.web.dto.productDto.RejectShareRequest; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQuery; +import com.querydsl.jpa.impl.JPAQueryFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.support.PageableExecutionUtils; + +import javax.persistence.EntityManager; +import java.util.List; + +import static bebeShare.domain.comment.QComment.comment; +import static bebeShare.domain.product.QProduct.product; + + +public class CommentRepositoryImpl implements CommentRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + public CommentRepositoryImpl(EntityManager em) { + this.queryFactory = new JPAQueryFactory(em); + } + + + @Override + public Page findByProductId(CommentsRequest commentsRequest, Pageable pageable) { + + + List result = queryFactory + .select(new QCommentInfoResponseDto( + comment.id, + comment.commentContent, + comment.deleteYn, + comment.commentStatus, + comment.user.picture, + comment.user.id, + comment.product.shareId, + comment.createdDate.as("insertDt") + )) + .from(comment) + .where( + commentProductIdEq(commentsRequest.getProductId()), + comment.deleteYn.eq("N") + ) + .offset(pageable.getPageNumber()) + .limit(pageable.getPageSize()) + .orderBy(comment.createdDate.asc()) + .fetch(); + + + JPAQuery countQuery = queryFactory.select(comment) + .from(comment) + .where( + commentProductIdEq(commentsRequest.getProductId()) + ); + + return PageableExecutionUtils.getPage(result, pageable, () -> countQuery.fetchCount()); + + } + + @Override + public Long updateByCommentId(CommentUpdateRequestsDto updateRequestsDto) { + return queryFactory + .update(comment) + .set(comment.commentContent,updateRequestsDto.getCommentContent()) + .where(comment.id.eq(updateRequestsDto.getCommentId())) + .execute(); + + } + + private BooleanExpression commentProductIdEq(Long proudctId) { + return proudctId == null ? comment.product.id.isNull() : comment.product.id.eq(proudctId); + } +} diff --git a/src/main/java/bebeShare/domain/common/CommonContants.java b/src/main/java/bebeShare/domain/common/CommonContants.java index 705d72d..a5c2723 100644 --- a/src/main/java/bebeShare/domain/common/CommonContants.java +++ b/src/main/java/bebeShare/domain/common/CommonContants.java @@ -4,5 +4,6 @@ public class CommonContants { public static final String COMMENT_SAVE_OK = "댓글 등록 성공"; public static final String COMMENT_UPDATE_OK = "댓글 수정 성공"; + public static final String COMMENT_UPDATE_FAIL = "댓글 수정 실패"; public static final String COMMENT_DELETE_OK = "댓글 삭제 성공"; } diff --git a/src/main/java/bebeShare/domain/common/entity/PageEntity.java b/src/main/java/bebeShare/domain/common/entity/PageEntity.java index 68707b0..4762d54 100644 --- a/src/main/java/bebeShare/domain/common/entity/PageEntity.java +++ b/src/main/java/bebeShare/domain/common/entity/PageEntity.java @@ -1,12 +1,10 @@ package bebeShare.domain.common.entity; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; -@Getter -@Setter +@Data public class PageEntity { - private int page; - private int size; + private int page = 0; + private int size = 9; } diff --git a/src/main/java/bebeShare/domain/like/Dibs.java b/src/main/java/bebeShare/domain/like/Dibs.java index b51dc50..6fcf676 100644 --- a/src/main/java/bebeShare/domain/like/Dibs.java +++ b/src/main/java/bebeShare/domain/like/Dibs.java @@ -4,13 +4,16 @@ import bebeShare.BaseEntity; import bebeShare.domain.product.Product; import bebeShare.domain.user.User; +import bebeShare.web.dto.likeDto.SaveLikeDto; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import javax.persistence.*; @Getter +@Setter @NoArgsConstructor @Entity public class Dibs extends BaseEntity { @@ -36,7 +39,8 @@ public Dibs(User user , Product product) { this.product = product; } - public void addUserAndProduct(User user , Product product){ + + public void addLike(SaveLikeDto saveLikeDto) { this.user = user; this.product = product; } diff --git a/src/main/java/bebeShare/domain/product/Product.java b/src/main/java/bebeShare/domain/product/Product.java index f9a0443..bd6da37 100644 --- a/src/main/java/bebeShare/domain/product/Product.java +++ b/src/main/java/bebeShare/domain/product/Product.java @@ -2,14 +2,17 @@ import bebeShare.BaseEntity; +import bebeShare.domain.like.Dibs; import bebeShare.domain.user.User; import bebeShare.web.dto.productDto.ProductCreateRequestDto; import bebeShare.web.dto.productDto.ProductDeleteDto; import lombok.*; import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; -@ToString(of = {"id", "productName", "productContent", "productImage1", "productImage2", "productImage3", "productStatus", "productCategory", "deleteYn"}) +@ToString @Getter @NoArgsConstructor @Table(name = "Product") @@ -23,11 +26,16 @@ public class Product extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "memberId") + @ToString.Exclude private User user; + @OneToMany(mappedBy = "product") + @ToString.Exclude + private List dibs = new ArrayList<>(); + + private String productName; - private String productContent; private String productImage1; @@ -44,9 +52,18 @@ public class Product extends BaseEntity { private Long shareId; + public void setDibs(List dibs) { + this.dibs = dibs; + } + + public void setUser(User user) { + this.user = user; + } + @Builder - public Product(User user, String productName, String productContent,String productImage1, String productImage2, String productImage3, String productStatus, String productCategory ,String deleteYn + public Product(User user, String productName, String productContent,String productImage1, + String productImage2, String productImage3, String productStatus, String productCategory ,String deleteYn ,Long shareId) { this.user = user; @@ -59,7 +76,6 @@ public Product(User user, String productName, String productContent,String produ this.productCategory = productCategory; this.deleteYn = deleteYn; this.shareId = shareId; - } public void addUser(User user){ @@ -72,9 +88,6 @@ public void update(ProductCreateRequestDto pro) { this.user = pro.getUser(); this.productName = pro.getProductName(); this.productContent = pro.getProductContent(); - this.productImage2 = pro.getProductImage2(); - this.productImage3 = pro.getProductImage3(); - this.productImage1 = pro.getProductImage1(); this.productStatus = pro.getProductStatus(); this.productCategory = pro.getProductCategory(); } diff --git a/src/main/java/bebeShare/domain/product/ProductRepository.java b/src/main/java/bebeShare/domain/product/ProductRepository.java index 7a2b7be..5cff93b 100644 --- a/src/main/java/bebeShare/domain/product/ProductRepository.java +++ b/src/main/java/bebeShare/domain/product/ProductRepository.java @@ -1,10 +1,12 @@ package bebeShare.domain.product; +import bebeShare.domain.user.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.querydsl.QuerydslPredicateExecutor; import java.util.Optional; -public interface ProductRepository extends JpaRepository { +public interface ProductRepository extends JpaRepository, ProductRepositoryCustom, QuerydslPredicateExecutor { Optional findById(Long id); } diff --git a/src/main/java/bebeShare/domain/product/ProductRepositoryCustom.java b/src/main/java/bebeShare/domain/product/ProductRepositoryCustom.java new file mode 100644 index 0000000..f2e0c9d --- /dev/null +++ b/src/main/java/bebeShare/domain/product/ProductRepositoryCustom.java @@ -0,0 +1,18 @@ +package bebeShare.domain.product; + +import bebeShare.web.dto.productDto.ApproveShareProductRequest; +import bebeShare.web.dto.productDto.*; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface ProductRepositoryCustom { + Page findAllProducts(ProductRequest productRequest, Pageable pageable); + + Long approveShare(ApproveShareProductRequest approveShareProductRequest); + + Long completeShare(CompleteShareRequest completeShareRequest); + + Long rejectShare(RejectShareRequest rejectShareRequest); + + Long updateProductDetail(ProductCreateRequestDto productCreateRequestDto); +} diff --git a/src/main/java/bebeShare/domain/product/ProductRepositoryImpl.java b/src/main/java/bebeShare/domain/product/ProductRepositoryImpl.java new file mode 100644 index 0000000..2f1064b --- /dev/null +++ b/src/main/java/bebeShare/domain/product/ProductRepositoryImpl.java @@ -0,0 +1,120 @@ +package bebeShare.domain.product; + +import bebeShare.web.dto.productDto.*; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQuery; +import com.querydsl.jpa.impl.JPAQueryFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.support.PageableExecutionUtils; + +import javax.persistence.EntityManager; +import java.util.List; + +import static bebeShare.domain.like.QDibs.dibs; +import static bebeShare.domain.product.QProduct.product; +import static org.springframework.util.StringUtils.hasText; + +public class ProductRepositoryImpl implements ProductRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + public ProductRepositoryImpl(EntityManager em) { + this.queryFactory = new JPAQueryFactory(em); + } + + @Override + public Page findAllProducts(ProductRequest productRequest, Pageable pageable) { + + List result = queryFactory + .select(new QProductInfoResponseDto( + product.id, + product.productName, + product.productImage1, + dibs.Id, + product.createdDate.as("insertDt") + )) + .from(product) + .leftJoin(product.dibs, dibs) + .where( + productNameEq(productRequest.getProductName()), + productCategoryEq(productRequest.getCategoryCode()), + productStatusEq(productRequest.getProductStatus()), + product.deleteYn.eq("N") + ) + .orderBy(product.createdDate.desc()) + .orderBy(product.createdDate.asc()) + .from(product) + .offset(pageable.getPageNumber()) + .limit(pageable.getPageSize()) + .fetch(); + + JPAQuery countQuery = queryFactory.select(product) + .from(product) + .leftJoin(product.dibs, dibs) + .where( + productNameEq(productRequest.getProductName()), + productCategoryEq(productRequest.getCategoryCode()), + productStatusEq(productRequest.getProductStatus()) + ); + + return PageableExecutionUtils.getPage(result, pageable, () -> countQuery.fetchCount()); + } + + @Override + public Long approveShare(ApproveShareProductRequest approveShareProductRequest) { + return queryFactory + .update(product) + .set(product.shareId,approveShareProductRequest.getShareId()) + .set(product.productStatus,"I") + .where(product.id.eq(approveShareProductRequest.getProductId())) + .execute(); + } + + @Override + public Long completeShare(CompleteShareRequest completeShareRequest) { + return queryFactory + .update(product) + .set(product.productStatus,"C") + .where(product.id.eq(completeShareRequest.getProductId())) + .execute(); + } + + @Override + public Long rejectShare(RejectShareRequest rejectShareRequest) { + return queryFactory + .update(product) + .set(product.productStatus,"N") + .set(product.shareId, 0L) + .where(product.id.eq(rejectShareRequest.getProductId())) + .execute(); + } + + @Override + public Long updateProductDetail(ProductCreateRequestDto productCreateRequestDto) { + return queryFactory + .update(product) + .set(product.productName , productCreateRequestDto.getProductName()) + .set(product.productContent, productCreateRequestDto.getProductContent()) + .set(product.productCategory, productCreateRequestDto.getProductCategory()) + .where(product.id.eq(productCreateRequestDto.getProductId())) + .execute(); + } + + + private BooleanExpression productCategoryEq(String categoryCode) { + return hasText(categoryCode) ? product.productCategory.eq(categoryCode) : null; + } + + private BooleanExpression productNameEq(String productName) { + return hasText(productName) ? product.productName.eq(productName) : null; + } + + private BooleanExpression productStatusEq(String productStatus) { + return hasText(productStatus) ? product.productStatus.eq(productStatus) : null; + } + + private BooleanExpression productMemberIdEq(Long id) { + return id == null ? product.user.id.isNull() : product.user.id.eq(id); + } +} diff --git a/src/main/java/bebeShare/domain/user/User.java b/src/main/java/bebeShare/domain/user/User.java index 058b780..77d2acc 100644 --- a/src/main/java/bebeShare/domain/user/User.java +++ b/src/main/java/bebeShare/domain/user/User.java @@ -1,5 +1,6 @@ package bebeShare.domain.user; +import antlr.build.ANTLR; import bebeShare.BaseEntity; import bebeShare.domain.product.Product; import lombok.Builder; @@ -38,6 +39,7 @@ public class User extends BaseEntity { private Role role; @OneToMany(mappedBy = "user") + @ToString.Exclude private List products = new ArrayList<>(); @@ -45,6 +47,10 @@ public class User extends BaseEntity { private Integer giveCnt; private Integer shareChanceCnt; + public void setProducts(List products) { + this.products = products; + } + @Builder public User(String name, String email, String picture, Role role) { diff --git a/src/main/java/bebeShare/domain/user/UserRepositoryCustom.java b/src/main/java/bebeShare/domain/user/UserRepositoryCustom.java index ed20d29..9f65834 100644 --- a/src/main/java/bebeShare/domain/user/UserRepositoryCustom.java +++ b/src/main/java/bebeShare/domain/user/UserRepositoryCustom.java @@ -1,18 +1,28 @@ package bebeShare.domain.user; -import bebeShare.web.dto.userDto.*; + +import bebeShare.web.dto.userDto.dto.GiveInfoResponseDto; +import bebeShare.web.dto.userDto.dto.LikeInfoResponseDto; +import bebeShare.web.dto.userDto.dto.MemberCommentResponseDto; +import bebeShare.web.dto.userDto.dto.ShareInfoResponseDto; +import bebeShare.web.dto.userDto.req.CommentRequest; +import bebeShare.web.dto.userDto.req.GiveRequest; +import bebeShare.web.dto.userDto.req.LikeRequest; +import bebeShare.web.dto.userDto.req.ShareRequest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.List; public interface UserRepositoryCustom { - List shareInfo(UserRequest userRequest); + Page shareInfo(ShareRequest shareRequest, Pageable pageable); - List giveInfo(UserRequest conduserRequestition); + Page giveInfo(GiveRequest giveRequest, Pageable pageable); - List likeInfo(UserRequest userRequest ); + Page likeInfo(LikeRequest likeRequest, Pageable pageable); - List comments(UserRequest condition ); + Page comments(CommentRequest commentRequest, Pageable pageable); } diff --git a/src/main/java/bebeShare/domain/user/UserRepositoryImpl.java b/src/main/java/bebeShare/domain/user/UserRepositoryImpl.java index afeb922..996d3de 100644 --- a/src/main/java/bebeShare/domain/user/UserRepositoryImpl.java +++ b/src/main/java/bebeShare/domain/user/UserRepositoryImpl.java @@ -1,8 +1,17 @@ package bebeShare.domain.user; -import bebeShare.web.dto.userDto.*; +import bebeShare.domain.product.Product; +import bebeShare.web.dto.userDto.dto.*; +import bebeShare.web.dto.userDto.req.CommentRequest; +import bebeShare.web.dto.userDto.req.GiveRequest; +import bebeShare.web.dto.userDto.req.LikeRequest; +import bebeShare.web.dto.userDto.req.ShareRequest; import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.support.PageableExecutionUtils; import javax.persistence.EntityManager; import java.util.List; @@ -11,6 +20,7 @@ import static bebeShare.domain.like.QDibs.dibs; import static bebeShare.domain.product.QProduct.product; import static bebeShare.domain.user.QUser.user; +import static org.springframework.util.StringUtils.hasText; public class UserRepositoryImpl implements UserRepositoryCustom { @@ -23,10 +33,10 @@ public UserRepositoryImpl(EntityManager em) { @Override - public List shareInfo(UserRequest userRequest) { + public Page shareInfo(ShareRequest shareRequest, Pageable pageable) { - return queryFactory //join 에서 양쪽 테이블 프로젝션을 가져오기때문에 MemberTeamDto를 따로빼서 원하는 값을 가져오게함, 셀렉트방식은 생성자로 + List result = queryFactory .select(new QShareInfoResponseDto( product.id, product.productName, @@ -35,19 +45,30 @@ public List shareInfo(UserRequest userRequest) { )) .from(product) .where( - productMemberIdEq(userRequest.getMemberId()), - productStatus(userRequest.getProductStatus()) + productMemberIdEq(shareRequest.getMemberId()), + productStatus(shareRequest.getProductStatus()) ) - .offset(userRequest.getPage()) - .limit(userRequest.getSize()) + .offset(pageable.getPageNumber()) + .limit(pageable.getPageSize()) .orderBy(product.createdDate.desc()) .fetch(); + + + JPAQuery countQuery = queryFactory.select(product) + .from(product) + .where( + productMemberIdEq(shareRequest.getMemberId()), + productStatus(shareRequest.getProductStatus()) + ); + + return PageableExecutionUtils.getPage(result, pageable, () -> countQuery.fetchCount()); + } @Override - public List giveInfo(UserRequest userRequest) { - return queryFactory + public Page giveInfo(GiveRequest giveRequest, Pageable pageable) { + List result = queryFactory .select(new QGiveInfoResponseDto( product.id, product.productName, @@ -57,59 +78,99 @@ public List giveInfo(UserRequest userRequest) { )) .from(product) .where( - productMemberIdEq(userRequest.getMemberId()), - productStatus(userRequest.getProductStatus()) + productShareIdEq(giveRequest.getShareId()), + productStatus(giveRequest.getProductStatus()) ) - .offset(userRequest.getPage()) - .limit(userRequest.getSize()) + .offset(pageable.getPageNumber()) + .limit(pageable.getPageSize()) .orderBy(product.createdDate.desc()) .fetch(); + + JPAQuery countQuery = queryFactory.select(product) + .from(product) + .where( + productShareIdEq(giveRequest.getShareId()), + productStatus(giveRequest.getProductStatus()) + ); + return PageableExecutionUtils.getPage(result, pageable, () -> countQuery.fetchCount()); + } @Override - public List likeInfo(UserRequest userRequest) { + public Page likeInfo(LikeRequest likeRequest, Pageable pageable) { - return queryFactory + List result = queryFactory .select(new QLikeInfoResponseDto( product.id, product.productName, product.productImage1, product.createdDate.as("insertDt") )).from(dibs) - .join(dibs.product , product) - .join(dibs.user , user) + .join(dibs.product, product) + .join(dibs.user, user) .where( - memberIdEq(userRequest.getMemberId()) + likeIdEq(likeRequest.getMemberId()) ) - .offset(userRequest.getPage()) - .limit(userRequest.getSize()) + .offset(pageable.getPageNumber()) + .limit(pageable.getPageSize()) .fetch(); + + JPAQuery countQuery = queryFactory.select(product) + .from(dibs) + .join(dibs.product, product) + .join(dibs.user, user) + .where( + likeIdEq(likeRequest.getMemberId()) + ); + return PageableExecutionUtils.getPage(result, pageable, () -> countQuery.fetchCount()); + } @Override - public List comments(UserRequest userRequest) { - return queryFactory + public Page comments(CommentRequest commentRequest, Pageable pageable) { + List result = queryFactory .select( new QMemberCommentResponseDto( comment.id.as("commentId"), product.productName, comment.commentContent, + //product.productImage1, comment.createdDate.as("insertDt") ) ).from(comment) .join(comment.product, product) .join(comment.user, user) .where( - memberIdEq(userRequest.getMemberId()) + commentMeberIdEq(commentRequest.getMemberId()) ) - .offset(userRequest.getPage()) - .limit(userRequest.getSize()) + .offset(pageable.getPageNumber()) + .limit(pageable.getPageSize()) .fetch(); + + JPAQuery countQuery = queryFactory.select(product) + .from(comment) + .join(comment.product, product) + .join(comment.user, user) + .where( + commentMeberIdEq(commentRequest.getMemberId()) + ); + return PageableExecutionUtils.getPage(result, pageable, () -> countQuery.fetchCount()); } + private BooleanExpression commentMeberIdEq(Long memberId) { + return memberId == 0 ? comment.user.id.isNull() : comment.user.id.eq(memberId); + } private BooleanExpression productMemberIdEq(long memberId) { - return product.user.id.eq(memberId); + return memberId == 0 ? product.user.id.isNull() : product.user.id.eq(memberId); + } + + private BooleanExpression productShareIdEq(long shareId) { + return shareId == 0 ? product.shareId.isNull() : product.shareId.eq(shareId); + } + + private BooleanExpression likeIdEq(long likeId) { + return likeId == 0 ? dibs.user.id.isNull() : dibs.user.id.eq(likeId); } private BooleanExpression memberIdEq(long memberId) { @@ -117,8 +178,6 @@ private BooleanExpression memberIdEq(long memberId) { } private BooleanExpression productStatus(String productStatus) { - return productStatus != null ? product.productStatus.eq(productStatus) : null; + return hasText(productStatus) ? product.productStatus.eq(productStatus) : null; } - - } diff --git a/src/main/java/bebeShare/exception/ErrorCode.java b/src/main/java/bebeShare/exception/ErrorCode.java index ab839d6..02015f5 100644 --- a/src/main/java/bebeShare/exception/ErrorCode.java +++ b/src/main/java/bebeShare/exception/ErrorCode.java @@ -32,6 +32,8 @@ public enum ErrorCode { POSTS_NOT_FOUND(HttpStatus.NOT_FOUND, "게시글 정보를 찾을 수 없습니다."), USER_NOT_FOUND(HttpStatus.NOT_FOUND, "사용자 정보를 찾을 수 없습니다."), COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "댓글 정보를 찾을 수 없습니다."), + + IMAGE_UPLOAD_FAILED(HttpStatus.NOT_FOUND, "이미지 업로드를 실패하였습니다."), ; private final HttpStatus status; diff --git a/src/main/java/bebeShare/service/CategoryService.java b/src/main/java/bebeShare/service/CategoryService.java index b9e8680..4305019 100644 --- a/src/main/java/bebeShare/service/CategoryService.java +++ b/src/main/java/bebeShare/service/CategoryService.java @@ -1,11 +1,13 @@ package bebeShare.service; import bebeShare.domain.code.CodeRepository; +import bebeShare.web.dto.category.CategoryReqeustDto; import bebeShare.web.dto.codeDto.CodeResponseDto; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; +import java.util.stream.Collectors; @Service @AllArgsConstructor @@ -13,7 +15,14 @@ public class CategoryService { private final CodeRepository codeRepository; public List lookup(String code){ - System.out.println("CategoryService.lookup"); return codeRepository.lookup(code); } + + + public List findAll(){ + return codeRepository.findAll() + .stream() + .map(CodeResponseDto::new) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/bebeShare/service/CommentsService.java b/src/main/java/bebeShare/service/CommentsService.java index 29f0aa4..6ee42f8 100644 --- a/src/main/java/bebeShare/service/CommentsService.java +++ b/src/main/java/bebeShare/service/CommentsService.java @@ -10,6 +10,8 @@ import bebeShare.exception.ErrorCode; import bebeShare.web.dto.commentDto.*; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -46,21 +48,31 @@ public List findAll() { } @Transactional - public CommentUpdateResponseDto update(Long productId, Long commentId, CommentUpdateRequestsDto updateRequestsDto) { - Comment entity = commentRepository.findById(commentId).orElseThrow( + public CommentUpdateResponseDto update(CommentUpdateRequestsDto updateRequestsDto) { + Comment entity = commentRepository.findById(updateRequestsDto.getCommentId()).orElseThrow( () -> new CustomException(ErrorCode.INTERNAL_SERVER_ERROR) ); - entity.update(commentId, updateRequestsDto); - return new CommentUpdateResponseDto(productId); + entity.update(updateRequestsDto); + return new CommentUpdateResponseDto(updateRequestsDto.getCommentId()); } @Transactional - public CommentDeleteResponseDto delete(Long productId, Long commentId, CommentDeleteRequestDto params) { - Comment entity = commentRepository.findById(commentId).orElseThrow(() + public CommentDeleteResponseDto delete(CommentDeleteRequestDto params) { + Comment entity = commentRepository.findById(params.getCommentId()).orElseThrow(() -> new CustomException(ErrorCode.COMMENT_NOT_FOUND)); - entity.delete(params); - return new CommentDeleteResponseDto(productId); + entity.delete(); + return new CommentDeleteResponseDto(params.getCommentId()); } + public Page findByProductId(CommentsRequest commentsRequest, Pageable pageable) { + return commentRepository.findByProductId(commentsRequest, pageable); + } + @Transactional + public Long updateByCommentId(CommentUpdateRequestsDto updateRequestsDto) { + Comment entity = commentRepository.findById(updateRequestsDto.getCommentId()).orElseThrow( + () -> new CustomException(ErrorCode.INTERNAL_SERVER_ERROR) + ); + return commentRepository.updateByCommentId(updateRequestsDto); + } } diff --git a/src/main/java/bebeShare/service/ImageService.java b/src/main/java/bebeShare/service/ImageService.java new file mode 100644 index 0000000..1363081 --- /dev/null +++ b/src/main/java/bebeShare/service/ImageService.java @@ -0,0 +1,46 @@ +package bebeShare.service; + +import bebeShare.domain.user.User; +import bebeShare.exception.CustomException; +import bebeShare.exception.ErrorCode; +import com.google.cloud.storage.Bucket; +import com.google.firebase.cloud.StorageClient; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +import static bebeShare.domain.product.QProduct.product; +import static java.util.Objects.hash; + +@Slf4j +@Service +public class ImageService { + @Autowired + private Bucket bucket; + + public String createImage(byte[] image, User user){ + //Image 저장 위치를 선언 + String blob = "products/images/"+user.getId()+"/"+hash(image); + log.info("blob ={}",blob); + log.info("bucket ={}",bucket); + try{ + // 이미 존재하면 파일 삭제 + if(bucket.get(blob) != null){ + bucket.get(blob).delete(); + } + // 파일을 Bucket에 저장 + bucket.create(blob,image); + // 상품 Image 위치 리턴 + return blob; + }catch(Exception e){ + throw new CustomException(ErrorCode.IMAGE_UPLOAD_FAILED); + } + } + + public byte[] getImage(String userid,String filename){ + String bucketPath = "products/images/"+userid+"/"+filename; + return bucket.get(bucketPath).getContent(); + } +} diff --git a/src/main/java/bebeShare/service/LikeService.java b/src/main/java/bebeShare/service/LikeService.java index 5b409d2..258242c 100644 --- a/src/main/java/bebeShare/service/LikeService.java +++ b/src/main/java/bebeShare/service/LikeService.java @@ -5,9 +5,11 @@ import bebeShare.domain.product.Product; import bebeShare.domain.product.ProductRepository; import bebeShare.domain.user.User; +import bebeShare.domain.user.UserRepository; import bebeShare.exception.CustomException; import bebeShare.exception.ErrorCode; import bebeShare.web.dto.ProductLikeDto; +import bebeShare.web.dto.likeDto.SaveLikeDto; import com.sun.el.parser.AstFalse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -21,19 +23,26 @@ public class LikeService { private final DibsRepository dibsRepository; private final ProductRepository productRepository; + private final UserRepository userRepository; // 상품 게시글 좋아요 생성 @Transactional - public boolean addLike(Long productId) { - Product product = productRepository.findById(productId).orElseThrow(() - -> new CustomException(ErrorCode.POSTS_NOT_FOUND)); - return true; + public void addLike(SaveLikeDto saveLikeDto) { + System.out.println("saveLikeDto.getProductId(): " + saveLikeDto.getProductId()); + Product product = productRepository.findById(saveLikeDto.getProductId()).orElseThrow(() + -> new IllegalArgumentException("해당 상품이 없습니다. Id=" + saveLikeDto.getProductId())); + + User user = userRepository.findById(saveLikeDto.getUserId()).orElseThrow(() + -> new IllegalArgumentException("해당 사용자가 없습니다. Id=" + saveLikeDto.getUserId())); + + Dibs saveDib = dibsRepository.save(saveLikeDto.toEntity(product, user)); + } // 상품 게시글 좋아요 해제 @Transactional - public void delete(Long productId) { - productRepository.deleteById(productId); + public void delete(Long likeId) { + dibsRepository.deleteById(likeId); } } diff --git a/src/main/java/bebeShare/service/ProductService.java b/src/main/java/bebeShare/service/ProductService.java index c0eb289..fbead61 100644 --- a/src/main/java/bebeShare/service/ProductService.java +++ b/src/main/java/bebeShare/service/ProductService.java @@ -4,10 +4,11 @@ import bebeShare.domain.product.ProductRepository; import bebeShare.exception.CustomException; import bebeShare.exception.ErrorCode; -import bebeShare.web.dto.productDto.ProductCreateRequestDto; -import bebeShare.web.dto.productDto.ProductDeleteDto; -import bebeShare.web.dto.productDto.ProductResponseDto; +import bebeShare.web.dto.productDto.ApproveShareProductRequest; +import bebeShare.web.dto.productDto.*; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,19 +26,30 @@ public class ProductService { //상품 게시글 생성 @Transactional public Long save(final ProductCreateRequestDto params) { - Product entity = productRepository.save(params.toEntity()); return entity.getId(); } // 게시글 목록 조회 public List findAll() { - Sort sort = Sort.by(Sort.Direction.DESC, "id", "createdDate"); List list = productRepository.findAll(sort); return list.stream().map(ProductResponseDto::new).collect(Collectors.toList()); } + // 상품 게시글 목록 조회 + public Page findAllProducts(ProductRequest productRequest, Pageable pageable) { + try { + Page products = productRepository.findAllProducts(productRequest,pageable); + return products; + }catch (Exception e){ + e.printStackTrace(); + System.out.println(e.getMessage()); + return null; + } + } + + // 상품 게시글 상세 조회 public ProductResponseDto findById(Long productId) { Product entity = productRepository.findById(productId).orElseThrow(() @@ -47,13 +59,18 @@ public ProductResponseDto findById(Long productId) { // 상품 게시글 수정 @Transactional - public Long update(final ProductCreateRequestDto params) { + public Long update( ProductCreateRequestDto productCreateRequestDto) { - Product entity = productRepository.findById(params.getProductId()).orElseThrow(() + productRepository.findById(productCreateRequestDto.getProductId()).orElseThrow(() -> new CustomException(ErrorCode.POSTS_NOT_FOUND)); - entity.update(params); - return params.getProductId(); + try { + return productRepository.updateProductDetail(productCreateRequestDto); + }catch (Exception e){ + e.printStackTrace(); + System.out.println(e.getMessage()); + return 0L; + } } @@ -64,4 +81,39 @@ public void delete(ProductDeleteDto params) { -> new CustomException(ErrorCode.POSTS_NOT_FOUND)); entity.delete(params); } + + // 상품 게시글 목록 조회 + @Transactional + public Long approveShare(ApproveShareProductRequest approveShareProductRequest) { + try { + return productRepository.approveShare(approveShareProductRequest); + }catch (Exception e){ + e.printStackTrace(); + System.out.println(e.getMessage()); + return 0L; + } + } + + // 상품 게시글 목록 조회 + @Transactional + public Long completeShare(CompleteShareRequest completeShareRequest) { + try { + return productRepository.completeShare(completeShareRequest); + }catch (Exception e){ + e.printStackTrace(); + System.out.println(e.getMessage()); + return 0L; + } + } + + @Transactional + public Long rejectShare(RejectShareRequest rejectShareRequest) { + try { + return productRepository.rejectShare(rejectShareRequest); + }catch (Exception e){ + e.printStackTrace(); + System.out.println(e.getMessage()); + return 0L; + } + } } diff --git a/src/main/java/bebeShare/service/UserService.java b/src/main/java/bebeShare/service/UserService.java index 54b3ec3..a0bd0f5 100644 --- a/src/main/java/bebeShare/service/UserService.java +++ b/src/main/java/bebeShare/service/UserService.java @@ -3,12 +3,17 @@ import bebeShare.domain.user.User; import bebeShare.domain.user.UserRepository; import bebeShare.web.dto.userDto.*; +import bebeShare.web.dto.userDto.dto.*; +import bebeShare.web.dto.userDto.req.CommentRequest; +import bebeShare.web.dto.userDto.req.GiveRequest; +import bebeShare.web.dto.userDto.req.LikeRequest; +import bebeShare.web.dto.userDto.req.ShareRequest; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - @Transactional(readOnly = true) @RequiredArgsConstructor @Service @@ -22,19 +27,43 @@ public UserResponseDto findById(Long id) { return new UserResponseDto(entity); } - public List shareInfo(UserRequest userRequest) { - return userRepository.shareInfo(userRequest); + public Page shareInfo(ShareRequest shareRequest, Pageable pageable) { + try { + return userRepository.shareInfo(shareRequest, pageable); + } catch (Exception e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + return null; + } } - public List giveInfo(UserRequest userRequest) { - return userRepository.giveInfo(userRequest); + public Page giveInfo(GiveRequest giveRequest, Pageable pageable) { + try { + return userRepository.giveInfo(giveRequest, pageable); + } catch (Exception e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + return null; + } } - public List likeInfo(UserRequest userRequest) { - return userRepository.likeInfo(userRequest); + public Page likeInfo(LikeRequest likeRequest, Pageable pageable) { + try { + return userRepository.likeInfo(likeRequest, pageable); + } catch (Exception e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + return null; + } } - public List comments(UserRequest userRequest) { - return userRepository.comments(userRequest); + public Page comments(CommentRequest commentRequest, Pageable pageable) { + try { + return userRepository.comments(commentRequest, pageable); + } catch (Exception e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + return null; + } } } diff --git a/src/main/java/bebeShare/web/CategoryApiController.java b/src/main/java/bebeShare/web/CategoryApiController.java index 4b3866d..9d8c310 100644 --- a/src/main/java/bebeShare/web/CategoryApiController.java +++ b/src/main/java/bebeShare/web/CategoryApiController.java @@ -3,13 +3,18 @@ import bebeShare.service.CategoryService; import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import bebeShare.web.dto.category.CategoryReqeustDto; +import bebeShare.web.dto.codeDto.CodeResponseDto; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +@Slf4j @RestController -@AllArgsConstructor +@RequestMapping("/api/v1") +@RequiredArgsConstructor public class CategoryApiController { private final CategoryService categoryService; @@ -18,4 +23,15 @@ public class CategoryApiController { public void lookupCategory(@RequestParam String code){ categoryService.lookup(code); } + + + @PostMapping("/categories") + public List findAllCategories(){ + + List byCode = categoryService.findAll(); + + log.debug("@@@@@ :" + byCode.toString()); + return byCode; + + } } \ No newline at end of file diff --git a/src/main/java/bebeShare/web/CommentApiController.java b/src/main/java/bebeShare/web/CommentApiController.java index 789d84d..68b5e7c 100644 --- a/src/main/java/bebeShare/web/CommentApiController.java +++ b/src/main/java/bebeShare/web/CommentApiController.java @@ -4,44 +4,51 @@ import bebeShare.config.auth.dto.SessionUser; import bebeShare.service.CommentsService; import bebeShare.web.dto.commentDto.*; +import bebeShare.web.dto.userDto.req.CommentRequest; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.*; import java.util.List; @RequiredArgsConstructor @RestController -@RequestMapping("/api/v1/products") +@RequestMapping("/api/v1/comments") public class CommentApiController { private final CommentsService commentsService; // 상품 댓글 등록 - @PostMapping("/{productId}/comments") - public CommentResponseDto save(@PathVariable Long productId, @RequestBody CommentSaveRequestsDto requestsDto, - @LoginUser SessionUser sessionUser) { - requestsDto.setProductId(productId); - requestsDto.setMemberId(sessionUser.getId()); + @PostMapping("/{productId}") + public CommentResponseDto save( @RequestBody CommentSaveRequestsDto requestsDto) { return commentsService.save(requestsDto); } //상품 댓글 조회 - @GetMapping("/products") - public List findAll(){ - return commentsService.findAll(); + @PostMapping("") + public Page findByProductId(@RequestBody CommentsRequest commentsRequest){ + Pageable pageable = PageRequest.of(commentsRequest.getPage(), commentsRequest.getSize()); + return commentsService.findByProductId(commentsRequest, pageable); } // 상품 댓글 수정 - @PatchMapping("/{productId}/comments/{commentId}") - public CommentUpdateResponseDto update(@PathVariable Long productId, @PathVariable Long commentId, @RequestBody CommentUpdateRequestsDto updateRequestsDto) { - return commentsService.update(productId, commentId, updateRequestsDto); + @PatchMapping("") + public CommentUpdateResponseDto update(@RequestBody CommentUpdateRequestsDto updateRequestsDto) { + + Long updateCnt = commentsService.updateByCommentId(updateRequestsDto); + + if(updateCnt != 0){ + return new CommentUpdateResponseDto(updateRequestsDto.getCommentId()); + } + + return new CommentUpdateResponseDto(); } // 상품 댓글 삭제 - @DeleteMapping("/{productId}/comments/{commentId}") - public CommentDeleteResponseDto delete(@PathVariable Long productId, @PathVariable Long commentId, - @RequestBody CommentDeleteRequestDto params) { - - return commentsService.delete(productId, commentId,params); + @DeleteMapping("") + public CommentDeleteResponseDto delete(@RequestBody CommentDeleteRequestDto params) { + return commentsService.delete(params); } } diff --git a/src/main/java/bebeShare/web/ImageController.java b/src/main/java/bebeShare/web/ImageController.java new file mode 100644 index 0000000..68f9f9b --- /dev/null +++ b/src/main/java/bebeShare/web/ImageController.java @@ -0,0 +1,35 @@ +package bebeShare.web; + +import bebeShare.domain.user.User; +import bebeShare.service.ImageService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpSession; +import java.io.IOException; + +@Controller +@Slf4j +public class ImageController { + @Autowired + private ImageService imageService; + + @PostMapping("/upload") + public @ResponseBody String imageUpload(@RequestParam("image") MultipartFile image, HttpSession session) throws IOException { + log.info("image={}",image); + log.info("imageService={}",imageService); + if(image.isEmpty()) return null; + return imageService.createImage(image.getBytes(), (User)session.getAttribute("user")); + } + + + @ResponseBody + @GetMapping(value="/products/images/{userId}/{fileName}",produces = MediaType.IMAGE_JPEG_VALUE) + public byte[] imageDownload(@PathVariable("userId") String userid, @PathVariable("fileName") String filename) { + return imageService.getImage(userid,filename); + } +} diff --git a/src/main/java/bebeShare/web/IndexController.java b/src/main/java/bebeShare/web/IndexController.java index 29b26ca..c8afe0b 100644 --- a/src/main/java/bebeShare/web/IndexController.java +++ b/src/main/java/bebeShare/web/IndexController.java @@ -3,9 +3,10 @@ import bebeShare.config.auth.LoginUser; import bebeShare.config.auth.dto.SessionUser; import bebeShare.service.PostsService; +import bebeShare.service.ProductService; +import bebeShare.service.UserService; import bebeShare.web.dto.PostsResponseDto; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @@ -18,18 +19,12 @@ public class IndexController { private final PostsService postsService; - private final HttpSession httpSession; + private final UserService userService; + private final ProductService productService; @GetMapping("/") - public String index(Model model , @LoginUser SessionUser user) { - - model.addAttribute("posts", postsService.findAllDesc()); - - if (user != null) { - model.addAttribute("userName", user.getName()); - } - - return "index"; + public String index(Model model) { + return "views/main"; } @@ -52,4 +47,29 @@ public Long delete(@PathVariable Long id) { postsService.delete(id); return id; } + + @GetMapping("/product/detail/{id}") + public String detailProduct(Model model ,@PathVariable Long id) { + model.addAttribute("product", productService.findById(id)); + return "product/detail"; + } + + + @GetMapping("/product/register") + public String registerProduct(Model model , @LoginUser SessionUser user) { + if (user != null) { + model.addAttribute("user", user); + } + return "product/register"; + } + + @GetMapping("/user/mypage") + public String mypage(Model model , @LoginUser SessionUser user) { + if (user != null) { + + model.addAttribute("userName", user.getName()); + } + model.addAttribute("user", userService.findById(user.getId())); + return "user/mypage"; + } } diff --git a/src/main/java/bebeShare/web/LikeApiController.java b/src/main/java/bebeShare/web/LikeApiController.java index 58d084c..003a996 100644 --- a/src/main/java/bebeShare/web/LikeApiController.java +++ b/src/main/java/bebeShare/web/LikeApiController.java @@ -1,9 +1,12 @@ package bebeShare.web; +import bebeShare.config.auth.LoginUser; +import bebeShare.config.auth.dto.SessionUser; +import bebeShare.domain.like.Dibs; import bebeShare.domain.user.User; import bebeShare.service.LikeService; +import bebeShare.web.dto.likeDto.SaveLikeDto; import bebeShare.web.dto.productDto.ProductCreateRequestDto; -import bebeShare.web.dto.likeDto.ProductLikeDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -11,19 +14,25 @@ @Slf4j @RequiredArgsConstructor @RestController +@RequestMapping("/api/v1/like") public class LikeApiController { private final LikeService likeService; // 상품 게시글 좋아요 생성 - @PostMapping("/products/{productId}/like") - public boolean save(@PathVariable Long productId) { - return likeService.addLike(productId); + @PostMapping("/{productId}") + public Long save(@PathVariable Long productId, @LoginUser SessionUser user) { + SaveLikeDto saveLikeDto = new SaveLikeDto(); + saveLikeDto.setProductId(productId); + saveLikeDto.setUserId(user.getId()); + likeService.addLike(saveLikeDto); + return saveLikeDto.getUserId(); } // 상품 게시글 좋아요 해제 - @DeleteMapping("/products/{productId}/like") - public void delete(@PathVariable Long productId){ - likeService.delete(productId); + @DeleteMapping("/{likeId}") + public Long delete(@PathVariable Long likeId){ + likeService.delete(likeId); + return likeId; } } diff --git a/src/main/java/bebeShare/web/MemberApiController.java b/src/main/java/bebeShare/web/MemberApiController.java index 1e293c5..71c311b 100644 --- a/src/main/java/bebeShare/web/MemberApiController.java +++ b/src/main/java/bebeShare/web/MemberApiController.java @@ -1,14 +1,22 @@ package bebeShare.web; +import bebeShare.config.auth.LoginUser; +import bebeShare.config.auth.dto.SessionUser; +import bebeShare.service.ProductService; import bebeShare.service.UserService; import bebeShare.web.dto.userDto.*; +import bebeShare.web.dto.userDto.dto.*; +import bebeShare.web.dto.userDto.req.CommentRequest; +import bebeShare.web.dto.userDto.req.GiveRequest; +import bebeShare.web.dto.userDto.req.LikeRequest; +import bebeShare.web.dto.userDto.req.ShareRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.*; -import java.util.List; - @RequiredArgsConstructor @Slf4j @@ -17,6 +25,7 @@ public class MemberApiController { private final UserService userService; + private final ProductService productService; @GetMapping("/{id}") @@ -24,28 +33,34 @@ public UserResponseDto findById(@PathVariable Long id) { return userService.findById(id); } - @GetMapping("/shareInfo") - public List shareInfo(@RequestBody UserRequest userRequest) { - return userService.shareInfo(userRequest); + @PostMapping("/shareInfo") + public Page shareInfo(@RequestBody ShareRequest shareRequest, @LoginUser SessionUser user) { + Pageable pageable = PageRequest.of(shareRequest.getPage(), shareRequest.getSize()); + shareRequest.setMemberId(user.getId()); + return userService.shareInfo(shareRequest, pageable); } - @GetMapping("/giveInfo") - public List giveInfo(@RequestBody UserRequest userRequest) { - return userService.giveInfo(userRequest); + @PostMapping("/giveInfo") + public Page giveInfo(@RequestBody GiveRequest giveRequest, @LoginUser SessionUser user) { + Pageable pageable = PageRequest.of(giveRequest.getPage(), giveRequest.getSize()); + giveRequest.setShareId(user.getId()); + return userService.giveInfo(giveRequest, pageable); } - - @GetMapping("/likeInfo") - public List likeInfo(@RequestBody UserRequest userRequest) { - PageRequest pageRequest = PageRequest.of(userRequest.getPage(), userRequest.getSize()); - return userService.likeInfo(userRequest); + @PostMapping("/likeInfo") + public Page likeInfo(@RequestBody LikeRequest likeRequest, @LoginUser SessionUser user) { + Pageable pageable = PageRequest.of(likeRequest.getPage(), likeRequest.getSize()); + likeRequest.setMemberId(user.getId()); + return userService.likeInfo(likeRequest, pageable); } - @GetMapping("/comments") - public List comments(@RequestBody UserRequest userRequest) { - PageRequest pageRequest = PageRequest.of(userRequest.getPage(), userRequest.getSize()); - return userService.comments(userRequest); - } + @PostMapping("/comments") + public Page comments(@RequestBody CommentRequest commentRequest, @LoginUser SessionUser user) { + Pageable pageable = PageRequest.of(commentRequest.getPage(), commentRequest.getSize()); + commentRequest.setMemberId(user.getId()); + return userService.comments(commentRequest, pageable); -} + + } +} \ No newline at end of file diff --git a/src/main/java/bebeShare/web/ProductApiController.java b/src/main/java/bebeShare/web/ProductApiController.java index 8b27a2a..70dcf26 100644 --- a/src/main/java/bebeShare/web/ProductApiController.java +++ b/src/main/java/bebeShare/web/ProductApiController.java @@ -1,38 +1,42 @@ package bebeShare.web; -import bebeShare.exception.CustomException; -import bebeShare.exception.ErrorCode; +import bebeShare.domain.like.DibsRepository; import bebeShare.service.ProductService; -import bebeShare.web.dto.productDto.ProductCreateRequestDto; -import bebeShare.web.dto.productDto.ProductDeleteDto; -import bebeShare.web.dto.productDto.ProductResponseDto; +import bebeShare.web.dto.productDto.*; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.*; -import java.util.List; - +@Slf4j @RestController @RequestMapping("/api/v1") @RequiredArgsConstructor public class ProductApiController { private final ProductService productService; + private final DibsRepository repository; + // 상품 게시글 등록 - @PostMapping("/products") + @PostMapping("/product") public Long save(@RequestBody final ProductCreateRequestDto params) { return productService.save(params); } - // 상품 게시글 조회 - @GetMapping("/products") - public List findAll() { - return productService.findAll(); + // 상품 게시글 목록 조회 + @PostMapping(value = "/products") + public Page findAllProducts(@RequestBody ProductRequest productRequest) { + Pageable pageable = PageRequest.of(productRequest.getPage(), productRequest.getSize()); + return productService.findAllProducts(productRequest, pageable); } // 상품 게시글 상세 조회 - @ResponseBody @GetMapping("/products/{productId}") public ProductResponseDto findById(@PathVariable Long productId) { return productService.findById(productId); @@ -40,19 +44,53 @@ public ProductResponseDto findById(@PathVariable Long productId) { // 상품 게시글 수정 @PatchMapping("/products") - public Long update( @RequestBody final ProductCreateRequestDto params) { - return productService.update(params); - } + public ProductUpdateRespone update(@RequestBody ProductCreateRequestDto params) { + Long updateCnt = productService.update(params); - // 예외 발생 - @GetMapping("/test") - public String test() { - throw new CustomException(ErrorCode.POSTS_NOT_FOUND); + if (updateCnt == 0) { + return new ProductUpdateRespone(); + } + return new ProductUpdateRespone(params.getProductId()); } // 상품 게시글 삭제 @DeleteMapping("/products") - public void delete(@RequestBody ProductDeleteDto params){ + public Long delete(@RequestBody ProductDeleteDto params) { productService.delete(params); + + return params.getProductId(); + } + + // 상품 게시글 상태변경 + @PatchMapping("/products/approveShare") + public ApproveShareProductResponse approveShare(@RequestBody ApproveShareProductRequest params) { + Long updateCnt = productService.approveShare(params); + + if (updateCnt == 0) { + return new ApproveShareProductResponse(); + } + return new ApproveShareProductResponse(params.getProductId()); } + + // 나눔 완료 + @PatchMapping("/products/completeShare") + public ApproveShareProductResponse completeShare(@RequestBody CompleteShareRequest params) { + Long updateCnt = productService.completeShare(params); + + if (updateCnt == 0) { + return new ApproveShareProductResponse(); + } + return new ApproveShareProductResponse(params.getProductId()); + } + // 나눔 거절 + @PatchMapping("/products/rejectShare") + public ApproveShareProductResponse rejectShare(@RequestBody RejectShareRequest params) { + Long updateCnt = productService.rejectShare(params); + + if (updateCnt == 0) { + return new ApproveShareProductResponse(); + } + return new ApproveShareProductResponse(params.getProductId()); + } + } diff --git a/src/main/java/bebeShare/web/dto/category/CategoryReqeustDto.java b/src/main/java/bebeShare/web/dto/category/CategoryReqeustDto.java new file mode 100644 index 0000000..4e073f0 --- /dev/null +++ b/src/main/java/bebeShare/web/dto/category/CategoryReqeustDto.java @@ -0,0 +1,12 @@ +package bebeShare.web.dto.category; + + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class CategoryReqeustDto { + + private String code; +} diff --git a/src/main/java/bebeShare/web/dto/codeDto/CodeResponseDto.java b/src/main/java/bebeShare/web/dto/codeDto/CodeResponseDto.java index 231c45f..57c3eb5 100644 --- a/src/main/java/bebeShare/web/dto/codeDto/CodeResponseDto.java +++ b/src/main/java/bebeShare/web/dto/codeDto/CodeResponseDto.java @@ -1,13 +1,11 @@ package bebeShare.web.dto.codeDto; import bebeShare.domain.code.Code; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; -import lombok.Setter; +import lombok.*; import java.time.LocalDateTime; +@ToString @Getter public class CodeResponseDto { private Long codeId; diff --git a/src/main/java/bebeShare/web/dto/commentDto/CommentDeleteResponseDto.java b/src/main/java/bebeShare/web/dto/commentDto/CommentDeleteResponseDto.java index a2cbcf9..5a4967b 100644 --- a/src/main/java/bebeShare/web/dto/commentDto/CommentDeleteResponseDto.java +++ b/src/main/java/bebeShare/web/dto/commentDto/CommentDeleteResponseDto.java @@ -9,11 +9,11 @@ @Getter public class CommentDeleteResponseDto extends ResEntity { - private Long productId; + private Long commentId; - public CommentDeleteResponseDto(Long productId) { + public CommentDeleteResponseDto(Long commentId) { this.setResultCode(RESPONES_SUCCESS.getValue()); this.setResultMsg(COMMENT_DELETE_OK); - this.productId = productId; + this.commentId = commentId; } } diff --git a/src/main/java/bebeShare/web/dto/commentDto/CommentInfoResponseDto.java b/src/main/java/bebeShare/web/dto/commentDto/CommentInfoResponseDto.java new file mode 100644 index 0000000..57be63a --- /dev/null +++ b/src/main/java/bebeShare/web/dto/commentDto/CommentInfoResponseDto.java @@ -0,0 +1,32 @@ +package bebeShare.web.dto.commentDto; + +import com.querydsl.core.annotations.QueryProjection; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class CommentInfoResponseDto { + + private Long commentId; + private String commentContent; + private String deleteYn; + private String commentStatus; + private String picture; + private Long userId; + private Long shareId; + private LocalDateTime insertDt; + + + @QueryProjection + public CommentInfoResponseDto(Long commentId , String commentContent, String deleteYn,String commentStatus, String picture,Long userId, Long shareId,LocalDateTime InsertDt) { + this.commentId = commentId; + this.commentContent = commentContent; + this.deleteYn = deleteYn; + this.commentStatus = commentStatus; + this.picture = picture; + this.userId = userId; + this.shareId = shareId; + this.insertDt = InsertDt; + } +} diff --git a/src/main/java/bebeShare/web/dto/commentDto/CommentUpdateRequestsDto.java b/src/main/java/bebeShare/web/dto/commentDto/CommentUpdateRequestsDto.java index a04413e..612aac8 100644 --- a/src/main/java/bebeShare/web/dto/commentDto/CommentUpdateRequestsDto.java +++ b/src/main/java/bebeShare/web/dto/commentDto/CommentUpdateRequestsDto.java @@ -7,28 +7,11 @@ import lombok.*; -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor +@Data public class CommentUpdateRequestsDto { - private User user; - private Product product; - private Long productId; - private Long memberId; + private Long commentId; private String commentContent; private String deleteYn; private String commentStatus; - @Builder - public Comment toEntity(){ - return Comment.builder() - .user(user) - .product(product) - .commentContent(commentContent) - .deleteYn("N") - .commentStatus("100") - .build(); - } - } diff --git a/src/main/java/bebeShare/web/dto/commentDto/CommentUpdateResponseDto.java b/src/main/java/bebeShare/web/dto/commentDto/CommentUpdateResponseDto.java index 21655a3..f2f298b 100644 --- a/src/main/java/bebeShare/web/dto/commentDto/CommentUpdateResponseDto.java +++ b/src/main/java/bebeShare/web/dto/commentDto/CommentUpdateResponseDto.java @@ -1,21 +1,30 @@ package bebeShare.web.dto.commentDto; import bebeShare.domain.common.entity.ResEntity; -import lombok.Getter; +import lombok.Data; +import lombok.Setter; +import static bebeShare.domain.common.CommonContants.COMMENT_UPDATE_FAIL; import static bebeShare.domain.common.CommonContants.COMMENT_UPDATE_OK; +import static bebeShare.domain.common.ResponeMsgEnum.RESPONES_FAIL; import static bebeShare.domain.common.ResponeMsgEnum.RESPONES_SUCCESS; -@Getter +@Data public class CommentUpdateResponseDto extends ResEntity { private String resultCode; private String resultMsg; - private Long productId; + private Long commentId; - public CommentUpdateResponseDto(Long productId) { + public CommentUpdateResponseDto(Long commentId) { this.setResultCode(RESPONES_SUCCESS.getValue()); this.setResultMsg(COMMENT_UPDATE_OK); - this.productId = productId; + this.commentId = commentId; + } + + public CommentUpdateResponseDto() { + this.setResultCode(RESPONES_FAIL.getValue()); + this.setResultMsg(COMMENT_UPDATE_FAIL); + this.commentId = 0L; } } \ No newline at end of file diff --git a/src/main/java/bebeShare/web/dto/commentDto/CommentsRequest.java b/src/main/java/bebeShare/web/dto/commentDto/CommentsRequest.java new file mode 100644 index 0000000..8b97ec1 --- /dev/null +++ b/src/main/java/bebeShare/web/dto/commentDto/CommentsRequest.java @@ -0,0 +1,9 @@ +package bebeShare.web.dto.commentDto; + +import bebeShare.domain.common.entity.PageEntity; +import lombok.Data; + +@Data +public class CommentsRequest extends PageEntity { + private Long productId; +} diff --git a/src/main/java/bebeShare/web/dto/likeDto/SaveLikeDto.java b/src/main/java/bebeShare/web/dto/likeDto/SaveLikeDto.java new file mode 100644 index 0000000..3086ea5 --- /dev/null +++ b/src/main/java/bebeShare/web/dto/likeDto/SaveLikeDto.java @@ -0,0 +1,35 @@ +package bebeShare.web.dto.likeDto; + + +import bebeShare.domain.like.Dibs; +import bebeShare.domain.product.Product; +import bebeShare.domain.user.User; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SaveLikeDto { + + private long productId; + private long userId; + + public SaveLikeDto() { + this.userId = userId; + this.productId = productId; + } + + public Dibs toEntity(Product product , User user){ + return Dibs.builder() + .product(product) + .user(user) + .build(); + } + + @Builder + public SaveLikeDto(Long product , Long user) { + this.productId = product; + this.userId = user; + } +} diff --git a/src/main/java/bebeShare/web/dto/productDto/ApproveShareProductRequest.java b/src/main/java/bebeShare/web/dto/productDto/ApproveShareProductRequest.java new file mode 100644 index 0000000..d10e2a0 --- /dev/null +++ b/src/main/java/bebeShare/web/dto/productDto/ApproveShareProductRequest.java @@ -0,0 +1,9 @@ +package bebeShare.web.dto.productDto; + +import lombok.Getter; + +@Getter +public class ApproveShareProductRequest { + private Long productId; + private Long shareId; +} diff --git a/src/main/java/bebeShare/web/dto/productDto/ApproveShareProductResponse.java b/src/main/java/bebeShare/web/dto/productDto/ApproveShareProductResponse.java new file mode 100644 index 0000000..0e76a8e --- /dev/null +++ b/src/main/java/bebeShare/web/dto/productDto/ApproveShareProductResponse.java @@ -0,0 +1,31 @@ +package bebeShare.web.dto.productDto; + +import bebeShare.domain.common.entity.ResEntity; +import lombok.Data; + +import static bebeShare.domain.common.CommonContants.COMMENT_UPDATE_FAIL; +import static bebeShare.domain.common.CommonContants.COMMENT_UPDATE_OK; +import static bebeShare.domain.common.ResponeMsgEnum.RESPONES_FAIL; +import static bebeShare.domain.common.ResponeMsgEnum.RESPONES_SUCCESS; + +@Data +public class ApproveShareProductResponse extends ResEntity { + + private static final String SHARRE_UPDATE_OK = "나눔 아이디 없데이트 성공"; + private static final String SHARRE_UPDATE_FAIL = "나눔 아이디 없데이트 실패"; + private String resultCode; + private String resultMsg; + private Long productid; + + public ApproveShareProductResponse(Long productid) { + this.setResultCode(RESPONES_SUCCESS.getValue()); + this.setResultMsg(SHARRE_UPDATE_OK); + this.productid = productid; + } + + public ApproveShareProductResponse() { + this.setResultCode(RESPONES_FAIL.getValue()); + this.setResultMsg(SHARRE_UPDATE_FAIL); + this.productid = 0L; + } +} \ No newline at end of file diff --git a/src/main/java/bebeShare/web/dto/productDto/CompleteShareRequest.java b/src/main/java/bebeShare/web/dto/productDto/CompleteShareRequest.java new file mode 100644 index 0000000..30f1708 --- /dev/null +++ b/src/main/java/bebeShare/web/dto/productDto/CompleteShareRequest.java @@ -0,0 +1,8 @@ +package bebeShare.web.dto.productDto; + +import lombok.Getter; + +@Getter +public class CompleteShareRequest { + private Long productId; +} diff --git a/src/main/java/bebeShare/web/dto/productDto/ProductCreateRequestDto.java b/src/main/java/bebeShare/web/dto/productDto/ProductCreateRequestDto.java index b368e09..a15d93a 100644 --- a/src/main/java/bebeShare/web/dto/productDto/ProductCreateRequestDto.java +++ b/src/main/java/bebeShare/web/dto/productDto/ProductCreateRequestDto.java @@ -2,7 +2,6 @@ import bebeShare.domain.product.Product; import bebeShare.domain.user.User; -import lombok.Data; import lombok.Getter; @Getter @@ -11,9 +10,6 @@ public class ProductCreateRequestDto { private User user; private String productName; private String productContent; - private String productImage1; - private String productImage2; - private String productImage3; private String productCategory; private String productStatus; private String deleteYn; @@ -23,9 +19,6 @@ public ProductCreateRequestDto() { this.user = user; this.productName = productName; this.productContent = productContent; - this.productImage1 = productImage1; - this.productImage2 = productImage2; - this.productImage3 = productImage3; this.productCategory = productCategory; this.productStatus = productStatus; this.deleteYn = deleteYn; @@ -38,9 +31,6 @@ public Product toEntity() { .productName(productName) .productCategory(productCategory) .productContent(productContent) - .productImage1(productImage1) - .productImage2(productImage2) - .productImage3(productImage3) .productStatus(productStatus) .deleteYn(deleteYn) .build(); diff --git a/src/main/java/bebeShare/web/dto/productDto/ProductInfoResponseDto.java b/src/main/java/bebeShare/web/dto/productDto/ProductInfoResponseDto.java new file mode 100644 index 0000000..62b4711 --- /dev/null +++ b/src/main/java/bebeShare/web/dto/productDto/ProductInfoResponseDto.java @@ -0,0 +1,36 @@ +package bebeShare.web.dto.productDto; + +import bebeShare.domain.product.Product; +import bebeShare.domain.user.User; +import com.querydsl.core.annotations.QueryProjection; +import lombok.Getter; + +import java.time.LocalDateTime; +@Getter +public class ProductInfoResponseDto { + + + private Long productId; + private User user; + private String productName; + private String productContent; + private String productImage1; + private String productImage2; + private String productImage3; + private String productCategory; + private String productStatus; + private String deleteYn; + private Long dibsId; + private LocalDateTime insertDt; + + @QueryProjection + public ProductInfoResponseDto(Long ProductId , String Productname, String ProductImage1,long dibsId, LocalDateTime InsertDt) { + this.productId = ProductId; + this.productName = Productname; + this.productImage1 = ProductImage1; + this.dibsId = dibsId; + this.insertDt = InsertDt; + + } + +} diff --git a/src/main/java/bebeShare/web/dto/productDto/ProductRequest.java b/src/main/java/bebeShare/web/dto/productDto/ProductRequest.java new file mode 100644 index 0000000..e61b181 --- /dev/null +++ b/src/main/java/bebeShare/web/dto/productDto/ProductRequest.java @@ -0,0 +1,19 @@ +package bebeShare.web.dto.productDto; + +import bebeShare.domain.common.entity.PageEntity; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Data +public class ProductRequest extends PageEntity { + private String productName; + private String categoryCode; + private String orderBy; + +// 마이페이지 내역 파라미터값 . + private Long memberId; + private String productStatus; + private Long shareId; +} diff --git a/src/main/java/bebeShare/web/dto/productDto/ProductResponseDto.java b/src/main/java/bebeShare/web/dto/productDto/ProductResponseDto.java index 442e873..3e545ab 100644 --- a/src/main/java/bebeShare/web/dto/productDto/ProductResponseDto.java +++ b/src/main/java/bebeShare/web/dto/productDto/ProductResponseDto.java @@ -2,8 +2,12 @@ import bebeShare.domain.product.Product; import bebeShare.domain.user.User; +import com.querydsl.core.annotations.QueryProjection; import lombok.Getter; +import java.time.LocalDateTime; + + @Getter public class ProductResponseDto { private Long productId; @@ -16,6 +20,7 @@ public class ProductResponseDto { private String productCategory; private String productStatus; private String deleteYn; + private Long shareId; public ProductResponseDto(Product entity) { @@ -29,5 +34,6 @@ public ProductResponseDto(Product entity) { this.productCategory = entity.getProductCategory(); this.productStatus = entity.getProductStatus(); this.deleteYn = entity.getDeleteYn(); + this.shareId = entity.getShareId(); } } diff --git a/src/main/java/bebeShare/web/dto/productDto/ProductUpdateRespone.java b/src/main/java/bebeShare/web/dto/productDto/ProductUpdateRespone.java new file mode 100644 index 0000000..b81bf8d --- /dev/null +++ b/src/main/java/bebeShare/web/dto/productDto/ProductUpdateRespone.java @@ -0,0 +1,35 @@ +package bebeShare.web.dto.productDto; + +import bebeShare.domain.product.Product; +import bebeShare.domain.user.User; +import lombok.Data; +import lombok.Getter; + +import static bebeShare.domain.common.CommonContants.COMMENT_UPDATE_FAIL; +import static bebeShare.domain.common.CommonContants.COMMENT_UPDATE_OK; +import static bebeShare.domain.common.ResponeMsgEnum.RESPONES_FAIL; +import static bebeShare.domain.common.ResponeMsgEnum.RESPONES_SUCCESS; + +@Data +public class ProductUpdateRespone { + + private static final String PROUDCT_UPDATE_OK = "상품 수정 성공"; + private static final String PROUDCT_UPDATE_FAIL ="상품 수정 실패" ; + private Long productId; + private String resultCode; + private String resultMsg; + + + + public ProductUpdateRespone(Long productId) { + this.setResultCode(RESPONES_SUCCESS.getValue()); + this.setResultMsg(PROUDCT_UPDATE_OK); + this.productId = productId; + } + + public ProductUpdateRespone() { + this.setResultCode(RESPONES_FAIL.getValue()); + this.setResultMsg(PROUDCT_UPDATE_FAIL); + this.productId = 0L; + } +} diff --git a/src/main/java/bebeShare/web/dto/productDto/RejectShareRequest.java b/src/main/java/bebeShare/web/dto/productDto/RejectShareRequest.java new file mode 100644 index 0000000..4b28145 --- /dev/null +++ b/src/main/java/bebeShare/web/dto/productDto/RejectShareRequest.java @@ -0,0 +1,8 @@ +package bebeShare.web.dto.productDto; + +import lombok.Getter; + +@Getter +public class RejectShareRequest { + private Long productId; +} diff --git a/src/main/java/bebeShare/web/dto/userDto/GiveInfoResponseDto.java b/src/main/java/bebeShare/web/dto/userDto/dto/GiveInfoResponseDto.java similarity index 94% rename from src/main/java/bebeShare/web/dto/userDto/GiveInfoResponseDto.java rename to src/main/java/bebeShare/web/dto/userDto/dto/GiveInfoResponseDto.java index aa0bd25..0e640d1 100644 --- a/src/main/java/bebeShare/web/dto/userDto/GiveInfoResponseDto.java +++ b/src/main/java/bebeShare/web/dto/userDto/dto/GiveInfoResponseDto.java @@ -1,4 +1,4 @@ -package bebeShare.web.dto.userDto; +package bebeShare.web.dto.userDto.dto; import com.querydsl.core.annotations.QueryProjection; import lombok.Getter; diff --git a/src/main/java/bebeShare/web/dto/userDto/LikeInfoResponseDto.java b/src/main/java/bebeShare/web/dto/userDto/dto/LikeInfoResponseDto.java similarity index 89% rename from src/main/java/bebeShare/web/dto/userDto/LikeInfoResponseDto.java rename to src/main/java/bebeShare/web/dto/userDto/dto/LikeInfoResponseDto.java index 5f2accf..867e43c 100644 --- a/src/main/java/bebeShare/web/dto/userDto/LikeInfoResponseDto.java +++ b/src/main/java/bebeShare/web/dto/userDto/dto/LikeInfoResponseDto.java @@ -1,6 +1,5 @@ -package bebeShare.web.dto.userDto; +package bebeShare.web.dto.userDto.dto; -import bebeShare.domain.product.Product; import com.querydsl.core.annotations.QueryProjection; import lombok.Getter; import lombok.ToString; diff --git a/src/main/java/bebeShare/web/dto/userDto/MemberCommentResponseDto.java b/src/main/java/bebeShare/web/dto/userDto/dto/MemberCommentResponseDto.java similarity index 75% rename from src/main/java/bebeShare/web/dto/userDto/MemberCommentResponseDto.java rename to src/main/java/bebeShare/web/dto/userDto/dto/MemberCommentResponseDto.java index 204d9fb..a4336c6 100644 --- a/src/main/java/bebeShare/web/dto/userDto/MemberCommentResponseDto.java +++ b/src/main/java/bebeShare/web/dto/userDto/dto/MemberCommentResponseDto.java @@ -1,8 +1,7 @@ -package bebeShare.web.dto.userDto; +package bebeShare.web.dto.userDto.dto; -import bebeShare.domain.comment.Comment; -import bebeShare.domain.product.Product; import com.querydsl.core.annotations.QueryProjection; +import com.querydsl.core.types.dsl.StringPath; import lombok.Getter; import lombok.ToString; @@ -15,6 +14,7 @@ public class MemberCommentResponseDto { private Long commentId; private String productName; private String commentContent; + //private StringPath productImage1; private LocalDateTime insertDt; @@ -24,6 +24,8 @@ public MemberCommentResponseDto(Long commentId, String productName, String comme this.commentId = commentId; this.productName = productName; this.commentContent = commentContent; + //this.productImage1 = productImage1; + this.insertDt = insertDt; } diff --git a/src/main/java/bebeShare/web/dto/userDto/ShareInfoResponseDto.java b/src/main/java/bebeShare/web/dto/userDto/dto/ShareInfoResponseDto.java similarity index 87% rename from src/main/java/bebeShare/web/dto/userDto/ShareInfoResponseDto.java rename to src/main/java/bebeShare/web/dto/userDto/dto/ShareInfoResponseDto.java index 752199c..07ce226 100644 --- a/src/main/java/bebeShare/web/dto/userDto/ShareInfoResponseDto.java +++ b/src/main/java/bebeShare/web/dto/userDto/dto/ShareInfoResponseDto.java @@ -1,9 +1,7 @@ -package bebeShare.web.dto.userDto; +package bebeShare.web.dto.userDto.dto; -import bebeShare.domain.product.Product; import com.querydsl.core.annotations.QueryProjection; import lombok.Data; -import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; diff --git a/src/main/java/bebeShare/web/dto/userDto/UserRequest.java b/src/main/java/bebeShare/web/dto/userDto/dto/UserRequest.java similarity index 86% rename from src/main/java/bebeShare/web/dto/userDto/UserRequest.java rename to src/main/java/bebeShare/web/dto/userDto/dto/UserRequest.java index 66b4027..453d041 100644 --- a/src/main/java/bebeShare/web/dto/userDto/UserRequest.java +++ b/src/main/java/bebeShare/web/dto/userDto/dto/UserRequest.java @@ -1,4 +1,5 @@ -package bebeShare.web.dto.userDto; +package bebeShare.web.dto.userDto.dto; + import bebeShare.domain.common.entity.PageEntity; import lombok.Getter; @@ -13,4 +14,4 @@ public class UserRequest extends PageEntity { private Long memberId; private String productStatus; -} +} \ No newline at end of file diff --git a/src/main/java/bebeShare/web/dto/userDto/UserResponseDto.java b/src/main/java/bebeShare/web/dto/userDto/dto/UserResponseDto.java similarity index 92% rename from src/main/java/bebeShare/web/dto/userDto/UserResponseDto.java rename to src/main/java/bebeShare/web/dto/userDto/dto/UserResponseDto.java index 599f9bc..1594110 100644 --- a/src/main/java/bebeShare/web/dto/userDto/UserResponseDto.java +++ b/src/main/java/bebeShare/web/dto/userDto/dto/UserResponseDto.java @@ -1,4 +1,4 @@ -package bebeShare.web.dto.userDto; +package bebeShare.web.dto.userDto.dto; import bebeShare.domain.user.User; import lombok.Getter; diff --git a/src/main/java/bebeShare/web/dto/userDto/req/CommentRequest.java b/src/main/java/bebeShare/web/dto/userDto/req/CommentRequest.java new file mode 100644 index 0000000..75661cb --- /dev/null +++ b/src/main/java/bebeShare/web/dto/userDto/req/CommentRequest.java @@ -0,0 +1,10 @@ +package bebeShare.web.dto.userDto.req; + +import bebeShare.domain.common.entity.PageEntity; +import lombok.Data; + +@Data +public class CommentRequest extends PageEntity { + + private Long memberId; +} diff --git a/src/main/java/bebeShare/web/dto/userDto/req/GiveRequest.java b/src/main/java/bebeShare/web/dto/userDto/req/GiveRequest.java new file mode 100644 index 0000000..60e613a --- /dev/null +++ b/src/main/java/bebeShare/web/dto/userDto/req/GiveRequest.java @@ -0,0 +1,11 @@ +package bebeShare.web.dto.userDto.req; + +import bebeShare.domain.common.entity.PageEntity; +import lombok.Data; + +@Data +public class GiveRequest extends PageEntity { + + private Long shareId; + private String productStatus; +} diff --git a/src/main/java/bebeShare/web/dto/userDto/req/LikeRequest.java b/src/main/java/bebeShare/web/dto/userDto/req/LikeRequest.java new file mode 100644 index 0000000..b6eb46b --- /dev/null +++ b/src/main/java/bebeShare/web/dto/userDto/req/LikeRequest.java @@ -0,0 +1,9 @@ +package bebeShare.web.dto.userDto.req; + +import bebeShare.domain.common.entity.PageEntity; +import lombok.Data; + +@Data +public class LikeRequest extends PageEntity { + private Long memberId; +} diff --git a/src/main/java/bebeShare/web/dto/userDto/req/ShareRequest.java b/src/main/java/bebeShare/web/dto/userDto/req/ShareRequest.java new file mode 100644 index 0000000..576b2e4 --- /dev/null +++ b/src/main/java/bebeShare/web/dto/userDto/req/ShareRequest.java @@ -0,0 +1,15 @@ +package bebeShare.web.dto.userDto.req; + +import bebeShare.domain.common.entity.PageEntity; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Data +public class ShareRequest extends PageEntity { + + private Long memberId; + private String productStatus; + +} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 974d29f..7d98fe8 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -7,24 +7,33 @@ spring: # DB datasource: +# url: jdbc:h2:tcp://localhost/~/bebeShare +# driver-class-name: org.h2.Driver +# username: sa driver-class-name: org.mariadb.jdbc.Driver url: jdbc:mariadb://211.105.66.96:3306/bebeShare username: bebeShare password: fW1*n[IQQM # JPA jpa: + generate-ddl: true show-sql: true hibernate: format_sql: true ddl-auto: create - database-platform: org.hibernate.dialect.MariaDBDialect - +# database-platform: org.hibernate.dialect.MariaDBDialect #REDIS redis: - host: 127.0.0.1 - port: 6379 + host: ec2-18-205-76-248.compute-1.amazonaws.com + port: 26500 + password: pae39b99f39db2c0e45ff88155be2bfd0445aa604c574ce084b84baf3b12e436d + url: rediss://:pae39b99f39db2c0e45ff88155be2bfd0445aa604c574ce084b84baf3b12e436d@ec2-18-205-76-248.compute-1.amazonaws.com:26500 + tls: true session: store-type: redis redis: flush-mode: on_save + + + diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 6e2cbd6..9d60cfd 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -17,12 +17,15 @@ spring: hibernate: dialect: org.hibernate.dialect.PostgreSQL10DialectDialect format_sql: true - ddl-auto: validate + ddl-auto: create # database-platform: org.hibernate.dialect.MariaDBDialect #REDIS redis: host: ${REDIS_HOST} port: ${REDIS_PORT} + password: ${REDIS_PASSWORD} + url: ${REDIS_TLS_URL} + tls: ${REDIS_TLS} session: store-type: redis redis: diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6873a26..9253b3c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,5 +1,6 @@ - +server: + port: ${PORT:8080} spring: @@ -17,6 +18,15 @@ logging: SQL: DEBUG type: debug + devtools: + livereload: + enabled: true + restart: + enabled: false + freemarker.cache: false + jackson: + serialization: + fail-on-empty-beans: false diff --git a/src/main/resources/static/chat/room.html b/src/main/resources/static/chat/room.html new file mode 100644 index 0000000..c85eb98 --- /dev/null +++ b/src/main/resources/static/chat/room.html @@ -0,0 +1,85 @@ + + + + Websocket Chat + + + + + + + +
+
+
+

채팅방 리스트

+
+
+
+
+ +
+ +
+ +
+
+
    +
  • + {{item.roomName}} +
  • +
+
+ + + + + + \ No newline at end of file diff --git a/src/main/resources/static/chat/roomdetail.html b/src/main/resources/static/chat/roomdetail.html new file mode 100644 index 0000000..ce3f122 --- /dev/null +++ b/src/main/resources/static/chat/roomdetail.html @@ -0,0 +1,100 @@ + + + + 나눔채팅방 + + + + + + + + + +
+
+

{{room.name}}

+
+
+
+ +
+ +
+ +
+
+
    +
  • + {{message.sender}} - {{message.message}} +
  • +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/css/all.min.css b/src/main/resources/static/css/all.min.css new file mode 100644 index 0000000..61712c8 --- /dev/null +++ b/src/main/resources/static/css/all.min.css @@ -0,0 +1,5716 @@ +/*! + * Font Awesome Free 5.8.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, .fab, .fal, .far, .fas { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1 +} + +.fa-lg { + font-size: 1.33333em; + line-height: .75em; + vertical-align: -.0667em +} + +.fa-xs { + font-size: .75em +} + +.fa-sm { + font-size: .875em +} + +.fa-1x { + font-size: 1em +} + +.fa-2x { + font-size: 2em +} + +.fa-3x { + font-size: 3em +} + +.fa-4x { + font-size: 4em +} + +.fa-5x { + font-size: 5em +} + +.fa-6x { + font-size: 6em +} + +.fa-7x { + font-size: 7em +} + +.fa-8x { + font-size: 8em +} + +.fa-9x { + font-size: 9em +} + +.fa-10x { + font-size: 10em +} + +.fa-fw { + text-align: center; + width: 1.25em +} + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0 +} + +.fa-ul > li { + position: relative +} + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit +} + +.fa-border { + border: .08em solid #eee; + border-radius: .1em; + padding: .2em .25em .15em +} + +.fa-pull-left { + float: left +} + +.fa-pull-right { + float: right +} + +.fa.fa-pull-left, .fab.fa-pull-left, .fal.fa-pull-left, .far.fa-pull-left, .fas.fa-pull-left { + margin-right: .3em +} + +.fa.fa-pull-right, .fab.fa-pull-right, .fal.fa-pull-right, .far.fa-pull-right, .fas.fa-pull-right { + margin-left: .3em +} + +.fa-spin { + animation: fa-spin 2s infinite linear +} + +.fa-pulse { + animation: fa-spin 1s infinite steps(8) +} + +@keyframes fa-spin { + 0% { + transform: rotate(0deg) + } + to { + transform: rotate(1turn) + } +} + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + transform: rotate(90deg) +} + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + transform: rotate(180deg) +} + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + transform: rotate(270deg) +} + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + transform: scaleX(-1) +} + +.fa-flip-vertical { + transform: scaleY(-1) +} + +.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical, .fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)" +} + +.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { + transform: scale(-1) +} + +:root .fa-flip-both, :root .fa-flip-horizontal, :root .fa-flip-vertical, :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270 { + filter: none +} + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em +} + +.fa-stack-1x, .fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100% +} + +.fa-stack-1x { + line-height: inherit +} + +.fa-stack-2x { + font-size: 2em +} + +.fa-inverse { + color: #fff +} + +.fa-500px:before { + content: "\f26e" +} + +.fa-accessible-icon:before { + content: "\f368" +} + +.fa-accusoft:before { + content: "\f369" +} + +.fa-acquisitions-incorporated:before { + content: "\f6af" +} + +.fa-ad:before { + content: "\f641" +} + +.fa-address-book:before { + content: "\f2b9" +} + +.fa-address-card:before { + content: "\f2bb" +} + +.fa-adjust:before { + content: "\f042" +} + +.fa-adn:before { + content: "\f170" +} + +.fa-adobe:before { + content: "\f778" +} + +.fa-adversal:before { + content: "\f36a" +} + +.fa-affiliatetheme:before { + content: "\f36b" +} + +.fa-air-freshener:before { + content: "\f5d0" +} + +.fa-airbnb:before { + content: "\f834" +} + +.fa-algolia:before { + content: "\f36c" +} + +.fa-align-center:before { + content: "\f037" +} + +.fa-align-justify:before { + content: "\f039" +} + +.fa-align-left:before { + content: "\f036" +} + +.fa-align-right:before { + content: "\f038" +} + +.fa-alipay:before { + content: "\f642" +} + +.fa-allergies:before { + content: "\f461" +} + +.fa-amazon:before { + content: "\f270" +} + +.fa-amazon-pay:before { + content: "\f42c" +} + +.fa-ambulance:before { + content: "\f0f9" +} + +.fa-american-sign-language-interpreting:before { + content: "\f2a3" +} + +.fa-amilia:before { + content: "\f36d" +} + +.fa-anchor:before { + content: "\f13d" +} + +.fa-android:before { + content: "\f17b" +} + +.fa-angellist:before { + content: "\f209" +} + +.fa-angle-double-down:before { + content: "\f103" +} + +.fa-angle-double-left:before { + content: "\f100" +} + +.fa-angle-double-right:before { + content: "\f101" +} + +.fa-angle-double-up:before { + content: "\f102" +} + +.fa-angle-down:before { + content: "\f107" +} + +.fa-angle-left:before { + content: "\f104" +} + +.fa-angle-right:before { + content: "\f105" +} + +.fa-angle-up:before { + content: "\f106" +} + +.fa-angry:before { + content: "\f556" +} + +.fa-angrycreative:before { + content: "\f36e" +} + +.fa-angular:before { + content: "\f420" +} + +.fa-ankh:before { + content: "\f644" +} + +.fa-app-store:before { + content: "\f36f" +} + +.fa-app-store-ios:before { + content: "\f370" +} + +.fa-apper:before { + content: "\f371" +} + +.fa-apple:before { + content: "\f179" +} + +.fa-apple-alt:before { + content: "\f5d1" +} + +.fa-apple-pay:before { + content: "\f415" +} + +.fa-archive:before { + content: "\f187" +} + +.fa-archway:before { + content: "\f557" +} + +.fa-arrow-alt-circle-down:before { + content: "\f358" +} + +.fa-arrow-alt-circle-left:before { + content: "\f359" +} + +.fa-arrow-alt-circle-right:before { + content: "\f35a" +} + +.fa-arrow-alt-circle-up:before { + content: "\f35b" +} + +.fa-arrow-circle-down:before { + content: "\f0ab" +} + +.fa-arrow-circle-left:before { + content: "\f0a8" +} + +.fa-arrow-circle-right:before { + content: "\f0a9" +} + +.fa-arrow-circle-up:before { + content: "\f0aa" +} + +.fa-arrow-down:before { + content: "\f063" +} + +.fa-arrow-left:before { + content: "\f060" +} + +.fa-arrow-right:before { + content: "\f061" +} + +.fa-arrow-up:before { + content: "\f062" +} + +.fa-arrows-alt:before { + content: "\f0b2" +} + +.fa-arrows-alt-h:before { + content: "\f337" +} + +.fa-arrows-alt-v:before { + content: "\f338" +} + +.fa-artstation:before { + content: "\f77a" +} + +.fa-assistive-listening-systems:before { + content: "\f2a2" +} + +.fa-asterisk:before { + content: "\f069" +} + +.fa-asymmetrik:before { + content: "\f372" +} + +.fa-at:before { + content: "\f1fa" +} + +.fa-atlas:before { + content: "\f558" +} + +.fa-atlassian:before { + content: "\f77b" +} + +.fa-atom:before { + content: "\f5d2" +} + +.fa-audible:before { + content: "\f373" +} + +.fa-audio-description:before { + content: "\f29e" +} + +.fa-autoprefixer:before { + content: "\f41c" +} + +.fa-avianex:before { + content: "\f374" +} + +.fa-aviato:before { + content: "\f421" +} + +.fa-award:before { + content: "\f559" +} + +.fa-aws:before { + content: "\f375" +} + +.fa-baby:before { + content: "\f77c" +} + +.fa-baby-carriage:before { + content: "\f77d" +} + +.fa-backspace:before { + content: "\f55a" +} + +.fa-backward:before { + content: "\f04a" +} + +.fa-bacon:before { + content: "\f7e5" +} + +.fa-balance-scale:before { + content: "\f24e" +} + +.fa-ban:before { + content: "\f05e" +} + +.fa-band-aid:before { + content: "\f462" +} + +.fa-bandcamp:before { + content: "\f2d5" +} + +.fa-barcode:before { + content: "\f02a" +} + +.fa-bars:before { + content: "\f0c9" +} + +.fa-baseball-ball:before { + content: "\f433" +} + +.fa-basketball-ball:before { + content: "\f434" +} + +.fa-bath:before { + content: "\f2cd" +} + +.fa-battery-empty:before { + content: "\f244" +} + +.fa-battery-full:before { + content: "\f240" +} + +.fa-battery-half:before { + content: "\f242" +} + +.fa-battery-quarter:before { + content: "\f243" +} + +.fa-battery-three-quarters:before { + content: "\f241" +} + +.fa-battle-net:before { + content: "\f835" +} + +.fa-bed:before { + content: "\f236" +} + +.fa-beer:before { + content: "\f0fc" +} + +.fa-behance:before { + content: "\f1b4" +} + +.fa-behance-square:before { + content: "\f1b5" +} + +.fa-bell:before { + content: "\f0f3" +} + +.fa-bell-slash:before { + content: "\f1f6" +} + +.fa-bezier-curve:before { + content: "\f55b" +} + +.fa-bible:before { + content: "\f647" +} + +.fa-bicycle:before { + content: "\f206" +} + +.fa-bimobject:before { + content: "\f378" +} + +.fa-binoculars:before { + content: "\f1e5" +} + +.fa-biohazard:before { + content: "\f780" +} + +.fa-birthday-cake:before { + content: "\f1fd" +} + +.fa-bitbucket:before { + content: "\f171" +} + +.fa-bitcoin:before { + content: "\f379" +} + +.fa-bity:before { + content: "\f37a" +} + +.fa-black-tie:before { + content: "\f27e" +} + +.fa-blackberry:before { + content: "\f37b" +} + +.fa-blender:before { + content: "\f517" +} + +.fa-blender-phone:before { + content: "\f6b6" +} + +.fa-blind:before { + content: "\f29d" +} + +.fa-blog:before { + content: "\f781" +} + +.fa-blogger:before { + content: "\f37c" +} + +.fa-blogger-b:before { + content: "\f37d" +} + +.fa-bluetooth:before { + content: "\f293" +} + +.fa-bluetooth-b:before { + content: "\f294" +} + +.fa-bold:before { + content: "\f032" +} + +.fa-bolt:before { + content: "\f0e7" +} + +.fa-bomb:before { + content: "\f1e2" +} + +.fa-bone:before { + content: "\f5d7" +} + +.fa-bong:before { + content: "\f55c" +} + +.fa-book:before { + content: "\f02d" +} + +.fa-book-dead:before { + content: "\f6b7" +} + +.fa-book-medical:before { + content: "\f7e6" +} + +.fa-book-open:before { + content: "\f518" +} + +.fa-book-reader:before { + content: "\f5da" +} + +.fa-bookmark:before { + content: "\f02e" +} + +.fa-bootstrap:before { + content: "\f836" +} + +.fa-bowling-ball:before { + content: "\f436" +} + +.fa-box:before { + content: "\f466" +} + +.fa-box-open:before { + content: "\f49e" +} + +.fa-boxes:before { + content: "\f468" +} + +.fa-braille:before { + content: "\f2a1" +} + +.fa-brain:before { + content: "\f5dc" +} + +.fa-bread-slice:before { + content: "\f7ec" +} + +.fa-briefcase:before { + content: "\f0b1" +} + +.fa-briefcase-medical:before { + content: "\f469" +} + +.fa-broadcast-tower:before { + content: "\f519" +} + +.fa-broom:before { + content: "\f51a" +} + +.fa-brush:before { + content: "\f55d" +} + +.fa-btc:before { + content: "\f15a" +} + +.fa-buffer:before { + content: "\f837" +} + +.fa-bug:before { + content: "\f188" +} + +.fa-building:before { + content: "\f1ad" +} + +.fa-bullhorn:before { + content: "\f0a1" +} + +.fa-bullseye:before { + content: "\f140" +} + +.fa-burn:before { + content: "\f46a" +} + +.fa-buromobelexperte:before { + content: "\f37f" +} + +.fa-bus:before { + content: "\f207" +} + +.fa-bus-alt:before { + content: "\f55e" +} + +.fa-business-time:before { + content: "\f64a" +} + +.fa-buysellads:before { + content: "\f20d" +} + +.fa-calculator:before { + content: "\f1ec" +} + +.fa-calendar:before { + content: "\f133" +} + +.fa-calendar-alt:before { + content: "\f073" +} + +.fa-calendar-check:before { + content: "\f274" +} + +.fa-calendar-day:before { + content: "\f783" +} + +.fa-calendar-minus:before { + content: "\f272" +} + +.fa-calendar-plus:before { + content: "\f271" +} + +.fa-calendar-times:before { + content: "\f273" +} + +.fa-calendar-week:before { + content: "\f784" +} + +.fa-camera:before { + content: "\f030" +} + +.fa-camera-retro:before { + content: "\f083" +} + +.fa-campground:before { + content: "\f6bb" +} + +.fa-canadian-maple-leaf:before { + content: "\f785" +} + +.fa-candy-cane:before { + content: "\f786" +} + +.fa-cannabis:before { + content: "\f55f" +} + +.fa-capsules:before { + content: "\f46b" +} + +.fa-car:before { + content: "\f1b9" +} + +.fa-car-alt:before { + content: "\f5de" +} + +.fa-car-battery:before { + content: "\f5df" +} + +.fa-car-crash:before { + content: "\f5e1" +} + +.fa-car-side:before { + content: "\f5e4" +} + +.fa-caret-down:before { + content: "\f0d7" +} + +.fa-caret-left:before { + content: "\f0d9" +} + +.fa-caret-right:before { + content: "\f0da" +} + +.fa-caret-square-down:before { + content: "\f150" +} + +.fa-caret-square-left:before { + content: "\f191" +} + +.fa-caret-square-right:before { + content: "\f152" +} + +.fa-caret-square-up:before { + content: "\f151" +} + +.fa-caret-up:before { + content: "\f0d8" +} + +.fa-carrot:before { + content: "\f787" +} + +.fa-cart-arrow-down:before { + content: "\f218" +} + +.fa-cart-plus:before { + content: "\f217" +} + +.fa-cash-register:before { + content: "\f788" +} + +.fa-cat:before { + content: "\f6be" +} + +.fa-cc-amazon-pay:before { + content: "\f42d" +} + +.fa-cc-amex:before { + content: "\f1f3" +} + +.fa-cc-apple-pay:before { + content: "\f416" +} + +.fa-cc-diners-club:before { + content: "\f24c" +} + +.fa-cc-discover:before { + content: "\f1f2" +} + +.fa-cc-jcb:before { + content: "\f24b" +} + +.fa-cc-mastercard:before { + content: "\f1f1" +} + +.fa-cc-paypal:before { + content: "\f1f4" +} + +.fa-cc-stripe:before { + content: "\f1f5" +} + +.fa-cc-visa:before { + content: "\f1f0" +} + +.fa-centercode:before { + content: "\f380" +} + +.fa-centos:before { + content: "\f789" +} + +.fa-certificate:before { + content: "\f0a3" +} + +.fa-chair:before { + content: "\f6c0" +} + +.fa-chalkboard:before { + content: "\f51b" +} + +.fa-chalkboard-teacher:before { + content: "\f51c" +} + +.fa-charging-station:before { + content: "\f5e7" +} + +.fa-chart-area:before { + content: "\f1fe" +} + +.fa-chart-bar:before { + content: "\f080" +} + +.fa-chart-line:before { + content: "\f201" +} + +.fa-chart-pie:before { + content: "\f200" +} + +.fa-check:before { + content: "\f00c" +} + +.fa-check-circle:before { + content: "\f058" +} + +.fa-check-double:before { + content: "\f560" +} + +.fa-check-square:before { + content: "\f14a" +} + +.fa-cheese:before { + content: "\f7ef" +} + +.fa-chess:before { + content: "\f439" +} + +.fa-chess-bishop:before { + content: "\f43a" +} + +.fa-chess-board:before { + content: "\f43c" +} + +.fa-chess-king:before { + content: "\f43f" +} + +.fa-chess-knight:before { + content: "\f441" +} + +.fa-chess-pawn:before { + content: "\f443" +} + +.fa-chess-queen:before { + content: "\f445" +} + +.fa-chess-rook:before { + content: "\f447" +} + +.fa-chevron-circle-down:before { + content: "\f13a" +} + +.fa-chevron-circle-left:before { + content: "\f137" +} + +.fa-chevron-circle-right:before { + content: "\f138" +} + +.fa-chevron-circle-up:before { + content: "\f139" +} + +.fa-chevron-down:before { + content: "\f078" +} + +.fa-chevron-left:before { + content: "\f053" +} + +.fa-chevron-right:before { + content: "\f054" +} + +.fa-chevron-up:before { + content: "\f077" +} + +.fa-child:before { + content: "\f1ae" +} + +.fa-chrome:before { + content: "\f268" +} + +.fa-chromecast:before { + content: "\f838" +} + +.fa-church:before { + content: "\f51d" +} + +.fa-circle:before { + content: "\f111" +} + +.fa-circle-notch:before { + content: "\f1ce" +} + +.fa-city:before { + content: "\f64f" +} + +.fa-clinic-medical:before { + content: "\f7f2" +} + +.fa-clipboard:before { + content: "\f328" +} + +.fa-clipboard-check:before { + content: "\f46c" +} + +.fa-clipboard-list:before { + content: "\f46d" +} + +.fa-clock:before { + content: "\f017" +} + +.fa-clone:before { + content: "\f24d" +} + +.fa-closed-captioning:before { + content: "\f20a" +} + +.fa-cloud:before { + content: "\f0c2" +} + +.fa-cloud-download-alt:before { + content: "\f381" +} + +.fa-cloud-meatball:before { + content: "\f73b" +} + +.fa-cloud-moon:before { + content: "\f6c3" +} + +.fa-cloud-moon-rain:before { + content: "\f73c" +} + +.fa-cloud-rain:before { + content: "\f73d" +} + +.fa-cloud-showers-heavy:before { + content: "\f740" +} + +.fa-cloud-sun:before { + content: "\f6c4" +} + +.fa-cloud-sun-rain:before { + content: "\f743" +} + +.fa-cloud-upload-alt:before { + content: "\f382" +} + +.fa-cloudscale:before { + content: "\f383" +} + +.fa-cloudsmith:before { + content: "\f384" +} + +.fa-cloudversify:before { + content: "\f385" +} + +.fa-cocktail:before { + content: "\f561" +} + +.fa-code:before { + content: "\f121" +} + +.fa-code-branch:before { + content: "\f126" +} + +.fa-codepen:before { + content: "\f1cb" +} + +.fa-codiepie:before { + content: "\f284" +} + +.fa-coffee:before { + content: "\f0f4" +} + +.fa-cog:before { + content: "\f013" +} + +.fa-cogs:before { + content: "\f085" +} + +.fa-coins:before { + content: "\f51e" +} + +.fa-columns:before { + content: "\f0db" +} + +.fa-comment:before { + content: "\f075" +} + +.fa-comment-alt:before { + content: "\f27a" +} + +.fa-comment-dollar:before { + content: "\f651" +} + +.fa-comment-dots:before { + content: "\f4ad" +} + +.fa-comment-medical:before { + content: "\f7f5" +} + +.fa-comment-slash:before { + content: "\f4b3" +} + +.fa-comments:before { + content: "\f086" +} + +.fa-comments-dollar:before { + content: "\f653" +} + +.fa-compact-disc:before { + content: "\f51f" +} + +.fa-compass:before { + content: "\f14e" +} + +.fa-compress:before { + content: "\f066" +} + +.fa-compress-arrows-alt:before { + content: "\f78c" +} + +.fa-concierge-bell:before { + content: "\f562" +} + +.fa-confluence:before { + content: "\f78d" +} + +.fa-connectdevelop:before { + content: "\f20e" +} + +.fa-contao:before { + content: "\f26d" +} + +.fa-cookie:before { + content: "\f563" +} + +.fa-cookie-bite:before { + content: "\f564" +} + +.fa-copy:before { + content: "\f0c5" +} + +.fa-copyright:before { + content: "\f1f9" +} + +.fa-couch:before { + content: "\f4b8" +} + +.fa-cpanel:before { + content: "\f388" +} + +.fa-creative-commons:before { + content: "\f25e" +} + +.fa-creative-commons-by:before { + content: "\f4e7" +} + +.fa-creative-commons-nc:before { + content: "\f4e8" +} + +.fa-creative-commons-nc-eu:before { + content: "\f4e9" +} + +.fa-creative-commons-nc-jp:before { + content: "\f4ea" +} + +.fa-creative-commons-nd:before { + content: "\f4eb" +} + +.fa-creative-commons-pd:before { + content: "\f4ec" +} + +.fa-creative-commons-pd-alt:before { + content: "\f4ed" +} + +.fa-creative-commons-remix:before { + content: "\f4ee" +} + +.fa-creative-commons-sa:before { + content: "\f4ef" +} + +.fa-creative-commons-sampling:before { + content: "\f4f0" +} + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1" +} + +.fa-creative-commons-share:before { + content: "\f4f2" +} + +.fa-creative-commons-zero:before { + content: "\f4f3" +} + +.fa-credit-card:before { + content: "\f09d" +} + +.fa-critical-role:before { + content: "\f6c9" +} + +.fa-crop:before { + content: "\f125" +} + +.fa-crop-alt:before { + content: "\f565" +} + +.fa-cross:before { + content: "\f654" +} + +.fa-crosshairs:before { + content: "\f05b" +} + +.fa-crow:before { + content: "\f520" +} + +.fa-crown:before { + content: "\f521" +} + +.fa-crutch:before { + content: "\f7f7" +} + +.fa-css3:before { + content: "\f13c" +} + +.fa-css3-alt:before { + content: "\f38b" +} + +.fa-cube:before { + content: "\f1b2" +} + +.fa-cubes:before { + content: "\f1b3" +} + +.fa-cut:before { + content: "\f0c4" +} + +.fa-cuttlefish:before { + content: "\f38c" +} + +.fa-d-and-d:before { + content: "\f38d" +} + +.fa-d-and-d-beyond:before { + content: "\f6ca" +} + +.fa-dashcube:before { + content: "\f210" +} + +.fa-database:before { + content: "\f1c0" +} + +.fa-deaf:before { + content: "\f2a4" +} + +.fa-delicious:before { + content: "\f1a5" +} + +.fa-democrat:before { + content: "\f747" +} + +.fa-deploydog:before { + content: "\f38e" +} + +.fa-deskpro:before { + content: "\f38f" +} + +.fa-desktop:before { + content: "\f108" +} + +.fa-dev:before { + content: "\f6cc" +} + +.fa-deviantart:before { + content: "\f1bd" +} + +.fa-dharmachakra:before { + content: "\f655" +} + +.fa-dhl:before { + content: "\f790" +} + +.fa-diagnoses:before { + content: "\f470" +} + +.fa-diaspora:before { + content: "\f791" +} + +.fa-dice:before { + content: "\f522" +} + +.fa-dice-d20:before { + content: "\f6cf" +} + +.fa-dice-d6:before { + content: "\f6d1" +} + +.fa-dice-five:before { + content: "\f523" +} + +.fa-dice-four:before { + content: "\f524" +} + +.fa-dice-one:before { + content: "\f525" +} + +.fa-dice-six:before { + content: "\f526" +} + +.fa-dice-three:before { + content: "\f527" +} + +.fa-dice-two:before { + content: "\f528" +} + +.fa-digg:before { + content: "\f1a6" +} + +.fa-digital-ocean:before { + content: "\f391" +} + +.fa-digital-tachograph:before { + content: "\f566" +} + +.fa-directions:before { + content: "\f5eb" +} + +.fa-discord:before { + content: "\f392" +} + +.fa-discourse:before { + content: "\f393" +} + +.fa-divide:before { + content: "\f529" +} + +.fa-dizzy:before { + content: "\f567" +} + +.fa-dna:before { + content: "\f471" +} + +.fa-dochub:before { + content: "\f394" +} + +.fa-docker:before { + content: "\f395" +} + +.fa-dog:before { + content: "\f6d3" +} + +.fa-dollar-sign:before { + content: "\f155" +} + +.fa-dolly:before { + content: "\f472" +} + +.fa-dolly-flatbed:before { + content: "\f474" +} + +.fa-donate:before { + content: "\f4b9" +} + +.fa-door-closed:before { + content: "\f52a" +} + +.fa-door-open:before { + content: "\f52b" +} + +.fa-dot-circle:before { + content: "\f192" +} + +.fa-dove:before { + content: "\f4ba" +} + +.fa-download:before { + content: "\f019" +} + +.fa-draft2digital:before { + content: "\f396" +} + +.fa-drafting-compass:before { + content: "\f568" +} + +.fa-dragon:before { + content: "\f6d5" +} + +.fa-draw-polygon:before { + content: "\f5ee" +} + +.fa-dribbble:before { + content: "\f17d" +} + +.fa-dribbble-square:before { + content: "\f397" +} + +.fa-dropbox:before { + content: "\f16b" +} + +.fa-drum:before { + content: "\f569" +} + +.fa-drum-steelpan:before { + content: "\f56a" +} + +.fa-drumstick-bite:before { + content: "\f6d7" +} + +.fa-drupal:before { + content: "\f1a9" +} + +.fa-dumbbell:before { + content: "\f44b" +} + +.fa-dumpster:before { + content: "\f793" +} + +.fa-dumpster-fire:before { + content: "\f794" +} + +.fa-dungeon:before { + content: "\f6d9" +} + +.fa-dyalog:before { + content: "\f399" +} + +.fa-earlybirds:before { + content: "\f39a" +} + +.fa-ebay:before { + content: "\f4f4" +} + +.fa-edge:before { + content: "\f282" +} + +.fa-edit:before { + content: "\f044" +} + +.fa-egg:before { + content: "\f7fb" +} + +.fa-eject:before { + content: "\f052" +} + +.fa-elementor:before { + content: "\f430" +} + +.fa-ellipsis-h:before { + content: "\f141" +} + +.fa-ellipsis-v:before { + content: "\f142" +} + +.fa-ello:before { + content: "\f5f1" +} + +.fa-ember:before { + content: "\f423" +} + +.fa-empire:before { + content: "\f1d1" +} + +.fa-envelope:before { + content: "\f0e0" +} + +.fa-envelope-open:before { + content: "\f2b6" +} + +.fa-envelope-open-text:before { + content: "\f658" +} + +.fa-envelope-square:before { + content: "\f199" +} + +.fa-envira:before { + content: "\f299" +} + +.fa-equals:before { + content: "\f52c" +} + +.fa-eraser:before { + content: "\f12d" +} + +.fa-erlang:before { + content: "\f39d" +} + +.fa-ethereum:before { + content: "\f42e" +} + +.fa-ethernet:before { + content: "\f796" +} + +.fa-etsy:before { + content: "\f2d7" +} + +.fa-euro-sign:before { + content: "\f153" +} + +.fa-evernote:before { + content: "\f839" +} + +.fa-exchange-alt:before { + content: "\f362" +} + +.fa-exclamation:before { + content: "\f12a" +} + +.fa-exclamation-circle:before { + content: "\f06a" +} + +.fa-exclamation-triangle:before { + content: "\f071" +} + +.fa-expand:before { + content: "\f065" +} + +.fa-expand-arrows-alt:before { + content: "\f31e" +} + +.fa-expeditedssl:before { + content: "\f23e" +} + +.fa-external-link-alt:before { + content: "\f35d" +} + +.fa-external-link-square-alt:before { + content: "\f360" +} + +.fa-eye:before { + content: "\f06e" +} + +.fa-eye-dropper:before { + content: "\f1fb" +} + +.fa-eye-slash:before { + content: "\f070" +} + +.fa-facebook:before { + content: "\f09a" +} + +.fa-facebook-f:before { + content: "\f39e" +} + +.fa-facebook-messenger:before { + content: "\f39f" +} + +.fa-facebook-square:before { + content: "\f082" +} + +.fa-fantasy-flight-games:before { + content: "\f6dc" +} + +.fa-fast-backward:before { + content: "\f049" +} + +.fa-fast-forward:before { + content: "\f050" +} + +.fa-fax:before { + content: "\f1ac" +} + +.fa-feather:before { + content: "\f52d" +} + +.fa-feather-alt:before { + content: "\f56b" +} + +.fa-fedex:before { + content: "\f797" +} + +.fa-fedora:before { + content: "\f798" +} + +.fa-female:before { + content: "\f182" +} + +.fa-fighter-jet:before { + content: "\f0fb" +} + +.fa-figma:before { + content: "\f799" +} + +.fa-file:before { + content: "\f15b" +} + +.fa-file-alt:before { + content: "\f15c" +} + +.fa-file-archive:before { + content: "\f1c6" +} + +.fa-file-audio:before { + content: "\f1c7" +} + +.fa-file-code:before { + content: "\f1c9" +} + +.fa-file-contract:before { + content: "\f56c" +} + +.fa-file-csv:before { + content: "\f6dd" +} + +.fa-file-download:before { + content: "\f56d" +} + +.fa-file-excel:before { + content: "\f1c3" +} + +.fa-file-export:before { + content: "\f56e" +} + +.fa-file-image:before { + content: "\f1c5" +} + +.fa-file-import:before { + content: "\f56f" +} + +.fa-file-invoice:before { + content: "\f570" +} + +.fa-file-invoice-dollar:before { + content: "\f571" +} + +.fa-file-medical:before { + content: "\f477" +} + +.fa-file-medical-alt:before { + content: "\f478" +} + +.fa-file-pdf:before { + content: "\f1c1" +} + +.fa-file-powerpoint:before { + content: "\f1c4" +} + +.fa-file-prescription:before { + content: "\f572" +} + +.fa-file-signature:before { + content: "\f573" +} + +.fa-file-upload:before { + content: "\f574" +} + +.fa-file-video:before { + content: "\f1c8" +} + +.fa-file-word:before { + content: "\f1c2" +} + +.fa-fill:before { + content: "\f575" +} + +.fa-fill-drip:before { + content: "\f576" +} + +.fa-film:before { + content: "\f008" +} + +.fa-filter:before { + content: "\f0b0" +} + +.fa-fingerprint:before { + content: "\f577" +} + +.fa-fire:before { + content: "\f06d" +} + +.fa-fire-alt:before { + content: "\f7e4" +} + +.fa-fire-extinguisher:before { + content: "\f134" +} + +.fa-firefox:before { + content: "\f269" +} + +.fa-first-aid:before { + content: "\f479" +} + +.fa-first-order:before { + content: "\f2b0" +} + +.fa-first-order-alt:before { + content: "\f50a" +} + +.fa-firstdraft:before { + content: "\f3a1" +} + +.fa-fish:before { + content: "\f578" +} + +.fa-fist-raised:before { + content: "\f6de" +} + +.fa-flag:before { + content: "\f024" +} + +.fa-flag-checkered:before { + content: "\f11e" +} + +.fa-flag-usa:before { + content: "\f74d" +} + +.fa-flask:before { + content: "\f0c3" +} + +.fa-flickr:before { + content: "\f16e" +} + +.fa-flipboard:before { + content: "\f44d" +} + +.fa-flushed:before { + content: "\f579" +} + +.fa-fly:before { + content: "\f417" +} + +.fa-folder:before { + content: "\f07b" +} + +.fa-folder-minus:before { + content: "\f65d" +} + +.fa-folder-open:before { + content: "\f07c" +} + +.fa-folder-plus:before { + content: "\f65e" +} + +.fa-font:before { + content: "\f031" +} + +.fa-font-awesome:before { + content: "\f2b4" +} + +.fa-font-awesome-alt:before { + content: "\f35c" +} + +.fa-font-awesome-flag:before { + content: "\f425" +} + +.fa-font-awesome-logo-full:before { + content: "\f4e6" +} + +.fa-fonticons:before { + content: "\f280" +} + +.fa-fonticons-fi:before { + content: "\f3a2" +} + +.fa-football-ball:before { + content: "\f44e" +} + +.fa-fort-awesome:before { + content: "\f286" +} + +.fa-fort-awesome-alt:before { + content: "\f3a3" +} + +.fa-forumbee:before { + content: "\f211" +} + +.fa-forward:before { + content: "\f04e" +} + +.fa-foursquare:before { + content: "\f180" +} + +.fa-free-code-camp:before { + content: "\f2c5" +} + +.fa-freebsd:before { + content: "\f3a4" +} + +.fa-frog:before { + content: "\f52e" +} + +.fa-frown:before { + content: "\f119" +} + +.fa-frown-open:before { + content: "\f57a" +} + +.fa-fulcrum:before { + content: "\f50b" +} + +.fa-funnel-dollar:before { + content: "\f662" +} + +.fa-futbol:before { + content: "\f1e3" +} + +.fa-galactic-republic:before { + content: "\f50c" +} + +.fa-galactic-senate:before { + content: "\f50d" +} + +.fa-gamepad:before { + content: "\f11b" +} + +.fa-gas-pump:before { + content: "\f52f" +} + +.fa-gavel:before { + content: "\f0e3" +} + +.fa-gem:before { + content: "\f3a5" +} + +.fa-genderless:before { + content: "\f22d" +} + +.fa-get-pocket:before { + content: "\f265" +} + +.fa-gg:before { + content: "\f260" +} + +.fa-gg-circle:before { + content: "\f261" +} + +.fa-ghost:before { + content: "\f6e2" +} + +.fa-gift:before { + content: "\f06b" +} + +.fa-gifts:before { + content: "\f79c" +} + +.fa-git:before { + content: "\f1d3" +} + +.fa-git-alt:before { + content: "\f841" +} + +.fa-git-square:before { + content: "\f1d2" +} + +.fa-github:before { + content: "\f09b" +} + +.fa-github-alt:before { + content: "\f113" +} + +.fa-github-square:before { + content: "\f092" +} + +.fa-gitkraken:before { + content: "\f3a6" +} + +.fa-gitlab:before { + content: "\f296" +} + +.fa-gitter:before { + content: "\f426" +} + +.fa-glass-cheers:before { + content: "\f79f" +} + +.fa-glass-martini:before { + content: "\f000" +} + +.fa-glass-martini-alt:before { + content: "\f57b" +} + +.fa-glass-whiskey:before { + content: "\f7a0" +} + +.fa-glasses:before { + content: "\f530" +} + +.fa-glide:before { + content: "\f2a5" +} + +.fa-glide-g:before { + content: "\f2a6" +} + +.fa-globe:before { + content: "\f0ac" +} + +.fa-globe-africa:before { + content: "\f57c" +} + +.fa-globe-americas:before { + content: "\f57d" +} + +.fa-globe-asia:before { + content: "\f57e" +} + +.fa-globe-europe:before { + content: "\f7a2" +} + +.fa-gofore:before { + content: "\f3a7" +} + +.fa-golf-ball:before { + content: "\f450" +} + +.fa-goodreads:before { + content: "\f3a8" +} + +.fa-goodreads-g:before { + content: "\f3a9" +} + +.fa-google:before { + content: "\f1a0" +} + +.fa-google-drive:before { + content: "\f3aa" +} + +.fa-google-play:before { + content: "\f3ab" +} + +.fa-google-plus:before { + content: "\f2b3" +} + +.fa-google-plus-g:before { + content: "\f0d5" +} + +.fa-google-plus-square:before { + content: "\f0d4" +} + +.fa-google-wallet:before { + content: "\f1ee" +} + +.fa-gopuram:before { + content: "\f664" +} + +.fa-graduation-cap:before { + content: "\f19d" +} + +.fa-gratipay:before { + content: "\f184" +} + +.fa-grav:before { + content: "\f2d6" +} + +.fa-greater-than:before { + content: "\f531" +} + +.fa-greater-than-equal:before { + content: "\f532" +} + +.fa-grimace:before { + content: "\f57f" +} + +.fa-grin:before { + content: "\f580" +} + +.fa-grin-alt:before { + content: "\f581" +} + +.fa-grin-beam:before { + content: "\f582" +} + +.fa-grin-beam-sweat:before { + content: "\f583" +} + +.fa-grin-hearts:before { + content: "\f584" +} + +.fa-grin-squint:before { + content: "\f585" +} + +.fa-grin-squint-tears:before { + content: "\f586" +} + +.fa-grin-stars:before { + content: "\f587" +} + +.fa-grin-tears:before { + content: "\f588" +} + +.fa-grin-tongue:before { + content: "\f589" +} + +.fa-grin-tongue-squint:before { + content: "\f58a" +} + +.fa-grin-tongue-wink:before { + content: "\f58b" +} + +.fa-grin-wink:before { + content: "\f58c" +} + +.fa-grip-horizontal:before { + content: "\f58d" +} + +.fa-grip-lines:before { + content: "\f7a4" +} + +.fa-grip-lines-vertical:before { + content: "\f7a5" +} + +.fa-grip-vertical:before { + content: "\f58e" +} + +.fa-gripfire:before { + content: "\f3ac" +} + +.fa-grunt:before { + content: "\f3ad" +} + +.fa-guitar:before { + content: "\f7a6" +} + +.fa-gulp:before { + content: "\f3ae" +} + +.fa-h-square:before { + content: "\f0fd" +} + +.fa-hacker-news:before { + content: "\f1d4" +} + +.fa-hacker-news-square:before { + content: "\f3af" +} + +.fa-hackerrank:before { + content: "\f5f7" +} + +.fa-hamburger:before { + content: "\f805" +} + +.fa-hammer:before { + content: "\f6e3" +} + +.fa-hamsa:before { + content: "\f665" +} + +.fa-hand-holding:before { + content: "\f4bd" +} + +.fa-hand-holding-heart:before { + content: "\f4be" +} + +.fa-hand-holding-usd:before { + content: "\f4c0" +} + +.fa-hand-lizard:before { + content: "\f258" +} + +.fa-hand-middle-finger:before { + content: "\f806" +} + +.fa-hand-paper:before { + content: "\f256" +} + +.fa-hand-peace:before { + content: "\f25b" +} + +.fa-hand-point-down:before { + content: "\f0a7" +} + +.fa-hand-point-left:before { + content: "\f0a5" +} + +.fa-hand-point-right:before { + content: "\f0a4" +} + +.fa-hand-point-up:before { + content: "\f0a6" +} + +.fa-hand-pointer:before { + content: "\f25a" +} + +.fa-hand-rock:before { + content: "\f255" +} + +.fa-hand-scissors:before { + content: "\f257" +} + +.fa-hand-spock:before { + content: "\f259" +} + +.fa-hands:before { + content: "\f4c2" +} + +.fa-hands-helping:before { + content: "\f4c4" +} + +.fa-handshake:before { + content: "\f2b5" +} + +.fa-hanukiah:before { + content: "\f6e6" +} + +.fa-hard-hat:before { + content: "\f807" +} + +.fa-hashtag:before { + content: "\f292" +} + +.fa-hat-wizard:before { + content: "\f6e8" +} + +.fa-haykal:before { + content: "\f666" +} + +.fa-hdd:before { + content: "\f0a0" +} + +.fa-heading:before { + content: "\f1dc" +} + +.fa-headphones:before { + content: "\f025" +} + +.fa-headphones-alt:before { + content: "\f58f" +} + +.fa-headset:before { + content: "\f590" +} + +.fa-heart:before { + content: "\f004" +} + +.fa-heart-broken:before { + content: "\f7a9" +} + +.fa-heartbeat:before { + content: "\f21e" +} + +.fa-helicopter:before { + content: "\f533" +} + +.fa-highlighter:before { + content: "\f591" +} + +.fa-hiking:before { + content: "\f6ec" +} + +.fa-hippo:before { + content: "\f6ed" +} + +.fa-hips:before { + content: "\f452" +} + +.fa-hire-a-helper:before { + content: "\f3b0" +} + +.fa-history:before { + content: "\f1da" +} + +.fa-hockey-puck:before { + content: "\f453" +} + +.fa-holly-berry:before { + content: "\f7aa" +} + +.fa-home:before { + content: "\f015" +} + +.fa-hooli:before { + content: "\f427" +} + +.fa-hornbill:before { + content: "\f592" +} + +.fa-horse:before { + content: "\f6f0" +} + +.fa-horse-head:before { + content: "\f7ab" +} + +.fa-hospital:before { + content: "\f0f8" +} + +.fa-hospital-alt:before { + content: "\f47d" +} + +.fa-hospital-symbol:before { + content: "\f47e" +} + +.fa-hot-tub:before { + content: "\f593" +} + +.fa-hotdog:before { + content: "\f80f" +} + +.fa-hotel:before { + content: "\f594" +} + +.fa-hotjar:before { + content: "\f3b1" +} + +.fa-hourglass:before { + content: "\f254" +} + +.fa-hourglass-end:before { + content: "\f253" +} + +.fa-hourglass-half:before { + content: "\f252" +} + +.fa-hourglass-start:before { + content: "\f251" +} + +.fa-house-damage:before { + content: "\f6f1" +} + +.fa-houzz:before { + content: "\f27c" +} + +.fa-hryvnia:before { + content: "\f6f2" +} + +.fa-html5:before { + content: "\f13b" +} + +.fa-hubspot:before { + content: "\f3b2" +} + +.fa-i-cursor:before { + content: "\f246" +} + +.fa-ice-cream:before { + content: "\f810" +} + +.fa-icicles:before { + content: "\f7ad" +} + +.fa-id-badge:before { + content: "\f2c1" +} + +.fa-id-card:before { + content: "\f2c2" +} + +.fa-id-card-alt:before { + content: "\f47f" +} + +.fa-igloo:before { + content: "\f7ae" +} + +.fa-image:before { + content: "\f03e" +} + +.fa-images:before { + content: "\f302" +} + +.fa-imdb:before { + content: "\f2d8" +} + +.fa-inbox:before { + content: "\f01c" +} + +.fa-indent:before { + content: "\f03c" +} + +.fa-industry:before { + content: "\f275" +} + +.fa-infinity:before { + content: "\f534" +} + +.fa-info:before { + content: "\f129" +} + +.fa-info-circle:before { + content: "\f05a" +} + +.fa-instagram:before { + content: "\f16d" +} + +.fa-intercom:before { + content: "\f7af" +} + +.fa-internet-explorer:before { + content: "\f26b" +} + +.fa-invision:before { + content: "\f7b0" +} + +.fa-ioxhost:before { + content: "\f208" +} + +.fa-italic:before { + content: "\f033" +} + +.fa-itch-io:before { + content: "\f83a" +} + +.fa-itunes:before { + content: "\f3b4" +} + +.fa-itunes-note:before { + content: "\f3b5" +} + +.fa-java:before { + content: "\f4e4" +} + +.fa-jedi:before { + content: "\f669" +} + +.fa-jedi-order:before { + content: "\f50e" +} + +.fa-jenkins:before { + content: "\f3b6" +} + +.fa-jira:before { + content: "\f7b1" +} + +.fa-joget:before { + content: "\f3b7" +} + +.fa-joint:before { + content: "\f595" +} + +.fa-joomla:before { + content: "\f1aa" +} + +.fa-journal-whills:before { + content: "\f66a" +} + +.fa-js:before { + content: "\f3b8" +} + +.fa-js-square:before { + content: "\f3b9" +} + +.fa-jsfiddle:before { + content: "\f1cc" +} + +.fa-kaaba:before { + content: "\f66b" +} + +.fa-kaggle:before { + content: "\f5fa" +} + +.fa-key:before { + content: "\f084" +} + +.fa-keybase:before { + content: "\f4f5" +} + +.fa-keyboard:before { + content: "\f11c" +} + +.fa-keycdn:before { + content: "\f3ba" +} + +.fa-khanda:before { + content: "\f66d" +} + +.fa-kickstarter:before { + content: "\f3bb" +} + +.fa-kickstarter-k:before { + content: "\f3bc" +} + +.fa-kiss:before { + content: "\f596" +} + +.fa-kiss-beam:before { + content: "\f597" +} + +.fa-kiss-wink-heart:before { + content: "\f598" +} + +.fa-kiwi-bird:before { + content: "\f535" +} + +.fa-korvue:before { + content: "\f42f" +} + +.fa-landmark:before { + content: "\f66f" +} + +.fa-language:before { + content: "\f1ab" +} + +.fa-laptop:before { + content: "\f109" +} + +.fa-laptop-code:before { + content: "\f5fc" +} + +.fa-laptop-medical:before { + content: "\f812" +} + +.fa-laravel:before { + content: "\f3bd" +} + +.fa-lastfm:before { + content: "\f202" +} + +.fa-lastfm-square:before { + content: "\f203" +} + +.fa-laugh:before { + content: "\f599" +} + +.fa-laugh-beam:before { + content: "\f59a" +} + +.fa-laugh-squint:before { + content: "\f59b" +} + +.fa-laugh-wink:before { + content: "\f59c" +} + +.fa-layer-group:before { + content: "\f5fd" +} + +.fa-leaf:before { + content: "\f06c" +} + +.fa-leanpub:before { + content: "\f212" +} + +.fa-lemon:before { + content: "\f094" +} + +.fa-less:before { + content: "\f41d" +} + +.fa-less-than:before { + content: "\f536" +} + +.fa-less-than-equal:before { + content: "\f537" +} + +.fa-level-down-alt:before { + content: "\f3be" +} + +.fa-level-up-alt:before { + content: "\f3bf" +} + +.fa-life-ring:before { + content: "\f1cd" +} + +.fa-lightbulb:before { + content: "\f0eb" +} + +.fa-line:before { + content: "\f3c0" +} + +.fa-link:before { + content: "\f0c1" +} + +.fa-linkedin:before { + content: "\f08c" +} + +.fa-linkedin-in:before { + content: "\f0e1" +} + +.fa-linode:before { + content: "\f2b8" +} + +.fa-linux:before { + content: "\f17c" +} + +.fa-lira-sign:before { + content: "\f195" +} + +.fa-list:before { + content: "\f03a" +} + +.fa-list-alt:before { + content: "\f022" +} + +.fa-list-ol:before { + content: "\f0cb" +} + +.fa-list-ul:before { + content: "\f0ca" +} + +.fa-location-arrow:before { + content: "\f124" +} + +.fa-lock:before { + content: "\f023" +} + +.fa-lock-open:before { + content: "\f3c1" +} + +.fa-long-arrow-alt-down:before { + content: "\f309" +} + +.fa-long-arrow-alt-left:before { + content: "\f30a" +} + +.fa-long-arrow-alt-right:before { + content: "\f30b" +} + +.fa-long-arrow-alt-up:before { + content: "\f30c" +} + +.fa-low-vision:before { + content: "\f2a8" +} + +.fa-luggage-cart:before { + content: "\f59d" +} + +.fa-lyft:before { + content: "\f3c3" +} + +.fa-magento:before { + content: "\f3c4" +} + +.fa-magic:before { + content: "\f0d0" +} + +.fa-magnet:before { + content: "\f076" +} + +.fa-mail-bulk:before { + content: "\f674" +} + +.fa-mailchimp:before { + content: "\f59e" +} + +.fa-male:before { + content: "\f183" +} + +.fa-mandalorian:before { + content: "\f50f" +} + +.fa-map:before { + content: "\f279" +} + +.fa-map-marked:before { + content: "\f59f" +} + +.fa-map-marked-alt:before { + content: "\f5a0" +} + +.fa-map-marker:before { + content: "\f041" +} + +.fa-map-marker-alt:before { + content: "\f3c5" +} + +.fa-map-pin:before { + content: "\f276" +} + +.fa-map-signs:before { + content: "\f277" +} + +.fa-markdown:before { + content: "\f60f" +} + +.fa-marker:before { + content: "\f5a1" +} + +.fa-mars:before { + content: "\f222" +} + +.fa-mars-double:before { + content: "\f227" +} + +.fa-mars-stroke:before { + content: "\f229" +} + +.fa-mars-stroke-h:before { + content: "\f22b" +} + +.fa-mars-stroke-v:before { + content: "\f22a" +} + +.fa-mask:before { + content: "\f6fa" +} + +.fa-mastodon:before { + content: "\f4f6" +} + +.fa-maxcdn:before { + content: "\f136" +} + +.fa-medal:before { + content: "\f5a2" +} + +.fa-medapps:before { + content: "\f3c6" +} + +.fa-medium:before { + content: "\f23a" +} + +.fa-medium-m:before { + content: "\f3c7" +} + +.fa-medkit:before { + content: "\f0fa" +} + +.fa-medrt:before { + content: "\f3c8" +} + +.fa-meetup:before { + content: "\f2e0" +} + +.fa-megaport:before { + content: "\f5a3" +} + +.fa-meh:before { + content: "\f11a" +} + +.fa-meh-blank:before { + content: "\f5a4" +} + +.fa-meh-rolling-eyes:before { + content: "\f5a5" +} + +.fa-memory:before { + content: "\f538" +} + +.fa-mendeley:before { + content: "\f7b3" +} + +.fa-menorah:before { + content: "\f676" +} + +.fa-mercury:before { + content: "\f223" +} + +.fa-meteor:before { + content: "\f753" +} + +.fa-microchip:before { + content: "\f2db" +} + +.fa-microphone:before { + content: "\f130" +} + +.fa-microphone-alt:before { + content: "\f3c9" +} + +.fa-microphone-alt-slash:before { + content: "\f539" +} + +.fa-microphone-slash:before { + content: "\f131" +} + +.fa-microscope:before { + content: "\f610" +} + +.fa-microsoft:before { + content: "\f3ca" +} + +.fa-minus:before { + content: "\f068" +} + +.fa-minus-circle:before { + content: "\f056" +} + +.fa-minus-square:before { + content: "\f146" +} + +.fa-mitten:before { + content: "\f7b5" +} + +.fa-mix:before { + content: "\f3cb" +} + +.fa-mixcloud:before { + content: "\f289" +} + +.fa-mizuni:before { + content: "\f3cc" +} + +.fa-mobile:before { + content: "\f10b" +} + +.fa-mobile-alt:before { + content: "\f3cd" +} + +.fa-modx:before { + content: "\f285" +} + +.fa-monero:before { + content: "\f3d0" +} + +.fa-money-bill:before { + content: "\f0d6" +} + +.fa-money-bill-alt:before { + content: "\f3d1" +} + +.fa-money-bill-wave:before { + content: "\f53a" +} + +.fa-money-bill-wave-alt:before { + content: "\f53b" +} + +.fa-money-check:before { + content: "\f53c" +} + +.fa-money-check-alt:before { + content: "\f53d" +} + +.fa-monument:before { + content: "\f5a6" +} + +.fa-moon:before { + content: "\f186" +} + +.fa-mortar-pestle:before { + content: "\f5a7" +} + +.fa-mosque:before { + content: "\f678" +} + +.fa-motorcycle:before { + content: "\f21c" +} + +.fa-mountain:before { + content: "\f6fc" +} + +.fa-mouse-pointer:before { + content: "\f245" +} + +.fa-mug-hot:before { + content: "\f7b6" +} + +.fa-music:before { + content: "\f001" +} + +.fa-napster:before { + content: "\f3d2" +} + +.fa-neos:before { + content: "\f612" +} + +.fa-network-wired:before { + content: "\f6ff" +} + +.fa-neuter:before { + content: "\f22c" +} + +.fa-newspaper:before { + content: "\f1ea" +} + +.fa-nimblr:before { + content: "\f5a8" +} + +.fa-nintendo-switch:before { + content: "\f418" +} + +.fa-node:before { + content: "\f419" +} + +.fa-node-js:before { + content: "\f3d3" +} + +.fa-not-equal:before { + content: "\f53e" +} + +.fa-notes-medical:before { + content: "\f481" +} + +.fa-npm:before { + content: "\f3d4" +} + +.fa-ns8:before { + content: "\f3d5" +} + +.fa-nutritionix:before { + content: "\f3d6" +} + +.fa-object-group:before { + content: "\f247" +} + +.fa-object-ungroup:before { + content: "\f248" +} + +.fa-odnoklassniki:before { + content: "\f263" +} + +.fa-odnoklassniki-square:before { + content: "\f264" +} + +.fa-oil-can:before { + content: "\f613" +} + +.fa-old-republic:before { + content: "\f510" +} + +.fa-om:before { + content: "\f679" +} + +.fa-opencart:before { + content: "\f23d" +} + +.fa-openid:before { + content: "\f19b" +} + +.fa-opera:before { + content: "\f26a" +} + +.fa-optin-monster:before { + content: "\f23c" +} + +.fa-osi:before { + content: "\f41a" +} + +.fa-otter:before { + content: "\f700" +} + +.fa-outdent:before { + content: "\f03b" +} + +.fa-page4:before { + content: "\f3d7" +} + +.fa-pagelines:before { + content: "\f18c" +} + +.fa-pager:before { + content: "\f815" +} + +.fa-paint-brush:before { + content: "\f1fc" +} + +.fa-paint-roller:before { + content: "\f5aa" +} + +.fa-palette:before { + content: "\f53f" +} + +.fa-palfed:before { + content: "\f3d8" +} + +.fa-pallet:before { + content: "\f482" +} + +.fa-paper-plane:before { + content: "\f1d8" +} + +.fa-paperclip:before { + content: "\f0c6" +} + +.fa-parachute-box:before { + content: "\f4cd" +} + +.fa-paragraph:before { + content: "\f1dd" +} + +.fa-parking:before { + content: "\f540" +} + +.fa-passport:before { + content: "\f5ab" +} + +.fa-pastafarianism:before { + content: "\f67b" +} + +.fa-paste:before { + content: "\f0ea" +} + +.fa-patreon:before { + content: "\f3d9" +} + +.fa-pause:before { + content: "\f04c" +} + +.fa-pause-circle:before { + content: "\f28b" +} + +.fa-paw:before { + content: "\f1b0" +} + +.fa-paypal:before { + content: "\f1ed" +} + +.fa-peace:before { + content: "\f67c" +} + +.fa-pen:before { + content: "\f304" +} + +.fa-pen-alt:before { + content: "\f305" +} + +.fa-pen-fancy:before { + content: "\f5ac" +} + +.fa-pen-nib:before { + content: "\f5ad" +} + +.fa-pen-square:before { + content: "\f14b" +} + +.fa-pencil-alt:before { + content: "\f303" +} + +.fa-pencil-ruler:before { + content: "\f5ae" +} + +.fa-penny-arcade:before { + content: "\f704" +} + +.fa-people-carry:before { + content: "\f4ce" +} + +.fa-pepper-hot:before { + content: "\f816" +} + +.fa-percent:before { + content: "\f295" +} + +.fa-percentage:before { + content: "\f541" +} + +.fa-periscope:before { + content: "\f3da" +} + +.fa-person-booth:before { + content: "\f756" +} + +.fa-phabricator:before { + content: "\f3db" +} + +.fa-phoenix-framework:before { + content: "\f3dc" +} + +.fa-phoenix-squadron:before { + content: "\f511" +} + +.fa-phone:before { + content: "\f095" +} + +.fa-phone-slash:before { + content: "\f3dd" +} + +.fa-phone-square:before { + content: "\f098" +} + +.fa-phone-volume:before { + content: "\f2a0" +} + +.fa-php:before { + content: "\f457" +} + +.fa-pied-piper:before { + content: "\f2ae" +} + +.fa-pied-piper-alt:before { + content: "\f1a8" +} + +.fa-pied-piper-hat:before { + content: "\f4e5" +} + +.fa-pied-piper-pp:before { + content: "\f1a7" +} + +.fa-piggy-bank:before { + content: "\f4d3" +} + +.fa-pills:before { + content: "\f484" +} + +.fa-pinterest:before { + content: "\f0d2" +} + +.fa-pinterest-p:before { + content: "\f231" +} + +.fa-pinterest-square:before { + content: "\f0d3" +} + +.fa-pizza-slice:before { + content: "\f818" +} + +.fa-place-of-worship:before { + content: "\f67f" +} + +.fa-plane:before { + content: "\f072" +} + +.fa-plane-arrival:before { + content: "\f5af" +} + +.fa-plane-departure:before { + content: "\f5b0" +} + +.fa-play:before { + content: "\f04b" +} + +.fa-play-circle:before { + content: "\f144" +} + +.fa-playstation:before { + content: "\f3df" +} + +.fa-plug:before { + content: "\f1e6" +} + +.fa-plus:before { + content: "\f067" +} + +.fa-plus-circle:before { + content: "\f055" +} + +.fa-plus-square:before { + content: "\f0fe" +} + +.fa-podcast:before { + content: "\f2ce" +} + +.fa-poll:before { + content: "\f681" +} + +.fa-poll-h:before { + content: "\f682" +} + +.fa-poo:before { + content: "\f2fe" +} + +.fa-poo-storm:before { + content: "\f75a" +} + +.fa-poop:before { + content: "\f619" +} + +.fa-portrait:before { + content: "\f3e0" +} + +.fa-pound-sign:before { + content: "\f154" +} + +.fa-power-off:before { + content: "\f011" +} + +.fa-pray:before { + content: "\f683" +} + +.fa-praying-hands:before { + content: "\f684" +} + +.fa-prescription:before { + content: "\f5b1" +} + +.fa-prescription-bottle:before { + content: "\f485" +} + +.fa-prescription-bottle-alt:before { + content: "\f486" +} + +.fa-print:before { + content: "\f02f" +} + +.fa-procedures:before { + content: "\f487" +} + +.fa-product-hunt:before { + content: "\f288" +} + +.fa-project-diagram:before { + content: "\f542" +} + +.fa-pushed:before { + content: "\f3e1" +} + +.fa-puzzle-piece:before { + content: "\f12e" +} + +.fa-python:before { + content: "\f3e2" +} + +.fa-qq:before { + content: "\f1d6" +} + +.fa-qrcode:before { + content: "\f029" +} + +.fa-question:before { + content: "\f128" +} + +.fa-question-circle:before { + content: "\f059" +} + +.fa-quidditch:before { + content: "\f458" +} + +.fa-quinscape:before { + content: "\f459" +} + +.fa-quora:before { + content: "\f2c4" +} + +.fa-quote-left:before { + content: "\f10d" +} + +.fa-quote-right:before { + content: "\f10e" +} + +.fa-quran:before { + content: "\f687" +} + +.fa-r-project:before { + content: "\f4f7" +} + +.fa-radiation:before { + content: "\f7b9" +} + +.fa-radiation-alt:before { + content: "\f7ba" +} + +.fa-rainbow:before { + content: "\f75b" +} + +.fa-random:before { + content: "\f074" +} + +.fa-raspberry-pi:before { + content: "\f7bb" +} + +.fa-ravelry:before { + content: "\f2d9" +} + +.fa-react:before { + content: "\f41b" +} + +.fa-reacteurope:before { + content: "\f75d" +} + +.fa-readme:before { + content: "\f4d5" +} + +.fa-rebel:before { + content: "\f1d0" +} + +.fa-receipt:before { + content: "\f543" +} + +.fa-recycle:before { + content: "\f1b8" +} + +.fa-red-river:before { + content: "\f3e3" +} + +.fa-reddit:before { + content: "\f1a1" +} + +.fa-reddit-alien:before { + content: "\f281" +} + +.fa-reddit-square:before { + content: "\f1a2" +} + +.fa-redhat:before { + content: "\f7bc" +} + +.fa-redo:before { + content: "\f01e" +} + +.fa-redo-alt:before { + content: "\f2f9" +} + +.fa-registered:before { + content: "\f25d" +} + +.fa-renren:before { + content: "\f18b" +} + +.fa-reply:before { + content: "\f3e5" +} + +.fa-reply-all:before { + content: "\f122" +} + +.fa-replyd:before { + content: "\f3e6" +} + +.fa-republican:before { + content: "\f75e" +} + +.fa-researchgate:before { + content: "\f4f8" +} + +.fa-resolving:before { + content: "\f3e7" +} + +.fa-restroom:before { + content: "\f7bd" +} + +.fa-retweet:before { + content: "\f079" +} + +.fa-rev:before { + content: "\f5b2" +} + +.fa-ribbon:before { + content: "\f4d6" +} + +.fa-ring:before { + content: "\f70b" +} + +.fa-road:before { + content: "\f018" +} + +.fa-robot:before { + content: "\f544" +} + +.fa-rocket:before { + content: "\f135" +} + +.fa-rocketchat:before { + content: "\f3e8" +} + +.fa-rockrms:before { + content: "\f3e9" +} + +.fa-route:before { + content: "\f4d7" +} + +.fa-rss:before { + content: "\f09e" +} + +.fa-rss-square:before { + content: "\f143" +} + +.fa-ruble-sign:before { + content: "\f158" +} + +.fa-ruler:before { + content: "\f545" +} + +.fa-ruler-combined:before { + content: "\f546" +} + +.fa-ruler-horizontal:before { + content: "\f547" +} + +.fa-ruler-vertical:before { + content: "\f548" +} + +.fa-running:before { + content: "\f70c" +} + +.fa-rupee-sign:before { + content: "\f156" +} + +.fa-sad-cry:before { + content: "\f5b3" +} + +.fa-sad-tear:before { + content: "\f5b4" +} + +.fa-safari:before { + content: "\f267" +} + +.fa-salesforce:before { + content: "\f83b" +} + +.fa-sass:before { + content: "\f41e" +} + +.fa-satellite:before { + content: "\f7bf" +} + +.fa-satellite-dish:before { + content: "\f7c0" +} + +.fa-save:before { + content: "\f0c7" +} + +.fa-schlix:before { + content: "\f3ea" +} + +.fa-school:before { + content: "\f549" +} + +.fa-screwdriver:before { + content: "\f54a" +} + +.fa-scribd:before { + content: "\f28a" +} + +.fa-scroll:before { + content: "\f70e" +} + +.fa-sd-card:before { + content: "\f7c2" +} + +.fa-search:before { + content: "\f002" +} + +.fa-search-dollar:before { + content: "\f688" +} + +.fa-search-location:before { + content: "\f689" +} + +.fa-search-minus:before { + content: "\f010" +} + +.fa-search-plus:before { + content: "\f00e" +} + +.fa-searchengin:before { + content: "\f3eb" +} + +.fa-seedling:before { + content: "\f4d8" +} + +.fa-sellcast:before { + content: "\f2da" +} + +.fa-sellsy:before { + content: "\f213" +} + +.fa-server:before { + content: "\f233" +} + +.fa-servicestack:before { + content: "\f3ec" +} + +.fa-shapes:before { + content: "\f61f" +} + +.fa-share:before { + content: "\f064" +} + +.fa-share-alt:before { + content: "\f1e0" +} + +.fa-share-alt-square:before { + content: "\f1e1" +} + +.fa-share-square:before { + content: "\f14d" +} + +.fa-shekel-sign:before { + content: "\f20b" +} + +.fa-shield-alt:before { + content: "\f3ed" +} + +.fa-ship:before { + content: "\f21a" +} + +.fa-shipping-fast:before { + content: "\f48b" +} + +.fa-shirtsinbulk:before { + content: "\f214" +} + +.fa-shoe-prints:before { + content: "\f54b" +} + +.fa-shopping-bag:before { + content: "\f290" +} + +.fa-shopping-basket:before { + content: "\f291" +} + +.fa-shopping-cart:before { + content: "\f07a" +} + +.fa-shopware:before { + content: "\f5b5" +} + +.fa-shower:before { + content: "\f2cc" +} + +.fa-shuttle-van:before { + content: "\f5b6" +} + +.fa-sign:before { + content: "\f4d9" +} + +.fa-sign-in-alt:before { + content: "\f2f6" +} + +.fa-sign-language:before { + content: "\f2a7" +} + +.fa-sign-out-alt:before { + content: "\f2f5" +} + +.fa-signal:before { + content: "\f012" +} + +.fa-signature:before { + content: "\f5b7" +} + +.fa-sim-card:before { + content: "\f7c4" +} + +.fa-simplybuilt:before { + content: "\f215" +} + +.fa-sistrix:before { + content: "\f3ee" +} + +.fa-sitemap:before { + content: "\f0e8" +} + +.fa-sith:before { + content: "\f512" +} + +.fa-skating:before { + content: "\f7c5" +} + +.fa-sketch:before { + content: "\f7c6" +} + +.fa-skiing:before { + content: "\f7c9" +} + +.fa-skiing-nordic:before { + content: "\f7ca" +} + +.fa-skull:before { + content: "\f54c" +} + +.fa-skull-crossbones:before { + content: "\f714" +} + +.fa-skyatlas:before { + content: "\f216" +} + +.fa-skype:before { + content: "\f17e" +} + +.fa-slack:before { + content: "\f198" +} + +.fa-slack-hash:before { + content: "\f3ef" +} + +.fa-slash:before { + content: "\f715" +} + +.fa-sleigh:before { + content: "\f7cc" +} + +.fa-sliders-h:before { + content: "\f1de" +} + +.fa-slideshare:before { + content: "\f1e7" +} + +.fa-smile:before { + content: "\f118" +} + +.fa-smile-beam:before { + content: "\f5b8" +} + +.fa-smile-wink:before { + content: "\f4da" +} + +.fa-smog:before { + content: "\f75f" +} + +.fa-smoking:before { + content: "\f48d" +} + +.fa-smoking-ban:before { + content: "\f54d" +} + +.fa-sms:before { + content: "\f7cd" +} + +.fa-snapchat:before { + content: "\f2ab" +} + +.fa-snapchat-ghost:before { + content: "\f2ac" +} + +.fa-snapchat-square:before { + content: "\f2ad" +} + +.fa-snowboarding:before { + content: "\f7ce" +} + +.fa-snowflake:before { + content: "\f2dc" +} + +.fa-snowman:before { + content: "\f7d0" +} + +.fa-snowplow:before { + content: "\f7d2" +} + +.fa-socks:before { + content: "\f696" +} + +.fa-solar-panel:before { + content: "\f5ba" +} + +.fa-sort:before { + content: "\f0dc" +} + +.fa-sort-alpha-down:before { + content: "\f15d" +} + +.fa-sort-alpha-up:before { + content: "\f15e" +} + +.fa-sort-amount-down:before { + content: "\f160" +} + +.fa-sort-amount-up:before { + content: "\f161" +} + +.fa-sort-down:before { + content: "\f0dd" +} + +.fa-sort-numeric-down:before { + content: "\f162" +} + +.fa-sort-numeric-up:before { + content: "\f163" +} + +.fa-sort-up:before { + content: "\f0de" +} + +.fa-soundcloud:before { + content: "\f1be" +} + +.fa-sourcetree:before { + content: "\f7d3" +} + +.fa-spa:before { + content: "\f5bb" +} + +.fa-space-shuttle:before { + content: "\f197" +} + +.fa-speakap:before { + content: "\f3f3" +} + +.fa-speaker-deck:before { + content: "\f83c" +} + +.fa-spider:before { + content: "\f717" +} + +.fa-spinner:before { + content: "\f110" +} + +.fa-splotch:before { + content: "\f5bc" +} + +.fa-spotify:before { + content: "\f1bc" +} + +.fa-spray-can:before { + content: "\f5bd" +} + +.fa-square:before { + content: "\f0c8" +} + +.fa-square-full:before { + content: "\f45c" +} + +.fa-square-root-alt:before { + content: "\f698" +} + +.fa-squarespace:before { + content: "\f5be" +} + +.fa-stack-exchange:before { + content: "\f18d" +} + +.fa-stack-overflow:before { + content: "\f16c" +} + +.fa-stackpath:before { + content: "\f842" +} + +.fa-stamp:before { + content: "\f5bf" +} + +.fa-star:before { + content: "\f005" +} + +.fa-star-and-crescent:before { + content: "\f699" +} + +.fa-star-half:before { + content: "\f089" +} + +.fa-star-half-alt:before { + content: "\f5c0" +} + +.fa-star-of-david:before { + content: "\f69a" +} + +.fa-star-of-life:before { + content: "\f621" +} + +.fa-staylinked:before { + content: "\f3f5" +} + +.fa-steam:before { + content: "\f1b6" +} + +.fa-steam-square:before { + content: "\f1b7" +} + +.fa-steam-symbol:before { + content: "\f3f6" +} + +.fa-step-backward:before { + content: "\f048" +} + +.fa-step-forward:before { + content: "\f051" +} + +.fa-stethoscope:before { + content: "\f0f1" +} + +.fa-sticker-mule:before { + content: "\f3f7" +} + +.fa-sticky-note:before { + content: "\f249" +} + +.fa-stop:before { + content: "\f04d" +} + +.fa-stop-circle:before { + content: "\f28d" +} + +.fa-stopwatch:before { + content: "\f2f2" +} + +.fa-store:before { + content: "\f54e" +} + +.fa-store-alt:before { + content: "\f54f" +} + +.fa-strava:before { + content: "\f428" +} + +.fa-stream:before { + content: "\f550" +} + +.fa-street-view:before { + content: "\f21d" +} + +.fa-strikethrough:before { + content: "\f0cc" +} + +.fa-stripe:before { + content: "\f429" +} + +.fa-stripe-s:before { + content: "\f42a" +} + +.fa-stroopwafel:before { + content: "\f551" +} + +.fa-studiovinari:before { + content: "\f3f8" +} + +.fa-stumbleupon:before { + content: "\f1a4" +} + +.fa-stumbleupon-circle:before { + content: "\f1a3" +} + +.fa-subscript:before { + content: "\f12c" +} + +.fa-subway:before { + content: "\f239" +} + +.fa-suitcase:before { + content: "\f0f2" +} + +.fa-suitcase-rolling:before { + content: "\f5c1" +} + +.fa-sun:before { + content: "\f185" +} + +.fa-superpowers:before { + content: "\f2dd" +} + +.fa-superscript:before { + content: "\f12b" +} + +.fa-supple:before { + content: "\f3f9" +} + +.fa-surprise:before { + content: "\f5c2" +} + +.fa-suse:before { + content: "\f7d6" +} + +.fa-swatchbook:before { + content: "\f5c3" +} + +.fa-swimmer:before { + content: "\f5c4" +} + +.fa-swimming-pool:before { + content: "\f5c5" +} + +.fa-symfony:before { + content: "\f83d" +} + +.fa-synagogue:before { + content: "\f69b" +} + +.fa-sync:before { + content: "\f021" +} + +.fa-sync-alt:before { + content: "\f2f1" +} + +.fa-syringe:before { + content: "\f48e" +} + +.fa-table:before { + content: "\f0ce" +} + +.fa-table-tennis:before { + content: "\f45d" +} + +.fa-tablet:before { + content: "\f10a" +} + +.fa-tablet-alt:before { + content: "\f3fa" +} + +.fa-tablets:before { + content: "\f490" +} + +.fa-tachometer-alt:before { + content: "\f3fd" +} + +.fa-tag:before { + content: "\f02b" +} + +.fa-tags:before { + content: "\f02c" +} + +.fa-tape:before { + content: "\f4db" +} + +.fa-tasks:before { + content: "\f0ae" +} + +.fa-taxi:before { + content: "\f1ba" +} + +.fa-teamspeak:before { + content: "\f4f9" +} + +.fa-teeth:before { + content: "\f62e" +} + +.fa-teeth-open:before { + content: "\f62f" +} + +.fa-telegram:before { + content: "\f2c6" +} + +.fa-telegram-plane:before { + content: "\f3fe" +} + +.fa-temperature-high:before { + content: "\f769" +} + +.fa-temperature-low:before { + content: "\f76b" +} + +.fa-tencent-weibo:before { + content: "\f1d5" +} + +.fa-tenge:before { + content: "\f7d7" +} + +.fa-terminal:before { + content: "\f120" +} + +.fa-text-height:before { + content: "\f034" +} + +.fa-text-width:before { + content: "\f035" +} + +.fa-th:before { + content: "\f00a" +} + +.fa-th-large:before { + content: "\f009" +} + +.fa-th-list:before { + content: "\f00b" +} + +.fa-the-red-yeti:before { + content: "\f69d" +} + +.fa-theater-masks:before { + content: "\f630" +} + +.fa-themeco:before { + content: "\f5c6" +} + +.fa-themeisle:before { + content: "\f2b2" +} + +.fa-thermometer:before { + content: "\f491" +} + +.fa-thermometer-empty:before { + content: "\f2cb" +} + +.fa-thermometer-full:before { + content: "\f2c7" +} + +.fa-thermometer-half:before { + content: "\f2c9" +} + +.fa-thermometer-quarter:before { + content: "\f2ca" +} + +.fa-thermometer-three-quarters:before { + content: "\f2c8" +} + +.fa-think-peaks:before { + content: "\f731" +} + +.fa-thumbs-down:before { + content: "\f165" +} + +.fa-thumbs-up:before { + content: "\f164" +} + +.fa-thumbtack:before { + content: "\f08d" +} + +.fa-ticket-alt:before { + content: "\f3ff" +} + +.fa-times:before { + content: "\f00d" +} + +.fa-times-circle:before { + content: "\f057" +} + +.fa-tint:before { + content: "\f043" +} + +.fa-tint-slash:before { + content: "\f5c7" +} + +.fa-tired:before { + content: "\f5c8" +} + +.fa-toggle-off:before { + content: "\f204" +} + +.fa-toggle-on:before { + content: "\f205" +} + +.fa-toilet:before { + content: "\f7d8" +} + +.fa-toilet-paper:before { + content: "\f71e" +} + +.fa-toolbox:before { + content: "\f552" +} + +.fa-tools:before { + content: "\f7d9" +} + +.fa-tooth:before { + content: "\f5c9" +} + +.fa-torah:before { + content: "\f6a0" +} + +.fa-torii-gate:before { + content: "\f6a1" +} + +.fa-tractor:before { + content: "\f722" +} + +.fa-trade-federation:before { + content: "\f513" +} + +.fa-trademark:before { + content: "\f25c" +} + +.fa-traffic-light:before { + content: "\f637" +} + +.fa-train:before { + content: "\f238" +} + +.fa-tram:before { + content: "\f7da" +} + +.fa-transgender:before { + content: "\f224" +} + +.fa-transgender-alt:before { + content: "\f225" +} + +.fa-trash:before { + content: "\f1f8" +} + +.fa-trash-alt:before { + content: "\f2ed" +} + +.fa-trash-restore:before { + content: "\f829" +} + +.fa-trash-restore-alt:before { + content: "\f82a" +} + +.fa-tree:before { + content: "\f1bb" +} + +.fa-trello:before { + content: "\f181" +} + +.fa-tripadvisor:before { + content: "\f262" +} + +.fa-trophy:before { + content: "\f091" +} + +.fa-truck:before { + content: "\f0d1" +} + +.fa-truck-loading:before { + content: "\f4de" +} + +.fa-truck-monster:before { + content: "\f63b" +} + +.fa-truck-moving:before { + content: "\f4df" +} + +.fa-truck-pickup:before { + content: "\f63c" +} + +.fa-tshirt:before { + content: "\f553" +} + +.fa-tty:before { + content: "\f1e4" +} + +.fa-tumblr:before { + content: "\f173" +} + +.fa-tumblr-square:before { + content: "\f174" +} + +.fa-tv:before { + content: "\f26c" +} + +.fa-twitch:before { + content: "\f1e8" +} + +.fa-twitter:before { + content: "\f099" +} + +.fa-twitter-square:before { + content: "\f081" +} + +.fa-typo3:before { + content: "\f42b" +} + +.fa-uber:before { + content: "\f402" +} + +.fa-ubuntu:before { + content: "\f7df" +} + +.fa-uikit:before { + content: "\f403" +} + +.fa-umbrella:before { + content: "\f0e9" +} + +.fa-umbrella-beach:before { + content: "\f5ca" +} + +.fa-underline:before { + content: "\f0cd" +} + +.fa-undo:before { + content: "\f0e2" +} + +.fa-undo-alt:before { + content: "\f2ea" +} + +.fa-uniregistry:before { + content: "\f404" +} + +.fa-universal-access:before { + content: "\f29a" +} + +.fa-university:before { + content: "\f19c" +} + +.fa-unlink:before { + content: "\f127" +} + +.fa-unlock:before { + content: "\f09c" +} + +.fa-unlock-alt:before { + content: "\f13e" +} + +.fa-untappd:before { + content: "\f405" +} + +.fa-upload:before { + content: "\f093" +} + +.fa-ups:before { + content: "\f7e0" +} + +.fa-usb:before { + content: "\f287" +} + +.fa-user:before { + content: "\f007" +} + +.fa-user-alt:before { + content: "\f406" +} + +.fa-user-alt-slash:before { + content: "\f4fa" +} + +.fa-user-astronaut:before { + content: "\f4fb" +} + +.fa-user-check:before { + content: "\f4fc" +} + +.fa-user-circle:before { + content: "\f2bd" +} + +.fa-user-clock:before { + content: "\f4fd" +} + +.fa-user-cog:before { + content: "\f4fe" +} + +.fa-user-edit:before { + content: "\f4ff" +} + +.fa-user-friends:before { + content: "\f500" +} + +.fa-user-graduate:before { + content: "\f501" +} + +.fa-user-injured:before { + content: "\f728" +} + +.fa-user-lock:before { + content: "\f502" +} + +.fa-user-md:before { + content: "\f0f0" +} + +.fa-user-minus:before { + content: "\f503" +} + +.fa-user-ninja:before { + content: "\f504" +} + +.fa-user-nurse:before { + content: "\f82f" +} + +.fa-user-plus:before { + content: "\f234" +} + +.fa-user-secret:before { + content: "\f21b" +} + +.fa-user-shield:before { + content: "\f505" +} + +.fa-user-slash:before { + content: "\f506" +} + +.fa-user-tag:before { + content: "\f507" +} + +.fa-user-tie:before { + content: "\f508" +} + +.fa-user-times:before { + content: "\f235" +} + +.fa-users:before { + content: "\f0c0" +} + +.fa-users-cog:before { + content: "\f509" +} + +.fa-usps:before { + content: "\f7e1" +} + +.fa-ussunnah:before { + content: "\f407" +} + +.fa-utensil-spoon:before { + content: "\f2e5" +} + +.fa-utensils:before { + content: "\f2e7" +} + +.fa-vaadin:before { + content: "\f408" +} + +.fa-vector-square:before { + content: "\f5cb" +} + +.fa-venus:before { + content: "\f221" +} + +.fa-venus-double:before { + content: "\f226" +} + +.fa-venus-mars:before { + content: "\f228" +} + +.fa-viacoin:before { + content: "\f237" +} + +.fa-viadeo:before { + content: "\f2a9" +} + +.fa-viadeo-square:before { + content: "\f2aa" +} + +.fa-vial:before { + content: "\f492" +} + +.fa-vials:before { + content: "\f493" +} + +.fa-viber:before { + content: "\f409" +} + +.fa-video:before { + content: "\f03d" +} + +.fa-video-slash:before { + content: "\f4e2" +} + +.fa-vihara:before { + content: "\f6a7" +} + +.fa-vimeo:before { + content: "\f40a" +} + +.fa-vimeo-square:before { + content: "\f194" +} + +.fa-vimeo-v:before { + content: "\f27d" +} + +.fa-vine:before { + content: "\f1ca" +} + +.fa-vk:before { + content: "\f189" +} + +.fa-vnv:before { + content: "\f40b" +} + +.fa-volleyball-ball:before { + content: "\f45f" +} + +.fa-volume-down:before { + content: "\f027" +} + +.fa-volume-mute:before { + content: "\f6a9" +} + +.fa-volume-off:before { + content: "\f026" +} + +.fa-volume-up:before { + content: "\f028" +} + +.fa-vote-yea:before { + content: "\f772" +} + +.fa-vr-cardboard:before { + content: "\f729" +} + +.fa-vuejs:before { + content: "\f41f" +} + +.fa-walking:before { + content: "\f554" +} + +.fa-wallet:before { + content: "\f555" +} + +.fa-warehouse:before { + content: "\f494" +} + +.fa-water:before { + content: "\f773" +} + +.fa-wave-square:before { + content: "\f83e" +} + +.fa-waze:before { + content: "\f83f" +} + +.fa-weebly:before { + content: "\f5cc" +} + +.fa-weibo:before { + content: "\f18a" +} + +.fa-weight:before { + content: "\f496" +} + +.fa-weight-hanging:before { + content: "\f5cd" +} + +.fa-weixin:before { + content: "\f1d7" +} + +.fa-whatsapp:before { + content: "\f232" +} + +.fa-whatsapp-square:before { + content: "\f40c" +} + +.fa-wheelchair:before { + content: "\f193" +} + +.fa-whmcs:before { + content: "\f40d" +} + +.fa-wifi:before { + content: "\f1eb" +} + +.fa-wikipedia-w:before { + content: "\f266" +} + +.fa-wind:before { + content: "\f72e" +} + +.fa-window-close:before { + content: "\f410" +} + +.fa-window-maximize:before { + content: "\f2d0" +} + +.fa-window-minimize:before { + content: "\f2d1" +} + +.fa-window-restore:before { + content: "\f2d2" +} + +.fa-windows:before { + content: "\f17a" +} + +.fa-wine-bottle:before { + content: "\f72f" +} + +.fa-wine-glass:before { + content: "\f4e3" +} + +.fa-wine-glass-alt:before { + content: "\f5ce" +} + +.fa-wix:before { + content: "\f5cf" +} + +.fa-wizards-of-the-coast:before { + content: "\f730" +} + +.fa-wolf-pack-battalion:before { + content: "\f514" +} + +.fa-won-sign:before { + content: "\f159" +} + +.fa-wordpress:before { + content: "\f19a" +} + +.fa-wordpress-simple:before { + content: "\f411" +} + +.fa-wpbeginner:before { + content: "\f297" +} + +.fa-wpexplorer:before { + content: "\f2de" +} + +.fa-wpforms:before { + content: "\f298" +} + +.fa-wpressr:before { + content: "\f3e4" +} + +.fa-wrench:before { + content: "\f0ad" +} + +.fa-x-ray:before { + content: "\f497" +} + +.fa-xbox:before { + content: "\f412" +} + +.fa-xing:before { + content: "\f168" +} + +.fa-xing-square:before { + content: "\f169" +} + +.fa-y-combinator:before { + content: "\f23b" +} + +.fa-yahoo:before { + content: "\f19e" +} + +.fa-yammer:before { + content: "\f840" +} + +.fa-yandex:before { + content: "\f413" +} + +.fa-yandex-international:before { + content: "\f414" +} + +.fa-yarn:before { + content: "\f7e3" +} + +.fa-yelp:before { + content: "\f1e9" +} + +.fa-yen-sign:before { + content: "\f157" +} + +.fa-yin-yang:before { + content: "\f6ad" +} + +.fa-yoast:before { + content: "\f2b1" +} + +.fa-youtube:before { + content: "\f167" +} + +.fa-youtube-square:before { + content: "\f431" +} + +.fa-zhihu:before { + content: "\f63f" +} + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto +} + +@font-face { + font-family: "Font Awesome 5 Brands"; + font-style: normal; + font-weight: normal; + font-display: auto; + src: url(../webfonts/fa-brands-400.eot); + src: url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"), url(../webfonts/fa-brands-400.woff2) format("woff2"), url(../webfonts/fa-brands-400.woff) format("woff"), url(../webfonts/fa-brands-400.ttf) format("truetype"), url(../webfonts/fa-brands-400.svg#fontawesome) format("svg") +} + +.fab { + font-family: "Font Awesome 5 Brands" +} + +@font-face { + font-family: "Font Awesome 5 Free"; + font-style: normal; + font-weight: 400; + font-display: auto; + src: url(../webfonts/fa-regular-400.eot); + src: url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"), url(../webfonts/fa-regular-400.woff2) format("woff2"), url(../webfonts/fa-regular-400.woff) format("woff"), url(../webfonts/fa-regular-400.ttf) format("truetype"), url(../webfonts/fa-regular-400.svg#fontawesome) format("svg") +} + +.far { + font-weight: 400 +} + +@font-face { + font-family: "Font Awesome 5 Free"; + font-style: normal; + font-weight: 900; + font-display: auto; + src: url(../webfonts/fa-solid-900.eot); + /*src: url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"), url(../webfonts/fa-solid-900.woff2) format("woff2"), url(../webfonts/fa-solid-900.woff) format("woff"), url(../webfonts/fa-solid-900.ttf) format("truetype"), url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")*/ +} + +.fa, .far, .fas { + font-family: "Font Awesome 5 Free" +} + +.fa, .fas { + font-weight: 900 +} \ No newline at end of file diff --git a/src/main/resources/static/css/bootstrap-icons.css b/src/main/resources/static/css/bootstrap-icons.css new file mode 100644 index 0000000..5712315 --- /dev/null +++ b/src/main/resources/static/css/bootstrap-icons.css @@ -0,0 +1,1704 @@ +@font-face { + font-family: "bootstrap-icons"; + src: url("./fonts/bootstrap-icons.woff2?524846017b983fc8ded9325d94ed40f3") format("woff2"), +url("./fonts/bootstrap-icons.woff?524846017b983fc8ded9325d94ed40f3") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-1::before { content: "\f2a5"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-1::before { content: "\f68a"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-1::before { content: "\f68d"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-1::before { content: "\f690"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-1::before { content: "\f695"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-1::before { content: "\f698"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-mortorboard-fill::before { content: "\f6a2"; } +.bi-mortorboard::before { content: "\f6a3"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-1::before { content: "\f6b6"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash-1::before { content: "\f6c2"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport-1::before { content: "\f6e0"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-ssd-fill::before { content: "\f6ed"; } +.bi-ssd::before { content: "\f6ee"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt-1::before { content: "\f759"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls-1::before { content: "\f769"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } diff --git a/src/main/resources/static/css/bootstrap.min.css b/src/main/resources/static/css/bootstrap.min.css new file mode 100644 index 0000000..9b4c477 --- /dev/null +++ b/src/main/resources/static/css/bootstrap.min.css @@ -0,0 +1,11649 @@ +@charset "UTF-8"; +/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --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-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-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg-rgb: 255, 255, 255; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", 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-bg: #fff +} + +*, ::after, ::before { + 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: transparent +} + +hr { + margin: 1rem 0; + color: inherit; + background-color: currentColor; + border: 0; + opacity: .25 +} + +hr:not([size]) { + height: 1px +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: .5rem; + font-weight: 500; + line-height: 1.2 +} + +.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 + .9vw) +} + +@media (min-width: 1200px) { + .h2, h2 { + font-size: 2rem + } +} + +.h3, h3 { + font-size: calc(1.3rem + .6vw) +} + +@media (min-width: 1200px) { + .h3, h3 { + font-size: 1.75rem + } +} + +.h4, h4 { + font-size: calc(1.275rem + .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[data-bs-original-title], abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit +} + +ol, ul { + padding-left: 2rem +} + +dl, ol, ul { + margin-top: 0; + margin-bottom: 1rem +} + +ol ol, ol ul, ul ol, ul ul { + margin-bottom: 0 +} + +dt { + font-weight: 700 +} + +dd { + margin-bottom: .5rem; + margin-left: 0 +} + +blockquote { + margin: 0 0 1rem +} + +b, strong { + font-weight: bolder +} + +.small, small { + font-size: .875em +} + +.mark, mark { + padding: .2em; + background-color: #fcf8e3 +} + +sub, sup { + position: relative; + font-size: .75em; + line-height: 0; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +a { + color: #0d6efd; + text-decoration: underline +} + +a:hover { + color: #0a58ca +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none +} + +code, kbd, pre, samp { + font-family: var(--bs-font-monospace); + font-size: 1em; + direction: ltr; + unicode-bidi: bidi-override +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: .875em +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal +} + +code { + font-size: .875em; + color: #d63384; + word-wrap: break-word +} + +a > code { + color: inherit +} + +kbd { + padding: .2rem .4rem; + font-size: .875em; + color: #fff; + background-color: #212529; + border-radius: .2rem +} + +kbd kbd { + padding: 0; + font-size: 1em; + font-weight: 700 +} + +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: #6c757d; + text-align: left +} + +th { + text-align: inherit; + text-align: -webkit-match-parent +} + +tbody, td, tfoot, th, thead, tr { + border-color: inherit; + border-style: solid; + border-width: 0 +} + +label { + display: inline-block +} + +button { + border-radius: 0 +} + +button:focus:not(:focus-visible) { + outline: 0 +} + +button, input, optgroup, select, 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]::-webkit-calendar-picker-indicator { + display: none +} + +[type=button], [type=reset], [type=submit], button { + -webkit-appearance: button +} + +[type=button]:not(:disabled), [type=reset]:not(:disabled), [type=submit]:not(:disabled), button:not(:disabled) { + cursor: pointer +} + +::-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 + .3vw); + line-height: inherit +} + +@media (min-width: 1200px) { + legend { + font-size: 1.5rem + } +} + +legend + * { + clear: left +} + +::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-fields-wrapper, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-text, ::-webkit-datetime-edit-year-field { + padding: 0 +} + +::-webkit-inner-spin-button { + height: auto +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: textfield +} + +::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-color-swatch-wrapper { + padding: 0 +} + +::-webkit-file-upload-button { + font: inherit +} + +::file-selector-button { + font: inherit +} + +::-webkit-file-upload-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: .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: .875em; + color: #6c757d +} + +.blockquote-footer::before { + content: "— " +} + +.img-fluid { + max-width: 100%; + height: auto +} + +.img-thumbnail { + padding: .25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: .25rem; + max-width: 100%; + height: auto +} + +.figure { + display: inline-block +} + +.figure-img { + margin-bottom: .5rem; + line-height: 1 +} + +.figure-caption { + font-size: .875em; + color: #6c757d +} + +.container, .container-fluid, .container-lg, .container-md, .container-sm, .container-xl, .container-xxl { + width: 100%; + padding-right: var(--bs-gutter-x, .75rem); + padding-left: var(--bs-gutter-x, .75rem); + margin-right: auto; + margin-left: auto +} + +@media (min-width: 576px) { + .container, .container-sm { + max-width: 540px + } +} + +@media (min-width: 768px) { + .container, .container-md, .container-sm { + max-width: 720px + } +} + +@media (min-width: 992px) { + .container, .container-lg, .container-md, .container-sm { + max-width: 960px + } +} + +@media (min-width: 1200px) { + .container, .container-lg, .container-md, .container-sm, .container-xl { + max-width: 1140px + } +} + +@media (min-width: 1400px) { + .container, .container-lg, .container-md, .container-sm, .container-xl, .container-xxl { + max-width: 1320px + } +} + +.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(-.5 * var(--bs-gutter-x)); + margin-left: calc(-.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.3333333333% +} + +.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.6666666667% +} + +.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.3333333333% + } + + .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.6666666667% + } + + .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.3333333333% + } + + .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.6666666667% + } + + .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.3333333333% + } + + .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.6666666667% + } + + .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.3333333333% + } + + .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.6666666667% + } + + .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.3333333333% + } + + .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.6666666667% + } + + .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 + } +} + +.table { + --bs-table-bg: transparent; + --bs-table-accent-bg: transparent; + --bs-table-striped-color: #212529; + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: #212529; + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: #212529; + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + color: #212529; + vertical-align: top; + border-color: #dee2e6 +} + +.table > :not(caption) > * > * { + padding: .5rem .5rem; + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg) +} + +.table > tbody { + vertical-align: inherit +} + +.table > thead { + vertical-align: bottom +} + +.table > :not(:first-child) { + border-top: 2px solid currentColor +} + +.caption-top { + caption-side: top +} + +.table-sm > :not(caption) > * > * { + padding: .25rem .25rem +} + +.table-bordered > :not(caption) > * { + border-width: 1px 0 +} + +.table-bordered > :not(caption) > * > * { + border-width: 0 1px +} + +.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-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color) +} + +.table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color) +} + +.table-hover > tbody > tr:hover > * { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color) +} + +.table-primary { + --bs-table-bg: #cfe2ff; + --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: #000; + border-color: #bacbe6 +} + +.table-secondary { + --bs-table-bg: #e2e3e5; + --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: #000; + border-color: #cbccce +} + +.table-success { + --bs-table-bg: #d1e7dd; + --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: #000; + border-color: #bcd0c7 +} + +.table-info { + --bs-table-bg: #cff4fc; + --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: #000; + border-color: #badce3 +} + +.table-warning { + --bs-table-bg: #fff3cd; + --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: #000; + border-color: #e6dbb9 +} + +.table-danger { + --bs-table-bg: #f8d7da; + --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: #000; + border-color: #dfc2c4 +} + +.table-light { + --bs-table-bg: #f8f9fa; + --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: #000; + border-color: #dfe0e1 +} + +.table-dark { + --bs-table-bg: #212529; + --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: #fff; + border-color: #373b3e +} + +.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 + } +} + +.form-label { + margin-bottom: .5rem +} + +.col-form-label { + padding-top: calc(.375rem + 1px); + padding-bottom: calc(.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5 +} + +.col-form-label-lg { + padding-top: calc(.5rem + 1px); + padding-bottom: calc(.5rem + 1px); + font-size: 1.25rem +} + +.col-form-label-sm { + padding-top: calc(.25rem + 1px); + padding-bottom: calc(.25rem + 1px); + font-size: .875rem +} + +.form-text { + margin-top: .25rem; + font-size: .875em; + color: #6c757d +} + +.form-control { + display: block; + width: 100%; + padding: .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: .25rem; + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none + } +} + +.form-control[type=file] { + overflow: hidden +} + +.form-control[type=file]:not(:disabled):not([readonly]) { + cursor: pointer +} + +.form-control:focus { + color: #212529; + background-color: #fff; + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25) +} + +.form-control::-webkit-date-and-time-value { + height: 1.5em +} + +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control::placeholder { + color: #6c757d; + opacity: 1 +} + +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1 +} + +.form-control::-webkit-file-upload-button { + padding: .375rem .75rem; + margin: -.375rem -.75rem; + -webkit-margin-end: .75rem; + margin-inline-end: .75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +.form-control::file-selector-button { + padding: .375rem .75rem; + margin: -.375rem -.75rem; + -webkit-margin-end: .75rem; + margin-inline-end: .75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + 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::-webkit-file-upload-button { + -webkit-transition: none; + transition: none + } + + .form-control::file-selector-button { + transition: none + } +} + +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: #dde0e3 +} + +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #dde0e3 +} + +.form-control::-webkit-file-upload-button { + padding: .375rem .75rem; + margin: -.375rem -.75rem; + -webkit-margin-end: .75rem; + margin-inline-end: .75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none + } +} + +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: #dde0e3 +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: .375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0 +} + +.form-control-plaintext.form-control-lg, .form-control-plaintext.form-control-sm { + padding-right: 0; + padding-left: 0 +} + +.form-control-sm { + min-height: calc(1.5em + .5rem + 2px); + padding: .25rem .5rem; + font-size: .875rem; + border-radius: .2rem +} + +.form-control-sm::-webkit-file-upload-button { + padding: .25rem .5rem; + margin: -.25rem -.5rem; + -webkit-margin-end: .5rem; + margin-inline-end: .5rem +} + +.form-control-sm::file-selector-button { + padding: .25rem .5rem; + margin: -.25rem -.5rem; + -webkit-margin-end: .5rem; + margin-inline-end: .5rem +} + +.form-control-sm::-webkit-file-upload-button { + padding: .25rem .5rem; + margin: -.25rem -.5rem; + -webkit-margin-end: .5rem; + margin-inline-end: .5rem +} + +.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); + padding: .5rem 1rem; + font-size: 1.25rem; + border-radius: .3rem +} + +.form-control-lg::-webkit-file-upload-button { + padding: .5rem 1rem; + margin: -.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem +} + +.form-control-lg::file-selector-button { + padding: .5rem 1rem; + margin: -.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem +} + +.form-control-lg::-webkit-file-upload-button { + padding: .5rem 1rem; + margin: -.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem +} + +textarea.form-control { + min-height: calc(1.5em + .75rem + 2px) +} + +textarea.form-control-sm { + min-height: calc(1.5em + .5rem + 2px) +} + +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + 2px) +} + +.form-control-color { + width: 3rem; + height: auto; + padding: .375rem +} + +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer +} + +.form-control-color::-moz-color-swatch { + height: 1.5em; + border-radius: .25rem +} + +.form-control-color::-webkit-color-swatch { + height: 1.5em; + border-radius: .25rem +} + +.form-select { + display: block; + width: 100%; + padding: .375rem 2.25rem .375rem .75rem; + -moz-padding-start: calc(0.75rem - 3px); + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right .75rem center; + background-size: 16px 12px; + border: 1px solid #ced4da; + border-radius: .25rem; + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +@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: #e9ecef +} + +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #212529 +} + +.form-select-sm { + padding-top: .25rem; + padding-bottom: .25rem; + padding-left: .5rem; + font-size: .875rem; + border-radius: .2rem +} + +.form-select-lg { + padding-top: .5rem; + padding-bottom: .5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: .3rem +} + +.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-input { + width: 1em; + height: 1em; + margin-top: .25em; + vertical-align: top; + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: 1px solid rgba(0, 0, 0, .25); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + 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] { + background-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 10l3 3l6-6'/%3e%3c/svg%3e") +} + +.form-check-input:checked[type=radio] { + background-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; + background-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 { + opacity: .5 +} + +.form-switch { + padding-left: 2.5em +} + +.form-switch .form-check-input { + width: 2em; + margin-left: -2.5em; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + 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 { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e") +} + +.form-switch .form-check-input:checked { + background-position: right center; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e") +} + +.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 +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.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: -.25rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -webkit-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none + } +} + +.form-range::-webkit-slider-thumb:active { + background-color: #b6d4fe +} + +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem +} + +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; + -moz-appearance: none; + appearance: none +} + +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none + } +} + +.form-range::-moz-range-thumb:active { + background-color: #b6d4fe +} + +.form-range::-moz-range-track { + width: 100%; + height: .5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem +} + +.form-range:disabled { + pointer-events: none +} + +.form-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd +} + +.form-range:disabled::-moz-range-thumb { + background-color: #adb5bd +} + +.form-floating { + position: relative +} + +.form-floating > .form-control, .form-floating > .form-select { + height: calc(3.5rem + 2px); + line-height: 1.25 +} + +.form-floating > label { + position: absolute; + top: 0; + left: 0; + height: 100%; + padding: 1rem .75rem; + pointer-events: none; + border: 1px solid transparent; + 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 { + padding: 1rem .75rem +} + +.form-floating > .form-control::-moz-placeholder { + color: transparent +} + +.form-floating > .form-control::placeholder { + color: transparent +} + +.form-floating > .form-control:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: .625rem +} + +.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: .625rem +} + +.form-floating > .form-control:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: .625rem +} + +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: .625rem +} + +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + opacity: .65; + transform: scale(.85) translateY(-.5rem) translateX(.15rem) +} + +.form-floating > .form-control:focus ~ label, .form-floating > .form-control:not(:placeholder-shown) ~ label, .form-floating > .form-select ~ label { + opacity: .65; + transform: scale(.85) translateY(-.5rem) translateX(.15rem) +} + +.form-floating > .form-control:-webkit-autofill ~ label { + opacity: .65; + transform: scale(.85) translateY(-.5rem) translateX(.15rem) +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100% +} + +.input-group > .form-control, .input-group > .form-select { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0 +} + +.input-group > .form-control:focus, .input-group > .form-select:focus { + z-index: 3 +} + +.input-group .btn { + position: relative; + z-index: 2 +} + +.input-group .btn:focus { + z-index: 3 +} + +.input-group-text { + display: flex; + align-items: center; + padding: .375rem .75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: .25rem +} + +.input-group-lg > .btn, .input-group-lg > .form-control, .input-group-lg > .form-select, .input-group-lg > .input-group-text { + padding: .5rem 1rem; + font-size: 1.25rem; + border-radius: .3rem +} + +.input-group-sm > .btn, .input-group-sm > .form-control, .input-group-sm > .form-select, .input-group-sm > .input-group-text { + padding: .25rem .5rem; + font-size: .875rem; + border-radius: .2rem +} + +.input-group-lg > .form-select, .input-group-sm > .form-select { + padding-right: 3rem +} + +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), .input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), .input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu) { + 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: -1px; + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: .25rem; + font-size: .875em; + color: #198754 +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: .25rem .5rem; + margin-top: .1rem; + font-size: .875rem; + color: #fff; + background-color: rgba(25, 135, 84, .9); + border-radius: .25rem +} + +.is-valid ~ .valid-feedback, .is-valid ~ .valid-tooltip, .was-validated :valid ~ .valid-feedback, .was-validated :valid ~ .valid-tooltip { + display: block +} + +.form-control.is-valid, .was-validated .form-control:valid { + border-color: #198754; + padding-right: calc(1.5em + .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.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(.375em + .1875rem) center; + background-size: calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-control.is-valid:focus, .was-validated .form-control:valid:focus { + border-color: #198754; + box-shadow: 0 0 0 .25rem rgba(25, 135, 84, .25) +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + .75rem); + background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) +} + +.form-select.is-valid, .was-validated .form-select:valid { + border-color: #198754 +} + +.form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"], .was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e"), 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.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-position: right .75rem center, center right 2.25rem; + background-size: 16px 12px, calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-select.is-valid:focus, .was-validated .form-select:valid:focus { + border-color: #198754; + box-shadow: 0 0 0 .25rem rgba(25, 135, 84, .25) +} + +.form-check-input.is-valid, .was-validated .form-check-input:valid { + border-color: #198754 +} + +.form-check-input.is-valid:checked, .was-validated .form-check-input:valid:checked { + background-color: #198754 +} + +.form-check-input.is-valid:focus, .was-validated .form-check-input:valid:focus { + box-shadow: 0 0 0 .25rem rgba(25, 135, 84, .25) +} + +.form-check-input.is-valid ~ .form-check-label, .was-validated .form-check-input:valid ~ .form-check-label { + color: #198754 +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: .5em +} + +.input-group .form-control.is-valid, .input-group .form-select.is-valid, .was-validated .input-group .form-control:valid, .was-validated .input-group .form-select:valid { + z-index: 1 +} + +.input-group .form-control.is-valid:focus, .input-group .form-select.is-valid:focus, .was-validated .input-group .form-control:valid:focus, .was-validated .input-group .form-select:valid:focus { + z-index: 3 +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: .25rem; + font-size: .875em; + color: #dc3545 +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: .25rem .5rem; + margin-top: .1rem; + font-size: .875rem; + color: #fff; + background-color: rgba(220, 53, 69, .9); + border-radius: .25rem +} + +.is-invalid ~ .invalid-feedback, .is-invalid ~ .invalid-tooltip, .was-validated :invalid ~ .invalid-feedback, .was-validated :invalid ~ .invalid-tooltip { + display: block +} + +.form-control.is-invalid, .was-validated .form-control:invalid { + border-color: #dc3545; + padding-right: calc(1.5em + .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(.375em + .1875rem) center; + background-size: calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-control.is-invalid:focus, .was-validated .form-control:invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 .25rem rgba(220, 53, 69, .25) +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + .75rem); + background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) +} + +.form-select.is-invalid, .was-validated .form-select:invalid { + border-color: #dc3545 +} + +.form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"], .was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e"), 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-position: right .75rem center, center right 2.25rem; + background-size: 16px 12px, calc(.75em + .375rem) calc(.75em + .375rem) +} + +.form-select.is-invalid:focus, .was-validated .form-select:invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 .25rem rgba(220, 53, 69, .25) +} + +.form-check-input.is-invalid, .was-validated .form-check-input:invalid { + border-color: #dc3545 +} + +.form-check-input.is-invalid:checked, .was-validated .form-check-input:invalid:checked { + background-color: #dc3545 +} + +.form-check-input.is-invalid:focus, .was-validated .form-check-input:invalid:focus { + box-shadow: 0 0 0 .25rem rgba(220, 53, 69, .25) +} + +.form-check-input.is-invalid ~ .form-check-label, .was-validated .form-check-input:invalid ~ .form-check-label { + color: #dc3545 +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: .5em +} + +.input-group .form-control.is-invalid, .input-group .form-select.is-invalid, .was-validated .input-group .form-control:invalid, .was-validated .input-group .form-select:invalid { + z-index: 2 +} + +.input-group .form-control.is-invalid:focus, .input-group .form-select.is-invalid:focus, .was-validated .input-group .form-control:invalid:focus, .was-validated .input-group .form-select:invalid:focus { + z-index: 3 +} + +.btn { + display: inline-block; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: .375rem .75rem; + font-size: 1rem; + border-radius: .25rem; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none + } +} + +.btn:hover { + color: #212529 +} + +.btn-check:focus + .btn, .btn:focus { + outline: 0; + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25) +} + +.btn.disabled, .btn:disabled, fieldset:disabled .btn { + pointer-events: none; + opacity: .65 +} + +.btn-primary { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd +} + +.btn-primary:hover { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca +} + +.btn-check:focus + .btn-primary, .btn-primary:focus { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; + box-shadow: 0 0 0 .25rem rgba(49, 132, 253, .5) +} + +.btn-check:active + .btn-primary, .btn-check:checked + .btn-primary, .btn-primary.active, .btn-primary:active, .show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0a58ca; + border-color: #0a53be +} + +.btn-check:active + .btn-primary:focus, .btn-check:checked + .btn-primary:focus, .btn-primary.active:focus, .btn-primary:active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 .25rem rgba(49, 132, 253, .5) +} + +.btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd +} + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d +} + +.btn-secondary:hover { + color: #fff; + background-color: #5c636a; + border-color: #565e64 +} + +.btn-check:focus + .btn-secondary, .btn-secondary:focus { + color: #fff; + background-color: #5c636a; + border-color: #565e64; + box-shadow: 0 0 0 .25rem rgba(130, 138, 145, .5) +} + +.btn-check:active + .btn-secondary, .btn-check:checked + .btn-secondary, .btn-secondary.active, .btn-secondary:active, .show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #565e64; + border-color: #51585e +} + +.btn-check:active + .btn-secondary:focus, .btn-check:checked + .btn-secondary:focus, .btn-secondary.active:focus, .btn-secondary:active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 .25rem rgba(130, 138, 145, .5) +} + +.btn-secondary.disabled, .btn-secondary:disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d +} + +.btn-success { + color: #fff; + background-color: #198754; + border-color: #198754 +} + +.btn-success:hover { + color: #fff; + background-color: #157347; + border-color: #146c43 +} + +.btn-check:focus + .btn-success, .btn-success:focus { + color: #fff; + background-color: #157347; + border-color: #146c43; + box-shadow: 0 0 0 .25rem rgba(60, 153, 110, .5) +} + +.btn-check:active + .btn-success, .btn-check:checked + .btn-success, .btn-success.active, .btn-success:active, .show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #146c43; + border-color: #13653f +} + +.btn-check:active + .btn-success:focus, .btn-check:checked + .btn-success:focus, .btn-success.active:focus, .btn-success:active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 .25rem rgba(60, 153, 110, .5) +} + +.btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #198754; + border-color: #198754 +} + +.btn-info { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0 +} + +.btn-info:hover { + color: #000; + background-color: #31d2f2; + border-color: #25cff2 +} + +.btn-check:focus + .btn-info, .btn-info:focus { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; + box-shadow: 0 0 0 .25rem rgba(11, 172, 204, .5) +} + +.btn-check:active + .btn-info, .btn-check:checked + .btn-info, .btn-info.active, .btn-info:active, .show > .btn-info.dropdown-toggle { + color: #000; + background-color: #3dd5f3; + border-color: #25cff2 +} + +.btn-check:active + .btn-info:focus, .btn-check:checked + .btn-info:focus, .btn-info.active:focus, .btn-info:active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 .25rem rgba(11, 172, 204, .5) +} + +.btn-info.disabled, .btn-info:disabled { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0 +} + +.btn-warning { + color: #000; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-warning:hover { + color: #000; + background-color: #ffca2c; + border-color: #ffc720 +} + +.btn-check:focus + .btn-warning, .btn-warning:focus { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; + box-shadow: 0 0 0 .25rem rgba(217, 164, 6, .5) +} + +.btn-check:active + .btn-warning, .btn-check:checked + .btn-warning, .btn-warning.active, .btn-warning:active, .show > .btn-warning.dropdown-toggle { + color: #000; + background-color: #ffcd39; + border-color: #ffc720 +} + +.btn-check:active + .btn-warning:focus, .btn-check:checked + .btn-warning:focus, .btn-warning.active:focus, .btn-warning:active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 .25rem rgba(217, 164, 6, .5) +} + +.btn-warning.disabled, .btn-warning:disabled { + color: #000; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-danger:hover { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37 +} + +.btn-check:focus + .btn-danger, .btn-danger:focus { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; + box-shadow: 0 0 0 .25rem rgba(225, 83, 97, .5) +} + +.btn-check:active + .btn-danger, .btn-check:checked + .btn-danger, .btn-danger.active, .btn-danger:active, .show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #b02a37; + border-color: #a52834 +} + +.btn-check:active + .btn-danger:focus, .btn-check:checked + .btn-danger:focus, .btn-danger.active:focus, .btn-danger:active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 .25rem rgba(225, 83, 97, .5) +} + +.btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-light { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-light:hover { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb +} + +.btn-check:focus + .btn-light, .btn-light:focus { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; + box-shadow: 0 0 0 .25rem rgba(211, 212, 213, .5) +} + +.btn-check:active + .btn-light, .btn-check:checked + .btn-light, .btn-light.active, .btn-light:active, .show > .btn-light.dropdown-toggle { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb +} + +.btn-check:active + .btn-light:focus, .btn-check:checked + .btn-light:focus, .btn-light.active:focus, .btn-light:active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 .25rem rgba(211, 212, 213, .5) +} + +.btn-light.disabled, .btn-light:disabled { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-dark { + color: #fff; + background-color: #212529; + border-color: #212529 +} + +.btn-dark:hover { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21 +} + +.btn-check:focus + .btn-dark, .btn-dark:focus { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; + box-shadow: 0 0 0 .25rem rgba(66, 70, 73, .5) +} + +.btn-check:active + .btn-dark, .btn-check:checked + .btn-dark, .btn-dark.active, .btn-dark:active, .show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1a1e21; + border-color: #191c1f +} + +.btn-check:active + .btn-dark:focus, .btn-check:checked + .btn-dark:focus, .btn-dark.active:focus, .btn-dark:active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 .25rem rgba(66, 70, 73, .5) +} + +.btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #212529; + border-color: #212529 +} + +.btn-outline-primary { + color: #0d6efd; + border-color: #0d6efd +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd +} + +.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus { + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .5) +} + +.btn-check:active + .btn-outline-primary, .btn-check:checked + .btn-outline-primary, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show, .btn-outline-primary:active { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd +} + +.btn-check:active + .btn-outline-primary:focus, .btn-check:checked + .btn-outline-primary:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus, .btn-outline-primary:active:focus { + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .5) +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #0d6efd; + background-color: transparent +} + +.btn-outline-secondary { + color: #6c757d; + border-color: #6c757d +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d +} + +.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus { + box-shadow: 0 0 0 .25rem rgba(108, 117, 125, .5) +} + +.btn-check:active + .btn-outline-secondary, .btn-check:checked + .btn-outline-secondary, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show, .btn-outline-secondary:active { + color: #fff; + background-color: #6c757d; + border-color: #6c757d +} + +.btn-check:active + .btn-outline-secondary:focus, .btn-check:checked + .btn-outline-secondary:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus, .btn-outline-secondary:active:focus { + box-shadow: 0 0 0 .25rem rgba(108, 117, 125, .5) +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #6c757d; + background-color: transparent +} + +.btn-outline-success { + color: #198754; + border-color: #198754 +} + +.btn-outline-success:hover { + color: #fff; + background-color: #198754; + border-color: #198754 +} + +.btn-check:focus + .btn-outline-success, .btn-outline-success:focus { + box-shadow: 0 0 0 .25rem rgba(25, 135, 84, .5) +} + +.btn-check:active + .btn-outline-success, .btn-check:checked + .btn-outline-success, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show, .btn-outline-success:active { + color: #fff; + background-color: #198754; + border-color: #198754 +} + +.btn-check:active + .btn-outline-success:focus, .btn-check:checked + .btn-outline-success:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus, .btn-outline-success:active:focus { + box-shadow: 0 0 0 .25rem rgba(25, 135, 84, .5) +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #198754; + background-color: transparent +} + +.btn-outline-info { + color: #0dcaf0; + border-color: #0dcaf0 +} + +.btn-outline-info:hover { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0 +} + +.btn-check:focus + .btn-outline-info, .btn-outline-info:focus { + box-shadow: 0 0 0 .25rem rgba(13, 202, 240, .5) +} + +.btn-check:active + .btn-outline-info, .btn-check:checked + .btn-outline-info, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show, .btn-outline-info:active { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0 +} + +.btn-check:active + .btn-outline-info:focus, .btn-check:checked + .btn-outline-info:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus, .btn-outline-info:active:focus { + box-shadow: 0 0 0 .25rem rgba(13, 202, 240, .5) +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #0dcaf0; + background-color: transparent +} + +.btn-outline-warning { + color: #ffc107; + border-color: #ffc107 +} + +.btn-outline-warning:hover { + color: #000; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus { + box-shadow: 0 0 0 .25rem rgba(255, 193, 7, .5) +} + +.btn-check:active + .btn-outline-warning, .btn-check:checked + .btn-outline-warning, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show, .btn-outline-warning:active { + color: #000; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-check:active + .btn-outline-warning:focus, .btn-check:checked + .btn-outline-warning:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus, .btn-outline-warning:active:focus { + box-shadow: 0 0 0 .25rem rgba(255, 193, 7, .5) +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent +} + +.btn-outline-danger { + color: #dc3545; + border-color: #dc3545 +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus { + box-shadow: 0 0 0 .25rem rgba(220, 53, 69, .5) +} + +.btn-check:active + .btn-outline-danger, .btn-check:checked + .btn-outline-danger, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show, .btn-outline-danger:active { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-check:active + .btn-outline-danger:focus, .btn-check:checked + .btn-outline-danger:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus, .btn-outline-danger:active:focus { + box-shadow: 0 0 0 .25rem rgba(220, 53, 69, .5) +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent +} + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-outline-light:hover { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-check:focus + .btn-outline-light, .btn-outline-light:focus { + box-shadow: 0 0 0 .25rem rgba(248, 249, 250, .5) +} + +.btn-check:active + .btn-outline-light, .btn-check:checked + .btn-outline-light, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show, .btn-outline-light:active { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-check:active + .btn-outline-light:focus, .btn-check:checked + .btn-outline-light:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus, .btn-outline-light:active:focus { + box-shadow: 0 0 0 .25rem rgba(248, 249, 250, .5) +} + +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent +} + +.btn-outline-dark { + color: #212529; + border-color: #212529 +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #212529; + border-color: #212529 +} + +.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus { + box-shadow: 0 0 0 .25rem rgba(33, 37, 41, .5) +} + +.btn-check:active + .btn-outline-dark, .btn-check:checked + .btn-outline-dark, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show, .btn-outline-dark:active { + color: #fff; + background-color: #212529; + border-color: #212529 +} + +.btn-check:active + .btn-outline-dark:focus, .btn-check:checked + .btn-outline-dark:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus, .btn-outline-dark:active:focus { + box-shadow: 0 0 0 .25rem rgba(33, 37, 41, .5) +} + +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #212529; + background-color: transparent +} + +.btn-link { + font-weight: 400; + color: #0d6efd; + text-decoration: underline +} + +.btn-link:hover { + color: #0a58ca +} + +.btn-link.disabled, .btn-link:disabled { + color: #6c757d +} + +.btn-group-lg > .btn, .btn-lg { + padding: .5rem 1rem; + font-size: 1.25rem; + border-radius: .3rem +} + +.btn-group-sm > .btn, .btn-sm { + padding: .25rem .5rem; + font-size: .875rem; + border-radius: .2rem +} + +.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 + } +} + +.dropdown, .dropend, .dropstart, .dropup { + 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 transparent; + border-bottom: 0; + border-left: .3em solid transparent +} + +.dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropdown-menu { + position: absolute; + z-index: 1000; + display: none; + min-width: 10rem; + padding: .5rem 0; + margin: 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: .25rem +} + +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: .125rem +} + +.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 + } +} + +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: .125rem +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: ""; + border-top: 0; + border-right: .3em solid transparent; + border-bottom: .3em solid; + border-left: .3em solid transparent +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: .125rem +} + +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: .255em; + vertical-align: .255em; + content: ""; + border-top: .3em solid transparent; + border-right: 0; + border-bottom: .3em solid transparent; + 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: .125rem +} + +.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 transparent; + border-right: .3em solid; + border-bottom: .3em solid transparent +} + +.dropstart .dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropstart .dropdown-toggle::before { + vertical-align: 0 +} + +.dropdown-divider { + height: 0; + margin: .5rem 0; + overflow: hidden; + border-top: 1px solid rgba(0, 0, 0, .15) +} + +.dropdown-item { + display: block; + width: 100%; + padding: .25rem 1rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0 +} + +.dropdown-item:focus, .dropdown-item:hover { + color: #1e2125; + background-color: #e9ecef +} + +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #0d6efd +} + +.dropdown-item.disabled, .dropdown-item:disabled { + color: #adb5bd; + pointer-events: none; + background-color: transparent +} + +.dropdown-menu.show { + display: block +} + +.dropdown-header { + display: block; + padding: .5rem 1rem; + margin-bottom: 0; + font-size: .875rem; + color: #6c757d; + white-space: nowrap +} + +.dropdown-item-text { + display: block; + padding: .25rem 1rem; + color: #212529 +} + +.dropdown-menu-dark { + color: #dee2e6; + background-color: #343a40; + border-color: rgba(0, 0, 0, .15) +} + +.dropdown-menu-dark .dropdown-item { + color: #dee2e6 +} + +.dropdown-menu-dark .dropdown-item:focus, .dropdown-menu-dark .dropdown-item:hover { + color: #fff; + background-color: rgba(255, 255, 255, .15) +} + +.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active { + color: #fff; + background-color: #0d6efd +} + +.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled { + color: #adb5bd +} + +.dropdown-menu-dark .dropdown-divider { + border-color: rgba(0, 0, 0, .15) +} + +.dropdown-menu-dark .dropdown-item-text { + color: #dee2e6 +} + +.dropdown-menu-dark .dropdown-header { + color: #adb5bd +} + +.btn-group, .btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle +} + +.btn-group-vertical > .btn, .btn-group > .btn { + position: relative; + flex: 1 1 auto +} + +.btn-group-vertical > .btn-check:checked + .btn, .btn-group-vertical > .btn-check:focus + .btn, .btn-group-vertical > .btn.active, .btn-group-vertical > .btn:active, .btn-group-vertical > .btn:focus, .btn-group-vertical > .btn:hover, .btn-group > .btn-check:checked + .btn, .btn-group > .btn-check:focus + .btn, .btn-group > .btn.active, .btn-group > .btn:active, .btn-group > .btn:focus, .btn-group > .btn:hover { + z-index: 1 +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start +} + +.btn-toolbar .input-group { + width: auto +} + +.btn-group > .btn-group:not(:first-child), .btn-group > .btn:not(:first-child) { + margin-left: -1px +} + +.btn-group > .btn-group:not(:last-child) > .btn, .btn-group > .btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group > .btn-group:not(:first-child) > .btn, .btn-group > .btn:nth-child(n+3), .btn-group > :not(.btn-check) + .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.dropdown-toggle-split { + padding-right: .5625rem; + padding-left: .5625rem +} + +.dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after { + margin-left: 0 +} + +.dropstart .dropdown-toggle-split::before { + margin-right: 0 +} + +.btn-group-sm > .btn + .dropdown-toggle-split, .btn-sm + .dropdown-toggle-split { + padding-right: .375rem; + padding-left: .375rem +} + +.btn-group-lg > .btn + .dropdown-toggle-split, .btn-lg + .dropdown-toggle-split { + padding-right: .75rem; + padding-left: .75rem +} + +.btn-group-vertical { + 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-group:not(:first-child), .btn-group-vertical > .btn:not(:first-child) { + margin-top: -1px +} + +.btn-group-vertical > .btn-group:not(:last-child) > .btn, .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical > .btn-group:not(:first-child) > .btn, .btn-group-vertical > .btn ~ .btn { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.nav-link { + display: block; + padding: .5rem 1rem; + color: #0d6efd; + text-decoration: none; + 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:focus, .nav-link:hover { + color: #0a58ca +} + +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6 +} + +.nav-tabs .nav-link { + margin-bottom: -1px; + background: 0 0; + border: 1px solid transparent; + border-top-left-radius: .25rem; + border-top-right-radius: .25rem +} + +.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { + border-color: #e9ecef #e9ecef #dee2e6; + isolation: isolate +} + +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent +} + +.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.nav-pills .nav-link { + background: 0 0; + border: 0; + border-radius: .25rem +} + +.nav-pills .nav-link.active, .nav-pills .show > .nav-link { + color: #fff; + background-color: #0d6efd +} + +.nav-fill .nav-item, .nav-fill > .nav-link { + flex: 1 1 auto; + text-align: center +} + +.nav-justified .nav-item, .nav-justified > .nav-link { + 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 { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding-top: .5rem; + padding-bottom: .5rem +} + +.navbar > .container, .navbar > .container-fluid, .navbar > .container-lg, .navbar > .container-md, .navbar > .container-sm, .navbar > .container-xl, .navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between +} + +.navbar-brand { + padding-top: .3125rem; + padding-bottom: .3125rem; + margin-right: 1rem; + font-size: 1.25rem; + text-decoration: none; + white-space: nowrap +} + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0 +} + +.navbar-nav .dropdown-menu { + position: static +} + +.navbar-text { + padding-top: .5rem; + padding-bottom: .5rem +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center +} + +.navbar-toggler { + padding: .25rem .75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: .25rem; + transition: box-shadow .15s ease-in-out +} + +@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 .25rem +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + 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: .5rem; + padding-left: .5rem + } + + .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-header { + display: none + } + + .navbar-expand-sm .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none + } + + .navbar-expand-sm .offcanvas-bottom, .navbar-expand-sm .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0 + } + + .navbar-expand-sm .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: .5rem; + padding-left: .5rem + } + + .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-header { + display: none + } + + .navbar-expand-md .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none + } + + .navbar-expand-md .offcanvas-bottom, .navbar-expand-md .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0 + } + + .navbar-expand-md .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: .5rem; + padding-left: .5rem + } + + .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-header { + display: none + } + + .navbar-expand-lg .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none + } + + .navbar-expand-lg .offcanvas-bottom, .navbar-expand-lg .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0 + } + + .navbar-expand-lg .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: .5rem; + padding-left: .5rem + } + + .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-header { + display: none + } + + .navbar-expand-xl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none + } + + .navbar-expand-xl .offcanvas-bottom, .navbar-expand-xl .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0 + } + + .navbar-expand-xl .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: .5rem; + padding-left: .5rem + } + + .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-header { + display: none + } + + .navbar-expand-xxl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none + } + + .navbar-expand-xxl .offcanvas-bottom, .navbar-expand-xxl .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0 + } + + .navbar-expand-xxl .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: .5rem; + padding-left: .5rem +} + +.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-header { + display: none +} + +.navbar-expand .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + transform: none +} + +.navbar-expand .offcanvas-bottom, .navbar-expand .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0 +} + +.navbar-expand .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, .55) +} + +.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover { + color: rgba(0, 0, 0, .7) +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, .3) +} + +.navbar-light .navbar-nav .nav-link.active, .navbar-light .navbar-nav .show > .nav-link { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, .55); + border-color: rgba(0, 0, 0, .1) +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, .55) +} + +.navbar-light .navbar-text a, .navbar-light .navbar-text a:focus, .navbar-light .navbar-text a:hover { + color: rgba(0, 0, 0, .9) +} + +.navbar-dark .navbar-brand { + color: #fff +} + +.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover { + color: #fff +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, .55) +} + +.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover { + color: rgba(255, 255, 255, .75) +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, .25) +} + +.navbar-dark .navbar-nav .nav-link.active, .navbar-dark .navbar-nav .show > .nav-link { + color: #fff +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, .55); + border-color: rgba(255, 255, 255, .1) +} + +.navbar-dark .navbar-toggler-icon { + background-image: 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") +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, .55) +} + +.navbar-dark .navbar-text a, .navbar-dark .navbar-text a:focus, .navbar-dark .navbar-text a:hover { + color: #fff +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, .125); + border-radius: .25rem +} + +.card > hr { + margin-right: 0; + margin-left: 0 +} + +.card > .list-group { + border-top: inherit; + border-bottom: inherit +} + +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(.25rem - 1px); + border-top-right-radius: calc(.25rem - 1px) +} + +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(.25rem - 1px); + border-bottom-left-radius: calc(.25rem - 1px) +} + +.card > .card-header + .list-group, .card > .list-group + .card-footer { + border-top: 0 +} + +.card-body { + flex: 1 1 auto; + padding: 1rem 1rem +} + +.card-title { + margin-bottom: .5rem +} + +.card-subtitle { + margin-top: -.25rem; + margin-bottom: 0 +} + +.card-text:last-child { + margin-bottom: 0 +} + +.card-link + .card-link { + margin-left: 1rem +} + +.card-header { + padding: .5rem 1rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, .03); + border-bottom: 1px solid rgba(0, 0, 0, .125) +} + +.card-header:first-child { + border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0 +} + +.card-footer { + padding: .5rem 1rem; + background-color: rgba(0, 0, 0, .03); + border-top: 1px solid rgba(0, 0, 0, .125) +} + +.card-footer:last-child { + border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px) +} + +.card-header-tabs { + margin-right: -.5rem; + margin-bottom: -.5rem; + margin-left: -.5rem; + border-bottom: 0 +} + +.card-header-pills { + margin-right: -.5rem; + margin-left: -.5rem +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1rem; + border-radius: calc(.25rem - 1px) +} + +.card-img, .card-img-bottom, .card-img-top { + width: 100% +} + +.card-img, .card-img-top { + border-top-left-radius: calc(.25rem - 1px); + border-top-right-radius: calc(.25rem - 1px) +} + +.card-img, .card-img-bottom { + border-bottom-right-radius: calc(.25rem - 1px); + border-bottom-left-radius: calc(.25rem - 1px) +} + +.card-group > .card { + margin-bottom: .75rem +} + +@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-header, .card-group > .card:not(:last-child) .card-img-top { + border-top-right-radius: 0 + } + + .card-group > .card:not(:last-child) .card-footer, .card-group > .card:not(:last-child) .card-img-bottom { + border-bottom-right-radius: 0 + } + + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 + } + + .card-group > .card:not(:first-child) .card-header, .card-group > .card:not(:first-child) .card-img-top { + border-top-left-radius: 0 + } + + .card-group > .card:not(:first-child) .card-footer, .card-group > .card:not(:first-child) .card-img-bottom { + border-bottom-left-radius: 0 + } +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: 1rem 1.25rem; + font-size: 1rem; + color: #212529; + text-align: left; + background-color: #fff; + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease +} + +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none + } +} + +.accordion-button:not(.collapsed) { + color: #0c63e4; + background-color: #e7f1ff; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .125) +} + +.accordion-button:not(.collapsed)::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%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"); + transform: rotate(-180deg) +} + +.accordion-button::after { + flex-shrink: 0; + width: 1.25rem; + height: 1.25rem; + margin-left: auto; + content: ""; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%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"); + background-repeat: no-repeat; + background-size: 1.25rem; + transition: transform .2s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none + } +} + +.accordion-button:hover { + z-index: 2 +} + +.accordion-button:focus { + z-index: 3; + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25) +} + +.accordion-header { + margin-bottom: 0 +} + +.accordion-item { + background-color: #fff; + border: 1px solid rgba(0, 0, 0, .125) +} + +.accordion-item:first-of-type { + border-top-left-radius: .25rem; + border-top-right-radius: .25rem +} + +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: calc(.25rem - 1px); + border-top-right-radius: calc(.25rem - 1px) +} + +.accordion-item:not(:first-of-type) { + border-top: 0 +} + +.accordion-item:last-of-type { + border-bottom-right-radius: .25rem; + border-bottom-left-radius: .25rem +} + +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: calc(.25rem - 1px); + border-bottom-left-radius: calc(.25rem - 1px) +} + +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: .25rem; + border-bottom-left-radius: .25rem +} + +.accordion-body { + padding: 1rem 1.25rem +} + +.accordion-flush .accordion-collapse { + border-width: 0 +} + +.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-button { + border-radius: 0 +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0 0; + margin-bottom: 1rem; + list-style: none +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: .5rem +} + +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: .5rem; + color: #6c757d; + content: var(--bs-breadcrumb-divider, "/") +} + +.breadcrumb-item.active { + color: #6c757d +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none +} + +.page-link { + position: relative; + display: block; + color: #0d6efd; + text-decoration: none; + background-color: #fff; + border: 1px solid #dee2e6; + 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: #0a58ca; + background-color: #e9ecef; + border-color: #dee2e6 +} + +.page-link:focus { + z-index: 3; + color: #0a58ca; + background-color: #e9ecef; + outline: 0; + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25) +} + +.page-item:not(:first-child) .page-link { + margin-left: -1px +} + +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd +} + +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + background-color: #fff; + border-color: #dee2e6 +} + +.page-link { + padding: .375rem .75rem +} + +.page-item:first-child .page-link { + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem +} + +.page-item:last-child .page-link { + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem +} + +.pagination-lg .page-link { + padding: .75rem 1.5rem; + font-size: 1.25rem +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: .3rem; + border-bottom-left-radius: .3rem +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: .3rem; + border-bottom-right-radius: .3rem +} + +.pagination-sm .page-link { + padding: .25rem .5rem; + font-size: .875rem +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: .2rem; + border-bottom-left-radius: .2rem +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: .2rem; + border-bottom-right-radius: .2rem +} + +.badge { + display: inline-block; + padding: .35em .65em; + font-size: .75em; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25rem +} + +.badge:empty { + display: none +} + +.btn .badge { + position: relative; + top: -1px +} + +.alert { + position: relative; + padding: 1rem 1rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: .25rem +} + +.alert-heading { + color: inherit +} + +.alert-link { + font-weight: 700 +} + +.alert-dismissible { + padding-right: 3rem +} + +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem +} + +.alert-primary { + color: #084298; + background-color: #cfe2ff; + border-color: #b6d4fe +} + +.alert-primary .alert-link { + color: #06357a +} + +.alert-secondary { + color: #41464b; + background-color: #e2e3e5; + border-color: #d3d6d8 +} + +.alert-secondary .alert-link { + color: #34383c +} + +.alert-success { + color: #0f5132; + background-color: #d1e7dd; + border-color: #badbcc +} + +.alert-success .alert-link { + color: #0c4128 +} + +.alert-info { + color: #055160; + background-color: #cff4fc; + border-color: #b6effb +} + +.alert-info .alert-link { + color: #04414d +} + +.alert-warning { + color: #664d03; + background-color: #fff3cd; + border-color: #ffecb5 +} + +.alert-warning .alert-link { + color: #523e02 +} + +.alert-danger { + color: #842029; + background-color: #f8d7da; + border-color: #f5c2c7 +} + +.alert-danger .alert-link { + color: #6a1a21 +} + +.alert-light { + color: #636464; + background-color: #fefefe; + border-color: #fdfdfe +} + +.alert-light .alert-link { + color: #4f5050 +} + +.alert-dark { + color: #141619; + background-color: #d3d3d4; + border-color: #bcbebf +} + +.alert-dark .alert-link { + color: #101214 +} + +@-webkit-keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem + } +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem + } +} + +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: .75rem; + background-color: #e9ecef; + border-radius: .25rem +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #0d6efd; + transition: width .6s ease +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem +} + +.progress-bar-animated { + -webkit-animation: 1s linear infinite progress-bar-stripes; + animation: 1s linear infinite progress-bar-stripes +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none + } +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: .25rem +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section +} + +.list-group-numbered > li::before { + content: counters(section, ".") ". "; + counter-increment: section +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit +} + +.list-group-item-action:focus, .list-group-item-action:hover { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa +} + +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef +} + +.list-group-item { + position: relative; + display: block; + padding: .5rem 1rem; + color: #212529; + text-decoration: none; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, .125) +} + +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit +} + +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit +} + +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd +} + +.list-group-item + .list-group-item { + border-top-width: 0 +} + +.list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px +} + +.list-group-horizontal { + flex-direction: row +} + +.list-group-horizontal > .list-group-item:first-child { + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 +} + +.list-group-horizontal > .list-group-item:last-child { + border-top-right-radius: .25rem; + border-bottom-left-radius: 0 +} + +.list-group-horizontal > .list-group-item.active { + margin-top: 0 +} + +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0 +} + +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row + } + + .list-group-horizontal-sm > .list-group-item:first-child { + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-sm > .list-group-item:last-child { + border-top-right-radius: .25rem; + border-bottom-left-radius: 0 + } + + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0 + } + + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row + } + + .list-group-horizontal-md > .list-group-item:first-child { + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-md > .list-group-item:last-child { + border-top-right-radius: .25rem; + border-bottom-left-radius: 0 + } + + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0 + } + + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row + } + + .list-group-horizontal-lg > .list-group-item:first-child { + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-lg > .list-group-item:last-child { + border-top-right-radius: .25rem; + border-bottom-left-radius: 0 + } + + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0 + } + + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row + } + + .list-group-horizontal-xl > .list-group-item:first-child { + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-xl > .list-group-item:last-child { + border-top-right-radius: .25rem; + border-bottom-left-radius: 0 + } + + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0 + } + + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0 + } + + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px + } +} + +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row + } + + .list-group-horizontal-xxl > .list-group-item:first-child { + border-bottom-left-radius: .25rem; + border-top-right-radius: 0 + } + + .list-group-horizontal-xxl > .list-group-item:last-child { + border-top-right-radius: .25rem; + 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: 1px; + border-left-width: 0 + } + + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px + } +} + +.list-group-flush { + border-radius: 0 +} + +.list-group-flush > .list-group-item { + border-width: 0 0 1px +} + +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0 +} + +.list-group-item-primary { + color: #084298; + background-color: #cfe2ff +} + +.list-group-item-primary.list-group-item-action:focus, .list-group-item-primary.list-group-item-action:hover { + color: #084298; + background-color: #bacbe6 +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #084298; + border-color: #084298 +} + +.list-group-item-secondary { + color: #41464b; + background-color: #e2e3e5 +} + +.list-group-item-secondary.list-group-item-action:focus, .list-group-item-secondary.list-group-item-action:hover { + color: #41464b; + background-color: #cbccce +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #41464b; + border-color: #41464b +} + +.list-group-item-success { + color: #0f5132; + background-color: #d1e7dd +} + +.list-group-item-success.list-group-item-action:focus, .list-group-item-success.list-group-item-action:hover { + color: #0f5132; + background-color: #bcd0c7 +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #0f5132; + border-color: #0f5132 +} + +.list-group-item-info { + color: #055160; + background-color: #cff4fc +} + +.list-group-item-info.list-group-item-action:focus, .list-group-item-info.list-group-item-action:hover { + color: #055160; + background-color: #badce3 +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #055160; + border-color: #055160 +} + +.list-group-item-warning { + color: #664d03; + background-color: #fff3cd +} + +.list-group-item-warning.list-group-item-action:focus, .list-group-item-warning.list-group-item-action:hover { + color: #664d03; + background-color: #e6dbb9 +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #664d03; + border-color: #664d03 +} + +.list-group-item-danger { + color: #842029; + background-color: #f8d7da +} + +.list-group-item-danger.list-group-item-action:focus, .list-group-item-danger.list-group-item-action:hover { + color: #842029; + background-color: #dfc2c4 +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #842029; + border-color: #842029 +} + +.list-group-item-light { + color: #636464; + background-color: #fefefe +} + +.list-group-item-light.list-group-item-action:focus, .list-group-item-light.list-group-item-action:hover { + color: #636464; + background-color: #e5e5e5 +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #636464; + border-color: #636464 +} + +.list-group-item-dark { + color: #141619; + background-color: #d3d3d4 +} + +.list-group-item-dark.list-group-item-action:focus, .list-group-item-dark.list-group-item-action:hover { + color: #141619; + background-color: #bebebf +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #141619; + border-color: #141619 +} + +.btn-close { + box-sizing: content-box; + width: 1em; + height: 1em; + padding: .25em .25em; + color: #000; + background: transparent 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 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; + border: 0; + border-radius: .25rem; + opacity: .5 +} + +.btn-close:hover { + color: #000; + text-decoration: none; + opacity: .75 +} + +.btn-close:focus { + outline: 0; + box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25); + opacity: 1 +} + +.btn-close.disabled, .btn-close:disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: .25 +} + +.btn-close-white { + filter: invert(1) grayscale(100%) brightness(200%) +} + +.toast { + width: 350px; + max-width: 100%; + font-size: .875rem; + pointer-events: auto; + background-color: rgba(255, 255, 255, .85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .1); + box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15); + border-radius: .25rem +} + +.toast.showing { + opacity: 0 +} + +.toast:not(.show) { + display: none +} + +.toast-container { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none +} + +.toast-container > :not(:last-child) { + margin-bottom: .75rem +} + +.toast-header { + display: flex; + align-items: center; + padding: .5rem .75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, .85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, .05); + border-top-left-radius: calc(.25rem - 1px); + border-top-right-radius: calc(.25rem - 1px) +} + +.toast-header .btn-close { + margin-right: -.375rem; + margin-left: .75rem +} + +.toast-body { + padding: .75rem; + word-wrap: break-word +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1055; + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0 +} + +.modal-dialog { + position: relative; + width: auto; + margin: .5rem; + 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% - 1rem) +} + +.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% - 1rem) +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: .3rem; + outline: 0 +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + width: 100vw; + height: 100vh; + background-color: #000 +} + +.modal-backdrop.fade { + opacity: 0 +} + +.modal-backdrop.show { + opacity: .5 +} + +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: calc(.3rem - 1px); + border-top-right-radius: calc(.3rem - 1px) +} + +.modal-header .btn-close { + padding: .5rem .5rem; + margin: -.5rem -.5rem -.5rem auto +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5 +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem +} + +.modal-footer { + display: flex; + flex-wrap: wrap; + flex-shrink: 0; + align-items: center; + justify-content: flex-end; + padding: .75rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: calc(.3rem - 1px); + border-bottom-left-radius: calc(.3rem - 1px) +} + +.modal-footer > * { + margin: .25rem +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto + } + + .modal-dialog-scrollable { + height: calc(100% - 3.5rem) + } + + .modal-dialog-centered { + min-height: calc(100% - 3.5rem) + } + + .modal-sm { + max-width: 300px + } +} + +@media (min-width: 992px) { + .modal-lg, .modal-xl { + max-width: 800px + } +} + +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px + } +} + +.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 { + border-radius: 0 +} + +.modal-fullscreen .modal-body { + overflow-y: auto +} + +.modal-fullscreen .modal-footer { + border-radius: 0 +} + +@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 { + border-radius: 0 + } + + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto + } + + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0 + } +} + +@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 { + border-radius: 0 + } + + .modal-fullscreen-md-down .modal-body { + overflow-y: auto + } + + .modal-fullscreen-md-down .modal-footer { + border-radius: 0 + } +} + +@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 { + border-radius: 0 + } + + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto + } + + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0 + } +} + +@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 { + border-radius: 0 + } + + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto + } + + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0 + } +} + +@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 { + border-radius: 0 + } + + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto + } + + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0 + } +} + +.tooltip { + position: absolute; + z-index: 1080; + display: block; + margin: 0; + 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; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: .875rem; + word-wrap: break-word; + opacity: 0 +} + +.tooltip.show { + opacity: .9 +} + +.tooltip .tooltip-arrow { + position: absolute; + display: block; + width: .8rem; + height: .4rem +} + +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid +} + +.bs-tooltip-auto[data-popper-placement^=top], .bs-tooltip-top { + padding: .4rem 0 +} + +.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow, .bs-tooltip-top .tooltip-arrow { + bottom: 0 +} + +.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before, .bs-tooltip-top .tooltip-arrow::before { + top: -1px; + border-width: .4rem .4rem 0; + border-top-color: #000 +} + +.bs-tooltip-auto[data-popper-placement^=right], .bs-tooltip-end { + padding: 0 .4rem +} + +.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow, .bs-tooltip-end .tooltip-arrow { + left: 0; + width: .4rem; + height: .8rem +} + +.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before, .bs-tooltip-end .tooltip-arrow::before { + right: -1px; + border-width: .4rem .4rem .4rem 0; + border-right-color: #000 +} + +.bs-tooltip-auto[data-popper-placement^=bottom], .bs-tooltip-bottom { + padding: .4rem 0 +} + +.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow, .bs-tooltip-bottom .tooltip-arrow { + top: 0 +} + +.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before, .bs-tooltip-bottom .tooltip-arrow::before { + bottom: -1px; + border-width: 0 .4rem .4rem; + border-bottom-color: #000 +} + +.bs-tooltip-auto[data-popper-placement^=left], .bs-tooltip-start { + padding: 0 .4rem +} + +.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow, .bs-tooltip-start .tooltip-arrow { + right: 0; + width: .4rem; + height: .8rem +} + +.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before, .bs-tooltip-start .tooltip-arrow::before { + left: -1px; + border-width: .4rem 0 .4rem .4rem; + border-left-color: #000 +} + +.tooltip-inner { + max-width: 200px; + padding: .25rem .5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: .25rem +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1070; + display: block; + max-width: 276px; + 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; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: .875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: .3rem +} + +.popover .popover-arrow { + position: absolute; + display: block; + width: 1rem; + height: .5rem +} + +.popover .popover-arrow::after, .popover .popover-arrow::before { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow, .bs-popover-top > .popover-arrow { + bottom: calc(-.5rem - 1px) +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::before { + bottom: 0; + border-width: .5rem .5rem 0; + border-top-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after, .bs-popover-top > .popover-arrow::after { + bottom: 1px; + border-width: .5rem .5rem 0; + border-top-color: #fff +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow, .bs-popover-end > .popover-arrow { + left: calc(-.5rem - 1px); + width: .5rem; + height: 1rem +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::before { + left: 0; + border-width: .5rem .5rem .5rem 0; + border-right-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after, .bs-popover-end > .popover-arrow::after { + left: 1px; + border-width: .5rem .5rem .5rem 0; + border-right-color: #fff +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow, .bs-popover-bottom > .popover-arrow { + top: calc(-.5rem - 1px) +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::before { + top: 0; + border-width: 0 .5rem .5rem .5rem; + border-bottom-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after, .bs-popover-bottom > .popover-arrow::after { + top: 1px; + border-width: 0 .5rem .5rem .5rem; + border-bottom-color: #fff +} + +.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before, .bs-popover-bottom .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -.5rem; + content: ""; + border-bottom: 1px solid #f0f0f0 +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow, .bs-popover-start > .popover-arrow { + right: calc(-.5rem - 1px); + width: .5rem; + height: 1rem +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::before { + right: 0; + border-width: .5rem 0 .5rem .5rem; + border-left-color: rgba(0, 0, 0, .25) +} + +.bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after, .bs-popover-start > .popover-arrow::after { + right: 1px; + border-width: .5rem 0 .5rem .5rem; + border-left-color: #fff +} + +.popover-header { + padding: .5rem 1rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f0f0f0; + border-bottom: 1px solid rgba(0, 0, 0, .2); + border-top-left-radius: calc(.3rem - 1px); + border-top-right-radius: calc(.3rem - 1px) +} + +.popover-header:empty { + display: none +} + +.popover-body { + padding: 1rem 1rem; + color: #212529 +} + +.carousel { + position: relative +} + +.carousel.pointer-event { + touch-action: pan-y +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} + +.carousel-inner::after { + display: block; + clear: both; + content: "" +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform .6s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none + } +} + +.carousel-item-next, .carousel-item-prev, .carousel-item.active { + display: block +} + +.active.carousel-item-end, .carousel-item-next:not(.carousel-item-start) { + transform: translateX(100%) +} + +.active.carousel-item-start, .carousel-item-prev:not(.carousel-item-end) { + transform: translateX(-100%) +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none +} + +.carousel-fade .carousel-item-next.carousel-item-start, .carousel-fade .carousel-item-prev.carousel-item-end, .carousel-fade .carousel-item.active { + z-index: 1; + opacity: 1 +} + +.carousel-fade .active.carousel-item-end, .carousel-fade .active.carousel-item-start { + z-index: 0; + opacity: 0; + transition: opacity 0s .6s +} + +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-end, .carousel-fade .active.carousel-item-start { + transition: none + } +} + +.carousel-control-next, .carousel-control-prev { + 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: 0 0; + border: 0; + opacity: .5; + transition: opacity .15s ease +} + +@media (prefers-reduced-motion: reduce) { + .carousel-control-next, .carousel-control-prev { + transition: none + } +} + +.carousel-control-next:focus, .carousel-control-next:hover, .carousel-control-prev:focus, .carousel-control-prev:hover { + color: #fff; + text-decoration: none; + outline: 0; + opacity: .9 +} + +.carousel-control-prev { + left: 0 +} + +.carousel-control-next { + right: 0 +} + +.carousel-control-next-icon, .carousel-control-prev-icon { + display: inline-block; + width: 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") +} + +.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") +} + +.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%; + list-style: none +} + +.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 transparent; + border-bottom: 10px solid transparent; + 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-next-icon, .carousel-dark .carousel-control-prev-icon { + filter: invert(1) grayscale(100) +} + +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000 +} + +.carousel-dark .carousel-caption { + color: #000 +} + +@-webkit-keyframes spinner-border { + to { + transform: rotate(360deg) + } +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) + } +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -.125em; + border: .25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: .75s linear infinite spinner-border; + animation: .75s linear infinite spinner-border +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: .2em +} + +@-webkit-keyframes spinner-grow { + 0% { + transform: scale(0) + } + 50% { + opacity: 1; + transform: none + } +} + +@keyframes spinner-grow { + 0% { + transform: scale(0) + } + 50% { + opacity: 1; + transform: none + } +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -.125em; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: .75s linear infinite spinner-grow; + animation: .75s linear infinite spinner-grow +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, .spinner-grow { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s + } +} + +.offcanvas { + position: fixed; + bottom: 0; + z-index: 1045; + display: flex; + flex-direction: column; + max-width: 100%; + visibility: hidden; + background-color: #fff; + background-clip: padding-box; + outline: 0; + transition: transform .3s ease-in-out +} + +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none + } +} + +.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; + justify-content: space-between; + padding: 1rem 1rem +} + +.offcanvas-header .btn-close { + padding: .5rem .5rem; + margin-top: -.5rem; + margin-right: -.5rem; + margin-bottom: -.5rem +} + +.offcanvas-title { + margin-bottom: 0; + line-height: 1.5 +} + +.offcanvas-body { + flex-grow: 1; + padding: 1rem 1rem; + overflow-y: auto +} + +.offcanvas-start { + top: 0; + left: 0; + width: 400px; + border-right: 1px solid rgba(0, 0, 0, .2); + transform: translateX(-100%) +} + +.offcanvas-end { + top: 0; + right: 0; + width: 400px; + border-left: 1px solid rgba(0, 0, 0, .2); + transform: translateX(100%) +} + +.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-bottom: 1px solid rgba(0, 0, 0, .2); + transform: translateY(-100%) +} + +.offcanvas-bottom { + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-top: 1px solid rgba(0, 0, 0, .2); + transform: translateY(100%) +} + +.offcanvas.show { + transform: none +} + +.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 { + -webkit-animation: placeholder-glow 2s ease-in-out infinite; + animation: placeholder-glow 2s ease-in-out infinite +} + +@-webkit-keyframes placeholder-glow { + 50% { + opacity: .2 + } +} + +@keyframes placeholder-glow { + 50% { + opacity: .2 + } +} + +.placeholder-wave { + -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + -webkit-animation: placeholder-wave 2s linear infinite; + animation: placeholder-wave 2s linear infinite +} + +@-webkit-keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0% + } +} + +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0% + } +} + +.clearfix::after { + display: block; + clear: both; + content: "" +} + +.link-primary { + color: #0d6efd +} + +.link-primary:focus, .link-primary:hover { + color: #0a58ca +} + +.link-secondary { + color: #6c757d +} + +.link-secondary:focus, .link-secondary:hover { + color: #565e64 +} + +.link-success { + color: #198754 +} + +.link-success:focus, .link-success:hover { + color: #146c43 +} + +.link-info { + color: #0dcaf0 +} + +.link-info:focus, .link-info:hover { + color: #3dd5f3 +} + +.link-warning { + color: #ffc107 +} + +.link-warning:focus, .link-warning:hover { + color: #ffcd39 +} + +.link-danger { + color: #dc3545 +} + +.link-danger:focus, .link-danger:hover { + color: #b02a37 +} + +.link-light { + color: #f8f9fa +} + +.link-light:focus, .link-light:hover { + color: #f9fafb +} + +.link-dark { + color: #212529 +} + +.link-dark:focus, .link-dark:hover { + color: #1a1e21 +} + +.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: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } +} + +@media (min-width: 768px) { + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } +} + +@media (min-width: 992px) { + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } +} + +@media (min-width: 1200px) { + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } +} + +@media (min-width: 1400px) { + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 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) { + position: absolute !important; + 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 +} + +.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: 1px; + 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 +} + +.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 +} + +.d-inline { + display: inline !important +} + +.d-inline-block { + display: inline-block !important +} + +.d-block { + display: block !important +} + +.d-grid { + display: 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: 0 .5rem 1rem rgba(0, 0, 0, .15) !important +} + +.shadow-sm { + box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, .175) !important +} + +.shadow-none { + box-shadow: none !important +} + +.position-static { + position: static !important +} + +.position-relative { + position: relative !important +} + +.position-absolute { + position: absolute !important +} + +.position-fixed { + position: fixed !important +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important +} + +.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: 1px solid #dee2e6 !important +} + +.border-0 { + border: 0 !important +} + +.border-top { + border-top: 1px solid #dee2e6 !important +} + +.border-top-0 { + border-top: 0 !important +} + +.border-end { + border-right: 1px solid #dee2e6 !important +} + +.border-end-0 { + border-right: 0 !important +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important +} + +.border-bottom-0 { + border-bottom: 0 !important +} + +.border-start { + border-left: 1px solid #dee2e6 !important +} + +.border-start-0 { + border-left: 0 !important +} + +.border-primary { + border-color: #0d6efd !important +} + +.border-secondary { + border-color: #6c757d !important +} + +.border-success { + border-color: #198754 !important +} + +.border-info { + border-color: #0dcaf0 !important +} + +.border-warning { + border-color: #ffc107 !important +} + +.border-danger { + border-color: #dc3545 !important +} + +.border-light { + border-color: #f8f9fa !important +} + +.border-dark { + border-color: #212529 !important +} + +.border-white { + border-color: #fff !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 +} + +.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 +} + +.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 +} + +.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 +} + +.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 + .9vw) !important +} + +.fs-3 { + font-size: calc(1.3rem + .6vw) !important +} + +.fs-4 { + font-size: calc(1.275rem + .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-light { + font-weight: 300 !important +} + +.fw-lighter { + font-weight: lighter !important +} + +.fw-normal { + font-weight: 400 !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: #6c757d !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-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 +} + +.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: transparent !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-gradient { + background-image: var(--bs-gradient) !important +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important +} + +.pe-none { + pointer-events: none !important +} + +.pe-auto { + pointer-events: auto !important +} + +.rounded { + border-radius: .25rem !important +} + +.rounded-0 { + border-radius: 0 !important +} + +.rounded-1 { + border-radius: .2rem !important +} + +.rounded-2 { + border-radius: .25rem !important +} + +.rounded-3 { + border-radius: .3rem !important +} + +.rounded-circle { + border-radius: 50% !important +} + +.rounded-pill { + border-radius: 50rem !important +} + +.rounded-top { + border-top-left-radius: .25rem !important; + border-top-right-radius: .25rem !important +} + +.rounded-end { + border-top-right-radius: .25rem !important; + border-bottom-right-radius: .25rem !important +} + +.rounded-bottom { + border-bottom-right-radius: .25rem !important; + border-bottom-left-radius: .25rem !important +} + +.rounded-start { + border-bottom-left-radius: .25rem !important; + border-top-left-radius: .25rem !important +} + +.visible { + visibility: visible !important +} + +.invisible { + visibility: hidden !important +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important + } + + .float-sm-end { + float: right !important + } + + .float-sm-none { + float: 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-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 + } + + .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 + } + + .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 + } + + .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 + } + + .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-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 + } + + .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 + } + + .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 + } + + .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 + } + + .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-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 + } + + .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 + } + + .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 + } + + .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 + } + + .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-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 + } + + .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 + } + + .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 + } + + .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 + } + + .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-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 + } + + .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 + } + + .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 + } + + .text-xxl-start { + text-align: left !important + } + + .text-xxl-end { + text-align: right !important + } + + .text-xxl-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-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 */ \ No newline at end of file diff --git a/src/main/resources/static/css/fonts/bootstrap-icons.woff b/src/main/resources/static/css/fonts/bootstrap-icons.woff new file mode 100644 index 0000000..667b51b Binary files /dev/null and b/src/main/resources/static/css/fonts/bootstrap-icons.woff differ diff --git a/src/main/resources/static/css/fonts/bootstrap-icons.woff2 b/src/main/resources/static/css/fonts/bootstrap-icons.woff2 new file mode 100644 index 0000000..177cf3f Binary files /dev/null and b/src/main/resources/static/css/fonts/bootstrap-icons.woff2 differ diff --git a/src/main/resources/static/js/app/bootstrap.bundle.min.js b/src/main/resources/static/js/app/bootstrap.bundle.min.js new file mode 100644 index 0000000..030bd91 --- /dev/null +++ b/src/main/resources/static/js/app/bootstrap.bundle.min.js @@ -0,0 +1,2573 @@ +/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function (t, e) { + "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).bootstrap = e() +}(this, (function () { + "use strict"; + const t = "transitionend", e = t => { + let e = t.getAttribute("data-bs-target"); + if (!e || "#" === e) { + let i = t.getAttribute("href"); + if (!i || !i.includes("#") && !i.startsWith(".")) return null; + i.includes("#") && !i.startsWith("#") && (i = `#${i.split("#")[1]}`), e = i && "#" !== i ? i.trim() : null + } + return e + }, i = t => { + const i = e(t); + return i && document.querySelector(i) ? i : null + }, n = t => { + const i = e(t); + return i ? document.querySelector(i) : null + }, s = e => { + e.dispatchEvent(new Event(t)) + }, o = t => !(!t || "object" != typeof t) && (void 0 !== t.jquery && (t = t[0]), void 0 !== t.nodeType), + r = t => o(t) ? t.jquery ? t[0] : t : "string" == typeof t && t.length > 0 ? document.querySelector(t) : null, + a = (t, e, i) => { + Object.keys(i).forEach((n => { + const s = i[n], r = e[n], + a = r && o(r) ? "element" : null == (l = r) ? `${l}` : {}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase(); + var l; + if (!new RegExp(s).test(a)) throw new TypeError(`${t.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`) + })) + }, + l = t => !(!o(t) || 0 === t.getClientRects().length) && "visible" === getComputedStyle(t).getPropertyValue("visibility"), + c = t => !t || t.nodeType !== Node.ELEMENT_NODE || !!t.classList.contains("disabled") || (void 0 !== t.disabled ? t.disabled : t.hasAttribute("disabled") && "false" !== t.getAttribute("disabled")), + h = t => { + if (!document.documentElement.attachShadow) return null; + if ("function" == typeof t.getRootNode) { + const e = t.getRootNode(); + return e instanceof ShadowRoot ? e : null + } + return t instanceof ShadowRoot ? t : t.parentNode ? h(t.parentNode) : null + }, d = () => { + }, u = t => { + t.offsetHeight + }, f = () => { + const {jQuery: t} = window; + return t && !document.body.hasAttribute("data-bs-no-jquery") ? t : null + }, p = [], m = () => "rtl" === document.documentElement.dir, g = t => { + var e; + e = () => { + const e = f(); + if (e) { + const i = t.NAME, n = e.fn[i]; + e.fn[i] = t.jQueryInterface, e.fn[i].Constructor = t, e.fn[i].noConflict = () => (e.fn[i] = n, t.jQueryInterface) + } + }, "loading" === document.readyState ? (p.length || document.addEventListener("DOMContentLoaded", (() => { + p.forEach((t => t())) + })), p.push(e)) : e() + }, _ = t => { + "function" == typeof t && t() + }, b = (e, i, n = !0) => { + if (!n) return void _(e); + const o = (t => { + if (!t) return 0; + let {transitionDuration: e, transitionDelay: i} = window.getComputedStyle(t); + const n = Number.parseFloat(e), s = Number.parseFloat(i); + return n || s ? (e = e.split(",")[0], i = i.split(",")[0], 1e3 * (Number.parseFloat(e) + Number.parseFloat(i))) : 0 + })(i) + 5; + let r = !1; + const a = ({target: n}) => { + n === i && (r = !0, i.removeEventListener(t, a), _(e)) + }; + i.addEventListener(t, a), setTimeout((() => { + r || s(i) + }), o) + }, v = (t, e, i, n) => { + let s = t.indexOf(e); + if (-1 === s) return t[!i && n ? t.length - 1 : 0]; + const o = t.length; + return s += i ? 1 : -1, n && (s = (s + o) % o), t[Math.max(0, Math.min(s, o - 1))] + }, y = /[^.]*(?=\..*)\.|.*/, w = /\..*/, E = /::\d+$/, A = {}; + let T = 1; + const O = {mouseenter: "mouseover", mouseleave: "mouseout"}, C = /^(mouseenter|mouseleave)/i, + k = new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]); + + function L(t, e) { + return e && `${e}::${T++}` || t.uidEvent || T++ + } + + function x(t) { + const e = L(t); + return t.uidEvent = e, A[e] = A[e] || {}, A[e] + } + + function D(t, e, i = null) { + const n = Object.keys(t); + for (let s = 0, o = n.length; s < o; s++) { + const o = t[n[s]]; + if (o.originalHandler === e && o.delegationSelector === i) return o + } + return null + } + + function S(t, e, i) { + const n = "string" == typeof e, s = n ? i : e; + let o = P(t); + return k.has(o) || (o = t), [n, s, o] + } + + function N(t, e, i, n, s) { + if ("string" != typeof e || !t) return; + if (i || (i = n, n = null), C.test(e)) { + const t = t => function (e) { + if (!e.relatedTarget || e.relatedTarget !== e.delegateTarget && !e.delegateTarget.contains(e.relatedTarget)) return t.call(this, e) + }; + n ? n = t(n) : i = t(i) + } + const [o, r, a] = S(e, i, n), l = x(t), c = l[a] || (l[a] = {}), h = D(c, r, o ? i : null); + if (h) return void (h.oneOff = h.oneOff && s); + const d = L(r, e.replace(y, "")), u = o ? function (t, e, i) { + return function n(s) { + const o = t.querySelectorAll(e); + for (let {target: r} = s; r && r !== this; r = r.parentNode) for (let a = o.length; a--;) if (o[a] === r) return s.delegateTarget = r, n.oneOff && j.off(t, s.type, e, i), i.apply(r, [s]); + return null + } + }(t, i, n) : function (t, e) { + return function i(n) { + return n.delegateTarget = t, i.oneOff && j.off(t, n.type, e), e.apply(t, [n]) + } + }(t, i); + u.delegationSelector = o ? i : null, u.originalHandler = r, u.oneOff = s, u.uidEvent = d, c[d] = u, t.addEventListener(a, u, o) + } + + function I(t, e, i, n, s) { + const o = D(e[i], n, s); + o && (t.removeEventListener(i, o, Boolean(s)), delete e[i][o.uidEvent]) + } + + function P(t) { + return t = t.replace(w, ""), O[t] || t + } + + const j = { + on(t, e, i, n) { + N(t, e, i, n, !1) + }, one(t, e, i, n) { + N(t, e, i, n, !0) + }, off(t, e, i, n) { + if ("string" != typeof e || !t) return; + const [s, o, r] = S(e, i, n), a = r !== e, l = x(t), c = e.startsWith("."); + if (void 0 !== o) { + if (!l || !l[r]) return; + return void I(t, l, r, o, s ? i : null) + } + c && Object.keys(l).forEach((i => { + !function (t, e, i, n) { + const s = e[i] || {}; + Object.keys(s).forEach((o => { + if (o.includes(n)) { + const n = s[o]; + I(t, e, i, n.originalHandler, n.delegationSelector) + } + })) + }(t, l, i, e.slice(1)) + })); + const h = l[r] || {}; + Object.keys(h).forEach((i => { + const n = i.replace(E, ""); + if (!a || e.includes(n)) { + const e = h[i]; + I(t, l, r, e.originalHandler, e.delegationSelector) + } + })) + }, trigger(t, e, i) { + if ("string" != typeof e || !t) return null; + const n = f(), s = P(e), o = e !== s, r = k.has(s); + let a, l = !0, c = !0, h = !1, d = null; + return o && n && (a = n.Event(e, i), n(t).trigger(a), l = !a.isPropagationStopped(), c = !a.isImmediatePropagationStopped(), h = a.isDefaultPrevented()), r ? (d = document.createEvent("HTMLEvents"), d.initEvent(s, l, !0)) : d = new CustomEvent(e, { + bubbles: l, + cancelable: !0 + }), void 0 !== i && Object.keys(i).forEach((t => { + Object.defineProperty(d, t, {get: () => i[t]}) + })), h && d.preventDefault(), c && t.dispatchEvent(d), d.defaultPrevented && void 0 !== a && a.preventDefault(), d + } + }, M = new Map, H = { + set(t, e, i) { + M.has(t) || M.set(t, new Map); + const n = M.get(t); + n.has(e) || 0 === n.size ? n.set(e, i) : console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`) + }, get: (t, e) => M.has(t) && M.get(t).get(e) || null, remove(t, e) { + if (!M.has(t)) return; + const i = M.get(t); + i.delete(e), 0 === i.size && M.delete(t) + } + }; + + class B { + constructor(t) { + (t = r(t)) && (this._element = t, H.set(this._element, this.constructor.DATA_KEY, this)) + } + + dispose() { + H.remove(this._element, this.constructor.DATA_KEY), j.off(this._element, this.constructor.EVENT_KEY), Object.getOwnPropertyNames(this).forEach((t => { + this[t] = null + })) + } + + _queueCallback(t, e, i = !0) { + b(t, e, i) + } + + static getInstance(t) { + return H.get(r(t), this.DATA_KEY) + } + + static getOrCreateInstance(t, e = {}) { + return this.getInstance(t) || new this(t, "object" == typeof e ? e : null) + } + + static get VERSION() { + return "5.1.3" + } + + static get NAME() { + throw new Error('You have to implement the static method "NAME", for each component!') + } + + static get DATA_KEY() { + return `bs.${this.NAME}` + } + + static get EVENT_KEY() { + return `.${this.DATA_KEY}` + } + } + + const R = (t, e = "hide") => { + const i = `click.dismiss${t.EVENT_KEY}`, s = t.NAME; + j.on(document, i, `[data-bs-dismiss="${s}"]`, (function (i) { + if (["A", "AREA"].includes(this.tagName) && i.preventDefault(), c(this)) return; + const o = n(this) || this.closest(`.${s}`); + t.getOrCreateInstance(o)[e]() + })) + }; + + class W extends B { + static get NAME() { + return "alert" + } + + close() { + if (j.trigger(this._element, "close.bs.alert").defaultPrevented) return; + this._element.classList.remove("show"); + const t = this._element.classList.contains("fade"); + this._queueCallback((() => this._destroyElement()), this._element, t) + } + + _destroyElement() { + this._element.remove(), j.trigger(this._element, "closed.bs.alert"), this.dispose() + } + + static jQueryInterface(t) { + return this.each((function () { + const e = W.getOrCreateInstance(this); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t](this) + } + })) + } + } + + R(W, "close"), g(W); + const $ = '[data-bs-toggle="button"]'; + + class z extends B { + static get NAME() { + return "button" + } + + toggle() { + this._element.setAttribute("aria-pressed", this._element.classList.toggle("active")) + } + + static jQueryInterface(t) { + return this.each((function () { + const e = z.getOrCreateInstance(this); + "toggle" === t && e[t]() + })) + } + } + + function q(t) { + return "true" === t || "false" !== t && (t === Number(t).toString() ? Number(t) : "" === t || "null" === t ? null : t) + } + + function F(t) { + return t.replace(/[A-Z]/g, (t => `-${t.toLowerCase()}`)) + } + + j.on(document, "click.bs.button.data-api", $, (t => { + t.preventDefault(); + const e = t.target.closest($); + z.getOrCreateInstance(e).toggle() + })), g(z); + const U = { + setDataAttribute(t, e, i) { + t.setAttribute(`data-bs-${F(e)}`, i) + }, removeDataAttribute(t, e) { + t.removeAttribute(`data-bs-${F(e)}`) + }, getDataAttributes(t) { + if (!t) return {}; + const e = {}; + return Object.keys(t.dataset).filter((t => t.startsWith("bs"))).forEach((i => { + let n = i.replace(/^bs/, ""); + n = n.charAt(0).toLowerCase() + n.slice(1, n.length), e[n] = q(t.dataset[i]) + })), e + }, getDataAttribute: (t, e) => q(t.getAttribute(`data-bs-${F(e)}`)), offset(t) { + const e = t.getBoundingClientRect(); + return {top: e.top + window.pageYOffset, left: e.left + window.pageXOffset} + }, position: t => ({top: t.offsetTop, left: t.offsetLeft}) + }, V = { + find: (t, e = document.documentElement) => [].concat(...Element.prototype.querySelectorAll.call(e, t)), + findOne: (t, e = document.documentElement) => Element.prototype.querySelector.call(e, t), + children: (t, e) => [].concat(...t.children).filter((t => t.matches(e))), + parents(t, e) { + const i = []; + let n = t.parentNode; + for (; n && n.nodeType === Node.ELEMENT_NODE && 3 !== n.nodeType;) n.matches(e) && i.push(n), n = n.parentNode; + return i + }, + prev(t, e) { + let i = t.previousElementSibling; + for (; i;) { + if (i.matches(e)) return [i]; + i = i.previousElementSibling + } + return [] + }, + next(t, e) { + let i = t.nextElementSibling; + for (; i;) { + if (i.matches(e)) return [i]; + i = i.nextElementSibling + } + return [] + }, + focusableChildren(t) { + const e = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((t => `${t}:not([tabindex^="-"])`)).join(", "); + return this.find(e, t).filter((t => !c(t) && l(t))) + } + }, K = "carousel", X = {interval: 5e3, keyboard: !0, slide: !1, pause: "hover", wrap: !0, touch: !0}, Y = { + interval: "(number|boolean)", + keyboard: "boolean", + slide: "(boolean|string)", + pause: "(string|boolean)", + wrap: "boolean", + touch: "boolean" + }, Q = "next", G = "prev", Z = "left", J = "right", tt = {ArrowLeft: J, ArrowRight: Z}, et = "slid.bs.carousel", + it = "active", nt = ".active.carousel-item"; + + class st extends B { + constructor(t, e) { + super(t), this._items = null, this._interval = null, this._activeElement = null, this._isPaused = !1, this._isSliding = !1, this.touchTimeout = null, this.touchStartX = 0, this.touchDeltaX = 0, this._config = this._getConfig(e), this._indicatorsElement = V.findOne(".carousel-indicators", this._element), this._touchSupported = "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0, this._pointerEvent = Boolean(window.PointerEvent), this._addEventListeners() + } + + static get Default() { + return X + } + + static get NAME() { + return K + } + + next() { + this._slide(Q) + } + + nextWhenVisible() { + !document.hidden && l(this._element) && this.next() + } + + prev() { + this._slide(G) + } + + pause(t) { + t || (this._isPaused = !0), V.findOne(".carousel-item-next, .carousel-item-prev", this._element) && (s(this._element), this.cycle(!0)), clearInterval(this._interval), this._interval = null + } + + cycle(t) { + t || (this._isPaused = !1), this._interval && (clearInterval(this._interval), this._interval = null), this._config && this._config.interval && !this._isPaused && (this._updateInterval(), this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval)) + } + + to(t) { + this._activeElement = V.findOne(nt, this._element); + const e = this._getItemIndex(this._activeElement); + if (t > this._items.length - 1 || t < 0) return; + if (this._isSliding) return void j.one(this._element, et, (() => this.to(t))); + if (e === t) return this.pause(), void this.cycle(); + const i = t > e ? Q : G; + this._slide(i, this._items[t]) + } + + _getConfig(t) { + return t = {...X, ...U.getDataAttributes(this._element), ..."object" == typeof t ? t : {}}, a(K, t, Y), t + } + + _handleSwipe() { + const t = Math.abs(this.touchDeltaX); + if (t <= 40) return; + const e = t / this.touchDeltaX; + this.touchDeltaX = 0, e && this._slide(e > 0 ? J : Z) + } + + _addEventListeners() { + this._config.keyboard && j.on(this._element, "keydown.bs.carousel", (t => this._keydown(t))), "hover" === this._config.pause && (j.on(this._element, "mouseenter.bs.carousel", (t => this.pause(t))), j.on(this._element, "mouseleave.bs.carousel", (t => this.cycle(t)))), this._config.touch && this._touchSupported && this._addTouchEventListeners() + } + + _addTouchEventListeners() { + const t = t => this._pointerEvent && ("pen" === t.pointerType || "touch" === t.pointerType), e = e => { + t(e) ? this.touchStartX = e.clientX : this._pointerEvent || (this.touchStartX = e.touches[0].clientX) + }, i = t => { + this.touchDeltaX = t.touches && t.touches.length > 1 ? 0 : t.touches[0].clientX - this.touchStartX + }, n = e => { + t(e) && (this.touchDeltaX = e.clientX - this.touchStartX), this._handleSwipe(), "hover" === this._config.pause && (this.pause(), this.touchTimeout && clearTimeout(this.touchTimeout), this.touchTimeout = setTimeout((t => this.cycle(t)), 500 + this._config.interval)) + }; + V.find(".carousel-item img", this._element).forEach((t => { + j.on(t, "dragstart.bs.carousel", (t => t.preventDefault())) + })), this._pointerEvent ? (j.on(this._element, "pointerdown.bs.carousel", (t => e(t))), j.on(this._element, "pointerup.bs.carousel", (t => n(t))), this._element.classList.add("pointer-event")) : (j.on(this._element, "touchstart.bs.carousel", (t => e(t))), j.on(this._element, "touchmove.bs.carousel", (t => i(t))), j.on(this._element, "touchend.bs.carousel", (t => n(t)))) + } + + _keydown(t) { + if (/input|textarea/i.test(t.target.tagName)) return; + const e = tt[t.key]; + e && (t.preventDefault(), this._slide(e)) + } + + _getItemIndex(t) { + return this._items = t && t.parentNode ? V.find(".carousel-item", t.parentNode) : [], this._items.indexOf(t) + } + + _getItemByOrder(t, e) { + const i = t === Q; + return v(this._items, e, i, this._config.wrap) + } + + _triggerSlideEvent(t, e) { + const i = this._getItemIndex(t), n = this._getItemIndex(V.findOne(nt, this._element)); + return j.trigger(this._element, "slide.bs.carousel", {relatedTarget: t, direction: e, from: n, to: i}) + } + + _setActiveIndicatorElement(t) { + if (this._indicatorsElement) { + const e = V.findOne(".active", this._indicatorsElement); + e.classList.remove(it), e.removeAttribute("aria-current"); + const i = V.find("[data-bs-target]", this._indicatorsElement); + for (let e = 0; e < i.length; e++) if (Number.parseInt(i[e].getAttribute("data-bs-slide-to"), 10) === this._getItemIndex(t)) { + i[e].classList.add(it), i[e].setAttribute("aria-current", "true"); + break + } + } + } + + _updateInterval() { + const t = this._activeElement || V.findOne(nt, this._element); + if (!t) return; + const e = Number.parseInt(t.getAttribute("data-bs-interval"), 10); + e ? (this._config.defaultInterval = this._config.defaultInterval || this._config.interval, this._config.interval = e) : this._config.interval = this._config.defaultInterval || this._config.interval + } + + _slide(t, e) { + const i = this._directionToOrder(t), n = V.findOne(nt, this._element), s = this._getItemIndex(n), + o = e || this._getItemByOrder(i, n), r = this._getItemIndex(o), a = Boolean(this._interval), + l = i === Q, c = l ? "carousel-item-start" : "carousel-item-end", + h = l ? "carousel-item-next" : "carousel-item-prev", d = this._orderToDirection(i); + if (o && o.classList.contains(it)) return void (this._isSliding = !1); + if (this._isSliding) return; + if (this._triggerSlideEvent(o, d).defaultPrevented) return; + if (!n || !o) return; + this._isSliding = !0, a && this.pause(), this._setActiveIndicatorElement(o), this._activeElement = o; + const f = () => { + j.trigger(this._element, et, {relatedTarget: o, direction: d, from: s, to: r}) + }; + if (this._element.classList.contains("slide")) { + o.classList.add(h), u(o), n.classList.add(c), o.classList.add(c); + const t = () => { + o.classList.remove(c, h), o.classList.add(it), n.classList.remove(it, h, c), this._isSliding = !1, setTimeout(f, 0) + }; + this._queueCallback(t, n, !0) + } else n.classList.remove(it), o.classList.add(it), this._isSliding = !1, f(); + a && this.cycle() + } + + _directionToOrder(t) { + return [J, Z].includes(t) ? m() ? t === Z ? G : Q : t === Z ? Q : G : t + } + + _orderToDirection(t) { + return [Q, G].includes(t) ? m() ? t === G ? Z : J : t === G ? J : Z : t + } + + static carouselInterface(t, e) { + const i = st.getOrCreateInstance(t, e); + let {_config: n} = i; + "object" == typeof e && (n = {...n, ...e}); + const s = "string" == typeof e ? e : n.slide; + if ("number" == typeof e) i.to(e); else if ("string" == typeof s) { + if (void 0 === i[s]) throw new TypeError(`No method named "${s}"`); + i[s]() + } else n.interval && n.ride && (i.pause(), i.cycle()) + } + + static jQueryInterface(t) { + return this.each((function () { + st.carouselInterface(this, t) + })) + } + + static dataApiClickHandler(t) { + const e = n(this); + if (!e || !e.classList.contains("carousel")) return; + const i = {...U.getDataAttributes(e), ...U.getDataAttributes(this)}, + s = this.getAttribute("data-bs-slide-to"); + s && (i.interval = !1), st.carouselInterface(e, i), s && st.getInstance(e).to(s), t.preventDefault() + } + } + + j.on(document, "click.bs.carousel.data-api", "[data-bs-slide], [data-bs-slide-to]", st.dataApiClickHandler), j.on(window, "load.bs.carousel.data-api", (() => { + const t = V.find('[data-bs-ride="carousel"]'); + for (let e = 0, i = t.length; e < i; e++) st.carouselInterface(t[e], st.getInstance(t[e])) + })), g(st); + const ot = "collapse", rt = {toggle: !0, parent: null}, at = {toggle: "boolean", parent: "(null|element)"}, + lt = "show", ct = "collapse", ht = "collapsing", dt = "collapsed", ut = ":scope .collapse .collapse", + ft = '[data-bs-toggle="collapse"]'; + + class pt extends B { + constructor(t, e) { + super(t), this._isTransitioning = !1, this._config = this._getConfig(e), this._triggerArray = []; + const n = V.find(ft); + for (let t = 0, e = n.length; t < e; t++) { + const e = n[t], s = i(e), o = V.find(s).filter((t => t === this._element)); + null !== s && o.length && (this._selector = s, this._triggerArray.push(e)) + } + this._initializeChildren(), this._config.parent || this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()), this._config.toggle && this.toggle() + } + + static get Default() { + return rt + } + + static get NAME() { + return ot + } + + toggle() { + this._isShown() ? this.hide() : this.show() + } + + show() { + if (this._isTransitioning || this._isShown()) return; + let t, e = []; + if (this._config.parent) { + const t = V.find(ut, this._config.parent); + e = V.find(".collapse.show, .collapse.collapsing", this._config.parent).filter((e => !t.includes(e))) + } + const i = V.findOne(this._selector); + if (e.length) { + const n = e.find((t => i !== t)); + if (t = n ? pt.getInstance(n) : null, t && t._isTransitioning) return + } + if (j.trigger(this._element, "show.bs.collapse").defaultPrevented) return; + e.forEach((e => { + i !== e && pt.getOrCreateInstance(e, {toggle: !1}).hide(), t || H.set(e, "bs.collapse", null) + })); + const n = this._getDimension(); + this._element.classList.remove(ct), this._element.classList.add(ht), this._element.style[n] = 0, this._addAriaAndCollapsedClass(this._triggerArray, !0), this._isTransitioning = !0; + const s = `scroll${n[0].toUpperCase() + n.slice(1)}`; + this._queueCallback((() => { + this._isTransitioning = !1, this._element.classList.remove(ht), this._element.classList.add(ct, lt), this._element.style[n] = "", j.trigger(this._element, "shown.bs.collapse") + }), this._element, !0), this._element.style[n] = `${this._element[s]}px` + } + + hide() { + if (this._isTransitioning || !this._isShown()) return; + if (j.trigger(this._element, "hide.bs.collapse").defaultPrevented) return; + const t = this._getDimension(); + this._element.style[t] = `${this._element.getBoundingClientRect()[t]}px`, u(this._element), this._element.classList.add(ht), this._element.classList.remove(ct, lt); + const e = this._triggerArray.length; + for (let t = 0; t < e; t++) { + const e = this._triggerArray[t], i = n(e); + i && !this._isShown(i) && this._addAriaAndCollapsedClass([e], !1) + } + this._isTransitioning = !0, this._element.style[t] = "", this._queueCallback((() => { + this._isTransitioning = !1, this._element.classList.remove(ht), this._element.classList.add(ct), j.trigger(this._element, "hidden.bs.collapse") + }), this._element, !0) + } + + _isShown(t = this._element) { + return t.classList.contains(lt) + } + + _getConfig(t) { + return (t = {...rt, ...U.getDataAttributes(this._element), ...t}).toggle = Boolean(t.toggle), t.parent = r(t.parent), a(ot, t, at), t + } + + _getDimension() { + return this._element.classList.contains("collapse-horizontal") ? "width" : "height" + } + + _initializeChildren() { + if (!this._config.parent) return; + const t = V.find(ut, this._config.parent); + V.find(ft, this._config.parent).filter((e => !t.includes(e))).forEach((t => { + const e = n(t); + e && this._addAriaAndCollapsedClass([t], this._isShown(e)) + })) + } + + _addAriaAndCollapsedClass(t, e) { + t.length && t.forEach((t => { + e ? t.classList.remove(dt) : t.classList.add(dt), t.setAttribute("aria-expanded", e) + })) + } + + static jQueryInterface(t) { + return this.each((function () { + const e = {}; + "string" == typeof t && /show|hide/.test(t) && (e.toggle = !1); + const i = pt.getOrCreateInstance(this, e); + if ("string" == typeof t) { + if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); + i[t]() + } + })) + } + } + + j.on(document, "click.bs.collapse.data-api", ft, (function (t) { + ("A" === t.target.tagName || t.delegateTarget && "A" === t.delegateTarget.tagName) && t.preventDefault(); + const e = i(this); + V.find(e).forEach((t => { + pt.getOrCreateInstance(t, {toggle: !1}).toggle() + })) + })), g(pt); + var mt = "top", gt = "bottom", _t = "right", bt = "left", vt = "auto", yt = [mt, gt, _t, bt], wt = "start", + Et = "end", At = "clippingParents", Tt = "viewport", Ot = "popper", Ct = "reference", + kt = yt.reduce((function (t, e) { + return t.concat([e + "-" + wt, e + "-" + Et]) + }), []), Lt = [].concat(yt, [vt]).reduce((function (t, e) { + return t.concat([e, e + "-" + wt, e + "-" + Et]) + }), []), xt = "beforeRead", Dt = "read", St = "afterRead", Nt = "beforeMain", It = "main", Pt = "afterMain", + jt = "beforeWrite", Mt = "write", Ht = "afterWrite", Bt = [xt, Dt, St, Nt, It, Pt, jt, Mt, Ht]; + + function Rt(t) { + return t ? (t.nodeName || "").toLowerCase() : null + } + + function Wt(t) { + if (null == t) return window; + if ("[object Window]" !== t.toString()) { + var e = t.ownerDocument; + return e && e.defaultView || window + } + return t + } + + function $t(t) { + return t instanceof Wt(t).Element || t instanceof Element + } + + function zt(t) { + return t instanceof Wt(t).HTMLElement || t instanceof HTMLElement + } + + function qt(t) { + return "undefined" != typeof ShadowRoot && (t instanceof Wt(t).ShadowRoot || t instanceof ShadowRoot) + } + + const Ft = { + name: "applyStyles", enabled: !0, phase: "write", fn: function (t) { + var e = t.state; + Object.keys(e.elements).forEach((function (t) { + var i = e.styles[t] || {}, n = e.attributes[t] || {}, s = e.elements[t]; + zt(s) && Rt(s) && (Object.assign(s.style, i), Object.keys(n).forEach((function (t) { + var e = n[t]; + !1 === e ? s.removeAttribute(t) : s.setAttribute(t, !0 === e ? "" : e) + }))) + })) + }, effect: function (t) { + var e = t.state, i = { + popper: {position: e.options.strategy, left: "0", top: "0", margin: "0"}, + arrow: {position: "absolute"}, + reference: {} + }; + return Object.assign(e.elements.popper.style, i.popper), e.styles = i, e.elements.arrow && Object.assign(e.elements.arrow.style, i.arrow), function () { + Object.keys(e.elements).forEach((function (t) { + var n = e.elements[t], s = e.attributes[t] || {}, + o = Object.keys(e.styles.hasOwnProperty(t) ? e.styles[t] : i[t]).reduce((function (t, e) { + return t[e] = "", t + }), {}); + zt(n) && Rt(n) && (Object.assign(n.style, o), Object.keys(s).forEach((function (t) { + n.removeAttribute(t) + }))) + })) + } + }, requires: ["computeStyles"] + }; + + function Ut(t) { + return t.split("-")[0] + } + + function Vt(t, e) { + var i = t.getBoundingClientRect(); + return { + width: i.width / 1, + height: i.height / 1, + top: i.top / 1, + right: i.right / 1, + bottom: i.bottom / 1, + left: i.left / 1, + x: i.left / 1, + y: i.top / 1 + } + } + + function Kt(t) { + var e = Vt(t), i = t.offsetWidth, n = t.offsetHeight; + return Math.abs(e.width - i) <= 1 && (i = e.width), Math.abs(e.height - n) <= 1 && (n = e.height), { + x: t.offsetLeft, + y: t.offsetTop, + width: i, + height: n + } + } + + function Xt(t, e) { + var i = e.getRootNode && e.getRootNode(); + if (t.contains(e)) return !0; + if (i && qt(i)) { + var n = e; + do { + if (n && t.isSameNode(n)) return !0; + n = n.parentNode || n.host + } while (n) + } + return !1 + } + + function Yt(t) { + return Wt(t).getComputedStyle(t) + } + + function Qt(t) { + return ["table", "td", "th"].indexOf(Rt(t)) >= 0 + } + + function Gt(t) { + return (($t(t) ? t.ownerDocument : t.document) || window.document).documentElement + } + + function Zt(t) { + return "html" === Rt(t) ? t : t.assignedSlot || t.parentNode || (qt(t) ? t.host : null) || Gt(t) + } + + function Jt(t) { + return zt(t) && "fixed" !== Yt(t).position ? t.offsetParent : null + } + + function te(t) { + for (var e = Wt(t), i = Jt(t); i && Qt(i) && "static" === Yt(i).position;) i = Jt(i); + return i && ("html" === Rt(i) || "body" === Rt(i) && "static" === Yt(i).position) ? e : i || function (t) { + var e = -1 !== navigator.userAgent.toLowerCase().indexOf("firefox"); + if (-1 !== navigator.userAgent.indexOf("Trident") && zt(t) && "fixed" === Yt(t).position) return null; + for (var i = Zt(t); zt(i) && ["html", "body"].indexOf(Rt(i)) < 0;) { + var n = Yt(i); + if ("none" !== n.transform || "none" !== n.perspective || "paint" === n.contain || -1 !== ["transform", "perspective"].indexOf(n.willChange) || e && "filter" === n.willChange || e && n.filter && "none" !== n.filter) return i; + i = i.parentNode + } + return null + }(t) || e + } + + function ee(t) { + return ["top", "bottom"].indexOf(t) >= 0 ? "x" : "y" + } + + var ie = Math.max, ne = Math.min, se = Math.round; + + function oe(t, e, i) { + return ie(t, ne(e, i)) + } + + function re(t) { + return Object.assign({}, {top: 0, right: 0, bottom: 0, left: 0}, t) + } + + function ae(t, e) { + return e.reduce((function (e, i) { + return e[i] = t, e + }), {}) + } + + const le = { + name: "arrow", enabled: !0, phase: "main", fn: function (t) { + var e, i = t.state, n = t.name, s = t.options, o = i.elements.arrow, r = i.modifiersData.popperOffsets, + a = Ut(i.placement), l = ee(a), c = [bt, _t].indexOf(a) >= 0 ? "height" : "width"; + if (o && r) { + var h = function (t, e) { + return re("number" != typeof (t = "function" == typeof t ? t(Object.assign({}, e.rects, {placement: e.placement})) : t) ? t : ae(t, yt)) + }(s.padding, i), d = Kt(o), u = "y" === l ? mt : bt, f = "y" === l ? gt : _t, + p = i.rects.reference[c] + i.rects.reference[l] - r[l] - i.rects.popper[c], + m = r[l] - i.rects.reference[l], g = te(o), + _ = g ? "y" === l ? g.clientHeight || 0 : g.clientWidth || 0 : 0, b = p / 2 - m / 2, v = h[u], + y = _ - d[c] - h[f], w = _ / 2 - d[c] / 2 + b, E = oe(v, w, y), A = l; + i.modifiersData[n] = ((e = {})[A] = E, e.centerOffset = E - w, e) + } + }, effect: function (t) { + var e = t.state, i = t.options.element, n = void 0 === i ? "[data-popper-arrow]" : i; + null != n && ("string" != typeof n || (n = e.elements.popper.querySelector(n))) && Xt(e.elements.popper, n) && (e.elements.arrow = n) + }, requires: ["popperOffsets"], requiresIfExists: ["preventOverflow"] + }; + + function ce(t) { + return t.split("-")[1] + } + + var he = {top: "auto", right: "auto", bottom: "auto", left: "auto"}; + + function de(t) { + var e, i = t.popper, n = t.popperRect, s = t.placement, o = t.variation, r = t.offsets, a = t.position, + l = t.gpuAcceleration, c = t.adaptive, h = t.roundOffsets, d = !0 === h ? function (t) { + var e = t.x, i = t.y, n = window.devicePixelRatio || 1; + return {x: se(se(e * n) / n) || 0, y: se(se(i * n) / n) || 0} + }(r) : "function" == typeof h ? h(r) : r, u = d.x, f = void 0 === u ? 0 : u, p = d.y, m = void 0 === p ? 0 : p, + g = r.hasOwnProperty("x"), _ = r.hasOwnProperty("y"), b = bt, v = mt, y = window; + if (c) { + var w = te(i), E = "clientHeight", A = "clientWidth"; + w === Wt(i) && "static" !== Yt(w = Gt(i)).position && "absolute" === a && (E = "scrollHeight", A = "scrollWidth"), w = w, s !== mt && (s !== bt && s !== _t || o !== Et) || (v = gt, m -= w[E] - n.height, m *= l ? 1 : -1), s !== bt && (s !== mt && s !== gt || o !== Et) || (b = _t, f -= w[A] - n.width, f *= l ? 1 : -1) + } + var T, O = Object.assign({position: a}, c && he); + return l ? Object.assign({}, O, ((T = {})[v] = _ ? "0" : "", T[b] = g ? "0" : "", T.transform = (y.devicePixelRatio || 1) <= 1 ? "translate(" + f + "px, " + m + "px)" : "translate3d(" + f + "px, " + m + "px, 0)", T)) : Object.assign({}, O, ((e = {})[v] = _ ? m + "px" : "", e[b] = g ? f + "px" : "", e.transform = "", e)) + } + + const ue = { + name: "computeStyles", enabled: !0, phase: "beforeWrite", fn: function (t) { + var e = t.state, i = t.options, n = i.gpuAcceleration, s = void 0 === n || n, o = i.adaptive, + r = void 0 === o || o, a = i.roundOffsets, l = void 0 === a || a, c = { + placement: Ut(e.placement), + variation: ce(e.placement), + popper: e.elements.popper, + popperRect: e.rects.popper, + gpuAcceleration: s + }; + null != e.modifiersData.popperOffsets && (e.styles.popper = Object.assign({}, e.styles.popper, de(Object.assign({}, c, { + offsets: e.modifiersData.popperOffsets, + position: e.options.strategy, + adaptive: r, + roundOffsets: l + })))), null != e.modifiersData.arrow && (e.styles.arrow = Object.assign({}, e.styles.arrow, de(Object.assign({}, c, { + offsets: e.modifiersData.arrow, + position: "absolute", + adaptive: !1, + roundOffsets: l + })))), e.attributes.popper = Object.assign({}, e.attributes.popper, {"data-popper-placement": e.placement}) + }, data: {} + }; + var fe = {passive: !0}; + const pe = { + name: "eventListeners", enabled: !0, phase: "write", fn: function () { + }, effect: function (t) { + var e = t.state, i = t.instance, n = t.options, s = n.scroll, o = void 0 === s || s, r = n.resize, + a = void 0 === r || r, l = Wt(e.elements.popper), + c = [].concat(e.scrollParents.reference, e.scrollParents.popper); + return o && c.forEach((function (t) { + t.addEventListener("scroll", i.update, fe) + })), a && l.addEventListener("resize", i.update, fe), function () { + o && c.forEach((function (t) { + t.removeEventListener("scroll", i.update, fe) + })), a && l.removeEventListener("resize", i.update, fe) + } + }, data: {} + }; + var me = {left: "right", right: "left", bottom: "top", top: "bottom"}; + + function ge(t) { + return t.replace(/left|right|bottom|top/g, (function (t) { + return me[t] + })) + } + + var _e = {start: "end", end: "start"}; + + function be(t) { + return t.replace(/start|end/g, (function (t) { + return _e[t] + })) + } + + function ve(t) { + var e = Wt(t); + return {scrollLeft: e.pageXOffset, scrollTop: e.pageYOffset} + } + + function ye(t) { + return Vt(Gt(t)).left + ve(t).scrollLeft + } + + function we(t) { + var e = Yt(t), i = e.overflow, n = e.overflowX, s = e.overflowY; + return /auto|scroll|overlay|hidden/.test(i + s + n) + } + + function Ee(t) { + return ["html", "body", "#document"].indexOf(Rt(t)) >= 0 ? t.ownerDocument.body : zt(t) && we(t) ? t : Ee(Zt(t)) + } + + function Ae(t, e) { + var i; + void 0 === e && (e = []); + var n = Ee(t), s = n === (null == (i = t.ownerDocument) ? void 0 : i.body), o = Wt(n), + r = s ? [o].concat(o.visualViewport || [], we(n) ? n : []) : n, a = e.concat(r); + return s ? a : a.concat(Ae(Zt(r))) + } + + function Te(t) { + return Object.assign({}, t, {left: t.x, top: t.y, right: t.x + t.width, bottom: t.y + t.height}) + } + + function Oe(t, e) { + return e === Tt ? Te(function (t) { + var e = Wt(t), i = Gt(t), n = e.visualViewport, s = i.clientWidth, o = i.clientHeight, r = 0, a = 0; + return n && (s = n.width, o = n.height, /^((?!chrome|android).)*safari/i.test(navigator.userAgent) || (r = n.offsetLeft, a = n.offsetTop)), { + width: s, + height: o, + x: r + ye(t), + y: a + } + }(t)) : zt(e) ? function (t) { + var e = Vt(t); + return e.top = e.top + t.clientTop, e.left = e.left + t.clientLeft, e.bottom = e.top + t.clientHeight, e.right = e.left + t.clientWidth, e.width = t.clientWidth, e.height = t.clientHeight, e.x = e.left, e.y = e.top, e + }(e) : Te(function (t) { + var e, i = Gt(t), n = ve(t), s = null == (e = t.ownerDocument) ? void 0 : e.body, + o = ie(i.scrollWidth, i.clientWidth, s ? s.scrollWidth : 0, s ? s.clientWidth : 0), + r = ie(i.scrollHeight, i.clientHeight, s ? s.scrollHeight : 0, s ? s.clientHeight : 0), + a = -n.scrollLeft + ye(t), l = -n.scrollTop; + return "rtl" === Yt(s || i).direction && (a += ie(i.clientWidth, s ? s.clientWidth : 0) - o), { + width: o, + height: r, + x: a, + y: l + } + }(Gt(t))) + } + + function Ce(t) { + var e, i = t.reference, n = t.element, s = t.placement, o = s ? Ut(s) : null, r = s ? ce(s) : null, + a = i.x + i.width / 2 - n.width / 2, l = i.y + i.height / 2 - n.height / 2; + switch (o) { + case mt: + e = {x: a, y: i.y - n.height}; + break; + case gt: + e = {x: a, y: i.y + i.height}; + break; + case _t: + e = {x: i.x + i.width, y: l}; + break; + case bt: + e = {x: i.x - n.width, y: l}; + break; + default: + e = {x: i.x, y: i.y} + } + var c = o ? ee(o) : null; + if (null != c) { + var h = "y" === c ? "height" : "width"; + switch (r) { + case wt: + e[c] = e[c] - (i[h] / 2 - n[h] / 2); + break; + case Et: + e[c] = e[c] + (i[h] / 2 - n[h] / 2) + } + } + return e + } + + function ke(t, e) { + void 0 === e && (e = {}); + var i = e, n = i.placement, s = void 0 === n ? t.placement : n, o = i.boundary, r = void 0 === o ? At : o, + a = i.rootBoundary, l = void 0 === a ? Tt : a, c = i.elementContext, h = void 0 === c ? Ot : c, + d = i.altBoundary, u = void 0 !== d && d, f = i.padding, p = void 0 === f ? 0 : f, + m = re("number" != typeof p ? p : ae(p, yt)), g = h === Ot ? Ct : Ot, _ = t.rects.popper, + b = t.elements[u ? g : h], v = function (t, e, i) { + var n = "clippingParents" === e ? function (t) { + var e = Ae(Zt(t)), i = ["absolute", "fixed"].indexOf(Yt(t).position) >= 0 && zt(t) ? te(t) : t; + return $t(i) ? e.filter((function (t) { + return $t(t) && Xt(t, i) && "body" !== Rt(t) + })) : [] + }(t) : [].concat(e), s = [].concat(n, [i]), o = s[0], r = s.reduce((function (e, i) { + var n = Oe(t, i); + return e.top = ie(n.top, e.top), e.right = ne(n.right, e.right), e.bottom = ne(n.bottom, e.bottom), e.left = ie(n.left, e.left), e + }), Oe(t, o)); + return r.width = r.right - r.left, r.height = r.bottom - r.top, r.x = r.left, r.y = r.top, r + }($t(b) ? b : b.contextElement || Gt(t.elements.popper), r, l), y = Vt(t.elements.reference), + w = Ce({reference: y, element: _, strategy: "absolute", placement: s}), E = Te(Object.assign({}, _, w)), + A = h === Ot ? E : y, T = { + top: v.top - A.top + m.top, + bottom: A.bottom - v.bottom + m.bottom, + left: v.left - A.left + m.left, + right: A.right - v.right + m.right + }, O = t.modifiersData.offset; + if (h === Ot && O) { + var C = O[s]; + Object.keys(T).forEach((function (t) { + var e = [_t, gt].indexOf(t) >= 0 ? 1 : -1, i = [mt, gt].indexOf(t) >= 0 ? "y" : "x"; + T[t] += C[i] * e + })) + } + return T + } + + function Le(t, e) { + void 0 === e && (e = {}); + var i = e, n = i.placement, s = i.boundary, o = i.rootBoundary, r = i.padding, a = i.flipVariations, + l = i.allowedAutoPlacements, c = void 0 === l ? Lt : l, h = ce(n), + d = h ? a ? kt : kt.filter((function (t) { + return ce(t) === h + })) : yt, u = d.filter((function (t) { + return c.indexOf(t) >= 0 + })); + 0 === u.length && (u = d); + var f = u.reduce((function (e, i) { + return e[i] = ke(t, {placement: i, boundary: s, rootBoundary: o, padding: r})[Ut(i)], e + }), {}); + return Object.keys(f).sort((function (t, e) { + return f[t] - f[e] + })) + } + + const xe = { + name: "flip", enabled: !0, phase: "main", fn: function (t) { + var e = t.state, i = t.options, n = t.name; + if (!e.modifiersData[n]._skip) { + for (var s = i.mainAxis, o = void 0 === s || s, r = i.altAxis, a = void 0 === r || r, l = i.fallbackPlacements, c = i.padding, h = i.boundary, d = i.rootBoundary, u = i.altBoundary, f = i.flipVariations, p = void 0 === f || f, m = i.allowedAutoPlacements, g = e.options.placement, _ = Ut(g), b = l || (_ !== g && p ? function (t) { + if (Ut(t) === vt) return []; + var e = ge(t); + return [be(t), e, be(e)] + }(g) : [ge(g)]), v = [g].concat(b).reduce((function (t, i) { + return t.concat(Ut(i) === vt ? Le(e, { + placement: i, + boundary: h, + rootBoundary: d, + padding: c, + flipVariations: p, + allowedAutoPlacements: m + }) : i) + }), []), y = e.rects.reference, w = e.rects.popper, E = new Map, A = !0, T = v[0], O = 0; O < v.length; O++) { + var C = v[O], k = Ut(C), L = ce(C) === wt, x = [mt, gt].indexOf(k) >= 0, D = x ? "width" : "height", + S = ke(e, {placement: C, boundary: h, rootBoundary: d, altBoundary: u, padding: c}), + N = x ? L ? _t : bt : L ? gt : mt; + y[D] > w[D] && (N = ge(N)); + var I = ge(N), P = []; + if (o && P.push(S[k] <= 0), a && P.push(S[N] <= 0, S[I] <= 0), P.every((function (t) { + return t + }))) { + T = C, A = !1; + break + } + E.set(C, P) + } + if (A) for (var j = function (t) { + var e = v.find((function (e) { + var i = E.get(e); + if (i) return i.slice(0, t).every((function (t) { + return t + })) + })); + if (e) return T = e, "break" + }, M = p ? 3 : 1; M > 0 && "break" !== j(M); M--) ; + e.placement !== T && (e.modifiersData[n]._skip = !0, e.placement = T, e.reset = !0) + } + }, requiresIfExists: ["offset"], data: {_skip: !1} + }; + + function De(t, e, i) { + return void 0 === i && (i = {x: 0, y: 0}), { + top: t.top - e.height - i.y, + right: t.right - e.width + i.x, + bottom: t.bottom - e.height + i.y, + left: t.left - e.width - i.x + } + } + + function Se(t) { + return [mt, _t, gt, bt].some((function (e) { + return t[e] >= 0 + })) + } + + const Ne = { + name: "hide", enabled: !0, phase: "main", requiresIfExists: ["preventOverflow"], fn: function (t) { + var e = t.state, i = t.name, n = e.rects.reference, s = e.rects.popper, o = e.modifiersData.preventOverflow, + r = ke(e, {elementContext: "reference"}), a = ke(e, {altBoundary: !0}), l = De(r, n), c = De(a, s, o), + h = Se(l), d = Se(c); + e.modifiersData[i] = { + referenceClippingOffsets: l, + popperEscapeOffsets: c, + isReferenceHidden: h, + hasPopperEscaped: d + }, e.attributes.popper = Object.assign({}, e.attributes.popper, { + "data-popper-reference-hidden": h, + "data-popper-escaped": d + }) + } + }, Ie = { + name: "offset", enabled: !0, phase: "main", requires: ["popperOffsets"], fn: function (t) { + var e = t.state, i = t.options, n = t.name, s = i.offset, o = void 0 === s ? [0, 0] : s, + r = Lt.reduce((function (t, i) { + return t[i] = function (t, e, i) { + var n = Ut(t), s = [bt, mt].indexOf(n) >= 0 ? -1 : 1, + o = "function" == typeof i ? i(Object.assign({}, e, {placement: t})) : i, r = o[0], + a = o[1]; + return r = r || 0, a = (a || 0) * s, [bt, _t].indexOf(n) >= 0 ? {x: a, y: r} : {x: r, y: a} + }(i, e.rects, o), t + }), {}), a = r[e.placement], l = a.x, c = a.y; + null != e.modifiersData.popperOffsets && (e.modifiersData.popperOffsets.x += l, e.modifiersData.popperOffsets.y += c), e.modifiersData[n] = r + } + }, Pe = { + name: "popperOffsets", enabled: !0, phase: "read", fn: function (t) { + var e = t.state, i = t.name; + e.modifiersData[i] = Ce({ + reference: e.rects.reference, + element: e.rects.popper, + strategy: "absolute", + placement: e.placement + }) + }, data: {} + }, je = { + name: "preventOverflow", enabled: !0, phase: "main", fn: function (t) { + var e = t.state, i = t.options, n = t.name, s = i.mainAxis, o = void 0 === s || s, r = i.altAxis, + a = void 0 !== r && r, l = i.boundary, c = i.rootBoundary, h = i.altBoundary, d = i.padding, + u = i.tether, f = void 0 === u || u, p = i.tetherOffset, m = void 0 === p ? 0 : p, + g = ke(e, {boundary: l, rootBoundary: c, padding: d, altBoundary: h}), _ = Ut(e.placement), + b = ce(e.placement), v = !b, y = ee(_), w = "x" === y ? "y" : "x", E = e.modifiersData.popperOffsets, + A = e.rects.reference, T = e.rects.popper, + O = "function" == typeof m ? m(Object.assign({}, e.rects, {placement: e.placement})) : m, + C = {x: 0, y: 0}; + if (E) { + if (o || a) { + var k = "y" === y ? mt : bt, L = "y" === y ? gt : _t, x = "y" === y ? "height" : "width", D = E[y], + S = E[y] + g[k], N = E[y] - g[L], I = f ? -T[x] / 2 : 0, P = b === wt ? A[x] : T[x], + j = b === wt ? -T[x] : -A[x], M = e.elements.arrow, H = f && M ? Kt(M) : {width: 0, height: 0}, + B = e.modifiersData["arrow#persistent"] ? e.modifiersData["arrow#persistent"].padding : { + top: 0, + right: 0, + bottom: 0, + left: 0 + }, R = B[k], W = B[L], $ = oe(0, A[x], H[x]), z = v ? A[x] / 2 - I - $ - R - O : P - $ - R - O, + q = v ? -A[x] / 2 + I + $ + W + O : j + $ + W + O, F = e.elements.arrow && te(e.elements.arrow), + U = F ? "y" === y ? F.clientTop || 0 : F.clientLeft || 0 : 0, + V = e.modifiersData.offset ? e.modifiersData.offset[e.placement][y] : 0, K = E[y] + z - V - U, + X = E[y] + q - V; + if (o) { + var Y = oe(f ? ne(S, K) : S, D, f ? ie(N, X) : N); + E[y] = Y, C[y] = Y - D + } + if (a) { + var Q = "x" === y ? mt : bt, G = "x" === y ? gt : _t, Z = E[w], J = Z + g[Q], tt = Z - g[G], + et = oe(f ? ne(J, K) : J, Z, f ? ie(tt, X) : tt); + E[w] = et, C[w] = et - Z + } + } + e.modifiersData[n] = C + } + }, requiresIfExists: ["offset"] + }; + + function Me(t, e, i) { + void 0 === i && (i = !1); + var n = zt(e); + zt(e) && function (t) { + var e = t.getBoundingClientRect(); + e.width, t.offsetWidth, e.height, t.offsetHeight + }(e); + var s, o, r = Gt(e), a = Vt(t), l = {scrollLeft: 0, scrollTop: 0}, c = {x: 0, y: 0}; + return (n || !n && !i) && (("body" !== Rt(e) || we(r)) && (l = (s = e) !== Wt(s) && zt(s) ? { + scrollLeft: (o = s).scrollLeft, + scrollTop: o.scrollTop + } : ve(s)), zt(e) ? ((c = Vt(e)).x += e.clientLeft, c.y += e.clientTop) : r && (c.x = ye(r))), { + x: a.left + l.scrollLeft - c.x, + y: a.top + l.scrollTop - c.y, + width: a.width, + height: a.height + } + } + + function He(t) { + var e = new Map, i = new Set, n = []; + + function s(t) { + i.add(t.name), [].concat(t.requires || [], t.requiresIfExists || []).forEach((function (t) { + if (!i.has(t)) { + var n = e.get(t); + n && s(n) + } + })), n.push(t) + } + + return t.forEach((function (t) { + e.set(t.name, t) + })), t.forEach((function (t) { + i.has(t.name) || s(t) + })), n + } + + var Be = {placement: "bottom", modifiers: [], strategy: "absolute"}; + + function Re() { + for (var t = arguments.length, e = new Array(t), i = 0; i < t; i++) e[i] = arguments[i]; + return !e.some((function (t) { + return !(t && "function" == typeof t.getBoundingClientRect) + })) + } + + function We(t) { + void 0 === t && (t = {}); + var e = t, i = e.defaultModifiers, n = void 0 === i ? [] : i, s = e.defaultOptions, o = void 0 === s ? Be : s; + return function (t, e, i) { + void 0 === i && (i = o); + var s, r, a = { + placement: "bottom", + orderedModifiers: [], + options: Object.assign({}, Be, o), + modifiersData: {}, + elements: {reference: t, popper: e}, + attributes: {}, + styles: {} + }, l = [], c = !1, h = { + state: a, setOptions: function (i) { + var s = "function" == typeof i ? i(a.options) : i; + d(), a.options = Object.assign({}, o, a.options, s), a.scrollParents = { + reference: $t(t) ? Ae(t) : t.contextElement ? Ae(t.contextElement) : [], + popper: Ae(e) + }; + var r, c, u = function (t) { + var e = He(t); + return Bt.reduce((function (t, i) { + return t.concat(e.filter((function (t) { + return t.phase === i + }))) + }), []) + }((r = [].concat(n, a.options.modifiers), c = r.reduce((function (t, e) { + var i = t[e.name]; + return t[e.name] = i ? Object.assign({}, i, e, { + options: Object.assign({}, i.options, e.options), + data: Object.assign({}, i.data, e.data) + }) : e, t + }), {}), Object.keys(c).map((function (t) { + return c[t] + })))); + return a.orderedModifiers = u.filter((function (t) { + return t.enabled + })), a.orderedModifiers.forEach((function (t) { + var e = t.name, i = t.options, n = void 0 === i ? {} : i, s = t.effect; + if ("function" == typeof s) { + var o = s({state: a, name: e, instance: h, options: n}); + l.push(o || function () { + }) + } + })), h.update() + }, forceUpdate: function () { + if (!c) { + var t = a.elements, e = t.reference, i = t.popper; + if (Re(e, i)) { + a.rects = { + reference: Me(e, te(i), "fixed" === a.options.strategy), + popper: Kt(i) + }, a.reset = !1, a.placement = a.options.placement, a.orderedModifiers.forEach((function (t) { + return a.modifiersData[t.name] = Object.assign({}, t.data) + })); + for (var n = 0; n < a.orderedModifiers.length; n++) if (!0 !== a.reset) { + var s = a.orderedModifiers[n], o = s.fn, r = s.options, l = void 0 === r ? {} : r, + d = s.name; + "function" == typeof o && (a = o({state: a, options: l, name: d, instance: h}) || a) + } else a.reset = !1, n = -1 + } + } + }, update: (s = function () { + return new Promise((function (t) { + h.forceUpdate(), t(a) + })) + }, function () { + return r || (r = new Promise((function (t) { + Promise.resolve().then((function () { + r = void 0, t(s()) + })) + }))), r + }), destroy: function () { + d(), c = !0 + } + }; + if (!Re(t, e)) return h; + + function d() { + l.forEach((function (t) { + return t() + })), l = [] + } + + return h.setOptions(i).then((function (t) { + !c && i.onFirstUpdate && i.onFirstUpdate(t) + })), h + } + } + + var $e = We(), ze = We({defaultModifiers: [pe, Pe, ue, Ft]}), + qe = We({defaultModifiers: [pe, Pe, ue, Ft, Ie, xe, je, le, Ne]}); + const Fe = Object.freeze({ + __proto__: null, + popperGenerator: We, + detectOverflow: ke, + createPopperBase: $e, + createPopper: qe, + createPopperLite: ze, + top: mt, + bottom: gt, + right: _t, + left: bt, + auto: vt, + basePlacements: yt, + start: wt, + end: Et, + clippingParents: At, + viewport: Tt, + popper: Ot, + reference: Ct, + variationPlacements: kt, + placements: Lt, + beforeRead: xt, + read: Dt, + afterRead: St, + beforeMain: Nt, + main: It, + afterMain: Pt, + beforeWrite: jt, + write: Mt, + afterWrite: Ht, + modifierPhases: Bt, + applyStyles: Ft, + arrow: le, + computeStyles: ue, + eventListeners: pe, + flip: xe, + hide: Ne, + offset: Ie, + popperOffsets: Pe, + preventOverflow: je + }), Ue = "dropdown", Ve = "Escape", Ke = "Space", Xe = "ArrowUp", Ye = "ArrowDown", + Qe = new RegExp("ArrowUp|ArrowDown|Escape"), Ge = "click.bs.dropdown.data-api", + Ze = "keydown.bs.dropdown.data-api", Je = "show", ti = '[data-bs-toggle="dropdown"]', ei = ".dropdown-menu", + ii = m() ? "top-end" : "top-start", ni = m() ? "top-start" : "top-end", + si = m() ? "bottom-end" : "bottom-start", oi = m() ? "bottom-start" : "bottom-end", + ri = m() ? "left-start" : "right-start", ai = m() ? "right-start" : "left-start", li = { + offset: [0, 2], + boundary: "clippingParents", + reference: "toggle", + display: "dynamic", + popperConfig: null, + autoClose: !0 + }, ci = { + offset: "(array|string|function)", + boundary: "(string|element)", + reference: "(string|element|object)", + display: "string", + popperConfig: "(null|object|function)", + autoClose: "(boolean|string)" + }; + + class hi extends B { + constructor(t, e) { + super(t), this._popper = null, this._config = this._getConfig(e), this._menu = this._getMenuElement(), this._inNavbar = this._detectNavbar() + } + + static get Default() { + return li + } + + static get DefaultType() { + return ci + } + + static get NAME() { + return Ue + } + + toggle() { + return this._isShown() ? this.hide() : this.show() + } + + show() { + if (c(this._element) || this._isShown(this._menu)) return; + const t = {relatedTarget: this._element}; + if (j.trigger(this._element, "show.bs.dropdown", t).defaultPrevented) return; + const e = hi.getParentFromElement(this._element); + this._inNavbar ? U.setDataAttribute(this._menu, "popper", "none") : this._createPopper(e), "ontouchstart" in document.documentElement && !e.closest(".navbar-nav") && [].concat(...document.body.children).forEach((t => j.on(t, "mouseover", d))), this._element.focus(), this._element.setAttribute("aria-expanded", !0), this._menu.classList.add(Je), this._element.classList.add(Je), j.trigger(this._element, "shown.bs.dropdown", t) + } + + hide() { + if (c(this._element) || !this._isShown(this._menu)) return; + const t = {relatedTarget: this._element}; + this._completeHide(t) + } + + dispose() { + this._popper && this._popper.destroy(), super.dispose() + } + + update() { + this._inNavbar = this._detectNavbar(), this._popper && this._popper.update() + } + + _completeHide(t) { + j.trigger(this._element, "hide.bs.dropdown", t).defaultPrevented || ("ontouchstart" in document.documentElement && [].concat(...document.body.children).forEach((t => j.off(t, "mouseover", d))), this._popper && this._popper.destroy(), this._menu.classList.remove(Je), this._element.classList.remove(Je), this._element.setAttribute("aria-expanded", "false"), U.removeDataAttribute(this._menu, "popper"), j.trigger(this._element, "hidden.bs.dropdown", t)) + } + + _getConfig(t) { + if (t = {...this.constructor.Default, ...U.getDataAttributes(this._element), ...t}, a(Ue, t, this.constructor.DefaultType), "object" == typeof t.reference && !o(t.reference) && "function" != typeof t.reference.getBoundingClientRect) throw new TypeError(`${Ue.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); + return t + } + + _createPopper(t) { + if (void 0 === Fe) throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); + let e = this._element; + "parent" === this._config.reference ? e = t : o(this._config.reference) ? e = r(this._config.reference) : "object" == typeof this._config.reference && (e = this._config.reference); + const i = this._getPopperConfig(), + n = i.modifiers.find((t => "applyStyles" === t.name && !1 === t.enabled)); + this._popper = qe(e, this._menu, i), n && U.setDataAttribute(this._menu, "popper", "static") + } + + _isShown(t = this._element) { + return t.classList.contains(Je) + } + + _getMenuElement() { + return V.next(this._element, ei)[0] + } + + _getPlacement() { + const t = this._element.parentNode; + if (t.classList.contains("dropend")) return ri; + if (t.classList.contains("dropstart")) return ai; + const e = "end" === getComputedStyle(this._menu).getPropertyValue("--bs-position").trim(); + return t.classList.contains("dropup") ? e ? ni : ii : e ? oi : si + } + + _detectNavbar() { + return null !== this._element.closest(".navbar") + } + + _getOffset() { + const {offset: t} = this._config; + return "string" == typeof t ? t.split(",").map((t => Number.parseInt(t, 10))) : "function" == typeof t ? e => t(e, this._element) : t + } + + _getPopperConfig() { + const t = { + placement: this._getPlacement(), + modifiers: [{name: "preventOverflow", options: {boundary: this._config.boundary}}, { + name: "offset", + options: {offset: this._getOffset()} + }] + }; + return "static" === this._config.display && (t.modifiers = [{ + name: "applyStyles", + enabled: !1 + }]), {...t, ..."function" == typeof this._config.popperConfig ? this._config.popperConfig(t) : this._config.popperConfig} + } + + _selectMenuItem({key: t, target: e}) { + const i = V.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)", this._menu).filter(l); + i.length && v(i, e, t === Ye, !i.includes(e)).focus() + } + + static jQueryInterface(t) { + return this.each((function () { + const e = hi.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + + static clearMenus(t) { + if (t && (2 === t.button || "keyup" === t.type && "Tab" !== t.key)) return; + const e = V.find(ti); + for (let i = 0, n = e.length; i < n; i++) { + const n = hi.getInstance(e[i]); + if (!n || !1 === n._config.autoClose) continue; + if (!n._isShown()) continue; + const s = {relatedTarget: n._element}; + if (t) { + const e = t.composedPath(), i = e.includes(n._menu); + if (e.includes(n._element) || "inside" === n._config.autoClose && !i || "outside" === n._config.autoClose && i) continue; + if (n._menu.contains(t.target) && ("keyup" === t.type && "Tab" === t.key || /input|select|option|textarea|form/i.test(t.target.tagName))) continue; + "click" === t.type && (s.clickEvent = t) + } + n._completeHide(s) + } + } + + static getParentFromElement(t) { + return n(t) || t.parentNode + } + + static dataApiKeydownHandler(t) { + if (/input|textarea/i.test(t.target.tagName) ? t.key === Ke || t.key !== Ve && (t.key !== Ye && t.key !== Xe || t.target.closest(ei)) : !Qe.test(t.key)) return; + const e = this.classList.contains(Je); + if (!e && t.key === Ve) return; + if (t.preventDefault(), t.stopPropagation(), c(this)) return; + const i = this.matches(ti) ? this : V.prev(this, ti)[0], n = hi.getOrCreateInstance(i); + if (t.key !== Ve) return t.key === Xe || t.key === Ye ? (e || n.show(), void n._selectMenuItem(t)) : void (e && t.key !== Ke || hi.clearMenus()); + n.hide() + } + } + + j.on(document, Ze, ti, hi.dataApiKeydownHandler), j.on(document, Ze, ei, hi.dataApiKeydownHandler), j.on(document, Ge, hi.clearMenus), j.on(document, "keyup.bs.dropdown.data-api", hi.clearMenus), j.on(document, Ge, ti, (function (t) { + t.preventDefault(), hi.getOrCreateInstance(this).toggle() + })), g(hi); + const di = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top", ui = ".sticky-top"; + + class fi { + constructor() { + this._element = document.body + } + + getWidth() { + const t = document.documentElement.clientWidth; + return Math.abs(window.innerWidth - t) + } + + hide() { + const t = this.getWidth(); + this._disableOverFlow(), this._setElementAttributes(this._element, "paddingRight", (e => e + t)), this._setElementAttributes(di, "paddingRight", (e => e + t)), this._setElementAttributes(ui, "marginRight", (e => e - t)) + } + + _disableOverFlow() { + this._saveInitialAttribute(this._element, "overflow"), this._element.style.overflow = "hidden" + } + + _setElementAttributes(t, e, i) { + const n = this.getWidth(); + this._applyManipulationCallback(t, (t => { + if (t !== this._element && window.innerWidth > t.clientWidth + n) return; + this._saveInitialAttribute(t, e); + const s = window.getComputedStyle(t)[e]; + t.style[e] = `${i(Number.parseFloat(s))}px` + })) + } + + reset() { + this._resetElementAttributes(this._element, "overflow"), this._resetElementAttributes(this._element, "paddingRight"), this._resetElementAttributes(di, "paddingRight"), this._resetElementAttributes(ui, "marginRight") + } + + _saveInitialAttribute(t, e) { + const i = t.style[e]; + i && U.setDataAttribute(t, e, i) + } + + _resetElementAttributes(t, e) { + this._applyManipulationCallback(t, (t => { + const i = U.getDataAttribute(t, e); + void 0 === i ? t.style.removeProperty(e) : (U.removeDataAttribute(t, e), t.style[e] = i) + })) + } + + _applyManipulationCallback(t, e) { + o(t) ? e(t) : V.find(t, this._element).forEach(e) + } + + isOverflowing() { + return this.getWidth() > 0 + } + } + + const pi = {className: "modal-backdrop", isVisible: !0, isAnimated: !1, rootElement: "body", clickCallback: null}, + mi = { + className: "string", + isVisible: "boolean", + isAnimated: "boolean", + rootElement: "(element|string)", + clickCallback: "(function|null)" + }, gi = "show", _i = "mousedown.bs.backdrop"; + + class bi { + constructor(t) { + this._config = this._getConfig(t), this._isAppended = !1, this._element = null + } + + show(t) { + this._config.isVisible ? (this._append(), this._config.isAnimated && u(this._getElement()), this._getElement().classList.add(gi), this._emulateAnimation((() => { + _(t) + }))) : _(t) + } + + hide(t) { + this._config.isVisible ? (this._getElement().classList.remove(gi), this._emulateAnimation((() => { + this.dispose(), _(t) + }))) : _(t) + } + + _getElement() { + if (!this._element) { + const t = document.createElement("div"); + t.className = this._config.className, this._config.isAnimated && t.classList.add("fade"), this._element = t + } + return this._element + } + + _getConfig(t) { + return (t = {...pi, ..."object" == typeof t ? t : {}}).rootElement = r(t.rootElement), a("backdrop", t, mi), t + } + + _append() { + this._isAppended || (this._config.rootElement.append(this._getElement()), j.on(this._getElement(), _i, (() => { + _(this._config.clickCallback) + })), this._isAppended = !0) + } + + dispose() { + this._isAppended && (j.off(this._element, _i), this._element.remove(), this._isAppended = !1) + } + + _emulateAnimation(t) { + b(t, this._getElement(), this._config.isAnimated) + } + } + + const vi = {trapElement: null, autofocus: !0}, yi = {trapElement: "element", autofocus: "boolean"}, + wi = ".bs.focustrap", Ei = "backward"; + + class Ai { + constructor(t) { + this._config = this._getConfig(t), this._isActive = !1, this._lastTabNavDirection = null + } + + activate() { + const {trapElement: t, autofocus: e} = this._config; + this._isActive || (e && t.focus(), j.off(document, wi), j.on(document, "focusin.bs.focustrap", (t => this._handleFocusin(t))), j.on(document, "keydown.tab.bs.focustrap", (t => this._handleKeydown(t))), this._isActive = !0) + } + + deactivate() { + this._isActive && (this._isActive = !1, j.off(document, wi)) + } + + _handleFocusin(t) { + const {target: e} = t, {trapElement: i} = this._config; + if (e === document || e === i || i.contains(e)) return; + const n = V.focusableChildren(i); + 0 === n.length ? i.focus() : this._lastTabNavDirection === Ei ? n[n.length - 1].focus() : n[0].focus() + } + + _handleKeydown(t) { + "Tab" === t.key && (this._lastTabNavDirection = t.shiftKey ? Ei : "forward") + } + + _getConfig(t) { + return t = {...vi, ..."object" == typeof t ? t : {}}, a("focustrap", t, yi), t + } + } + + const Ti = "modal", Oi = "Escape", Ci = {backdrop: !0, keyboard: !0, focus: !0}, + ki = {backdrop: "(boolean|string)", keyboard: "boolean", focus: "boolean"}, Li = "hidden.bs.modal", + xi = "show.bs.modal", Di = "resize.bs.modal", Si = "click.dismiss.bs.modal", Ni = "keydown.dismiss.bs.modal", + Ii = "mousedown.dismiss.bs.modal", Pi = "modal-open", ji = "show", Mi = "modal-static"; + + class Hi extends B { + constructor(t, e) { + super(t), this._config = this._getConfig(e), this._dialog = V.findOne(".modal-dialog", this._element), this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._isShown = !1, this._ignoreBackdropClick = !1, this._isTransitioning = !1, this._scrollBar = new fi + } + + static get Default() { + return Ci + } + + static get NAME() { + return Ti + } + + toggle(t) { + return this._isShown ? this.hide() : this.show(t) + } + + show(t) { + this._isShown || this._isTransitioning || j.trigger(this._element, xi, {relatedTarget: t}).defaultPrevented || (this._isShown = !0, this._isAnimated() && (this._isTransitioning = !0), this._scrollBar.hide(), document.body.classList.add(Pi), this._adjustDialog(), this._setEscapeEvent(), this._setResizeEvent(), j.on(this._dialog, Ii, (() => { + j.one(this._element, "mouseup.dismiss.bs.modal", (t => { + t.target === this._element && (this._ignoreBackdropClick = !0) + })) + })), this._showBackdrop((() => this._showElement(t)))) + } + + hide() { + if (!this._isShown || this._isTransitioning) return; + if (j.trigger(this._element, "hide.bs.modal").defaultPrevented) return; + this._isShown = !1; + const t = this._isAnimated(); + t && (this._isTransitioning = !0), this._setEscapeEvent(), this._setResizeEvent(), this._focustrap.deactivate(), this._element.classList.remove(ji), j.off(this._element, Si), j.off(this._dialog, Ii), this._queueCallback((() => this._hideModal()), this._element, t) + } + + dispose() { + [window, this._dialog].forEach((t => j.off(t, ".bs.modal"))), this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() + } + + handleUpdate() { + this._adjustDialog() + } + + _initializeBackDrop() { + return new bi({isVisible: Boolean(this._config.backdrop), isAnimated: this._isAnimated()}) + } + + _initializeFocusTrap() { + return new Ai({trapElement: this._element}) + } + + _getConfig(t) { + return t = {...Ci, ...U.getDataAttributes(this._element), ..."object" == typeof t ? t : {}}, a(Ti, t, ki), t + } + + _showElement(t) { + const e = this._isAnimated(), i = V.findOne(".modal-body", this._dialog); + this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE || document.body.append(this._element), this._element.style.display = "block", this._element.removeAttribute("aria-hidden"), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.scrollTop = 0, i && (i.scrollTop = 0), e && u(this._element), this._element.classList.add(ji), this._queueCallback((() => { + this._config.focus && this._focustrap.activate(), this._isTransitioning = !1, j.trigger(this._element, "shown.bs.modal", {relatedTarget: t}) + }), this._dialog, e) + } + + _setEscapeEvent() { + this._isShown ? j.on(this._element, Ni, (t => { + this._config.keyboard && t.key === Oi ? (t.preventDefault(), this.hide()) : this._config.keyboard || t.key !== Oi || this._triggerBackdropTransition() + })) : j.off(this._element, Ni) + } + + _setResizeEvent() { + this._isShown ? j.on(window, Di, (() => this._adjustDialog())) : j.off(window, Di) + } + + _hideModal() { + this._element.style.display = "none", this._element.setAttribute("aria-hidden", !0), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._isTransitioning = !1, this._backdrop.hide((() => { + document.body.classList.remove(Pi), this._resetAdjustments(), this._scrollBar.reset(), j.trigger(this._element, Li) + })) + } + + _showBackdrop(t) { + j.on(this._element, Si, (t => { + this._ignoreBackdropClick ? this._ignoreBackdropClick = !1 : t.target === t.currentTarget && (!0 === this._config.backdrop ? this.hide() : "static" === this._config.backdrop && this._triggerBackdropTransition()) + })), this._backdrop.show(t) + } + + _isAnimated() { + return this._element.classList.contains("fade") + } + + _triggerBackdropTransition() { + if (j.trigger(this._element, "hidePrevented.bs.modal").defaultPrevented) return; + const {classList: t, scrollHeight: e, style: i} = this._element, + n = e > document.documentElement.clientHeight; + !n && "hidden" === i.overflowY || t.contains(Mi) || (n || (i.overflowY = "hidden"), t.add(Mi), this._queueCallback((() => { + t.remove(Mi), n || this._queueCallback((() => { + i.overflowY = "" + }), this._dialog) + }), this._dialog), this._element.focus()) + } + + _adjustDialog() { + const t = this._element.scrollHeight > document.documentElement.clientHeight, + e = this._scrollBar.getWidth(), i = e > 0; + (!i && t && !m() || i && !t && m()) && (this._element.style.paddingLeft = `${e}px`), (i && !t && !m() || !i && t && m()) && (this._element.style.paddingRight = `${e}px`) + } + + _resetAdjustments() { + this._element.style.paddingLeft = "", this._element.style.paddingRight = "" + } + + static jQueryInterface(t, e) { + return this.each((function () { + const i = Hi.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); + i[t](e) + } + })) + } + } + + j.on(document, "click.bs.modal.data-api", '[data-bs-toggle="modal"]', (function (t) { + const e = n(this); + ["A", "AREA"].includes(this.tagName) && t.preventDefault(), j.one(e, xi, (t => { + t.defaultPrevented || j.one(e, Li, (() => { + l(this) && this.focus() + })) + })); + const i = V.findOne(".modal.show"); + i && Hi.getInstance(i).hide(), Hi.getOrCreateInstance(e).toggle(this) + })), R(Hi), g(Hi); + const Bi = "offcanvas", Ri = {backdrop: !0, keyboard: !0, scroll: !1}, + Wi = {backdrop: "boolean", keyboard: "boolean", scroll: "boolean"}, $i = "show", zi = ".offcanvas.show", + qi = "hidden.bs.offcanvas"; + + class Fi extends B { + constructor(t, e) { + super(t), this._config = this._getConfig(e), this._isShown = !1, this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._addEventListeners() + } + + static get NAME() { + return Bi + } + + static get Default() { + return Ri + } + + toggle(t) { + return this._isShown ? this.hide() : this.show(t) + } + + show(t) { + this._isShown || j.trigger(this._element, "show.bs.offcanvas", {relatedTarget: t}).defaultPrevented || (this._isShown = !0, this._element.style.visibility = "visible", this._backdrop.show(), this._config.scroll || (new fi).hide(), this._element.removeAttribute("aria-hidden"), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.classList.add($i), this._queueCallback((() => { + this._config.scroll || this._focustrap.activate(), j.trigger(this._element, "shown.bs.offcanvas", {relatedTarget: t}) + }), this._element, !0)) + } + + hide() { + this._isShown && (j.trigger(this._element, "hide.bs.offcanvas").defaultPrevented || (this._focustrap.deactivate(), this._element.blur(), this._isShown = !1, this._element.classList.remove($i), this._backdrop.hide(), this._queueCallback((() => { + this._element.setAttribute("aria-hidden", !0), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._element.style.visibility = "hidden", this._config.scroll || (new fi).reset(), j.trigger(this._element, qi) + }), this._element, !0))) + } + + dispose() { + this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() + } + + _getConfig(t) { + return t = {...Ri, ...U.getDataAttributes(this._element), ..."object" == typeof t ? t : {}}, a(Bi, t, Wi), t + } + + _initializeBackDrop() { + return new bi({ + className: "offcanvas-backdrop", + isVisible: this._config.backdrop, + isAnimated: !0, + rootElement: this._element.parentNode, + clickCallback: () => this.hide() + }) + } + + _initializeFocusTrap() { + return new Ai({trapElement: this._element}) + } + + _addEventListeners() { + j.on(this._element, "keydown.dismiss.bs.offcanvas", (t => { + this._config.keyboard && "Escape" === t.key && this.hide() + })) + } + + static jQueryInterface(t) { + return this.each((function () { + const e = Fi.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t](this) + } + })) + } + } + + j.on(document, "click.bs.offcanvas.data-api", '[data-bs-toggle="offcanvas"]', (function (t) { + const e = n(this); + if (["A", "AREA"].includes(this.tagName) && t.preventDefault(), c(this)) return; + j.one(e, qi, (() => { + l(this) && this.focus() + })); + const i = V.findOne(zi); + i && i !== e && Fi.getInstance(i).hide(), Fi.getOrCreateInstance(e).toggle(this) + })), j.on(window, "load.bs.offcanvas.data-api", (() => V.find(zi).forEach((t => Fi.getOrCreateInstance(t).show())))), R(Fi), g(Fi); + const Ui = new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]), + Vi = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i, + Ki = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i, + Xi = (t, e) => { + const i = t.nodeName.toLowerCase(); + if (e.includes(i)) return !Ui.has(i) || Boolean(Vi.test(t.nodeValue) || Ki.test(t.nodeValue)); + const n = e.filter((t => t instanceof RegExp)); + for (let t = 0, e = n.length; t < e; t++) if (n[t].test(i)) return !0; + return !1 + }; + + function Yi(t, e, i) { + if (!t.length) return t; + if (i && "function" == typeof i) return i(t); + const n = (new window.DOMParser).parseFromString(t, "text/html"), + s = [].concat(...n.body.querySelectorAll("*")); + for (let t = 0, i = s.length; t < i; t++) { + const i = s[t], n = i.nodeName.toLowerCase(); + if (!Object.keys(e).includes(n)) { + i.remove(); + continue + } + const o = [].concat(...i.attributes), r = [].concat(e["*"] || [], e[n] || []); + o.forEach((t => { + Xi(t, r) || i.removeAttribute(t.nodeName) + })) + } + return n.body.innerHTML + } + + const Qi = "tooltip", Gi = new Set(["sanitize", "allowList", "sanitizeFn"]), Zi = { + animation: "boolean", + template: "string", + title: "(string|element|function)", + trigger: "string", + delay: "(number|object)", + html: "boolean", + selector: "(string|boolean)", + placement: "(string|function)", + offset: "(array|string|function)", + container: "(string|element|boolean)", + fallbackPlacements: "array", + boundary: "(string|element)", + customClass: "(string|function)", + sanitize: "boolean", + sanitizeFn: "(null|function)", + allowList: "object", + popperConfig: "(null|object|function)" + }, Ji = {AUTO: "auto", TOP: "top", RIGHT: m() ? "left" : "right", BOTTOM: "bottom", LEFT: m() ? "right" : "left"}, + tn = { + animation: !0, + template: '', + trigger: "hover focus", + title: "", + delay: 0, + html: !1, + selector: !1, + placement: "top", + offset: [0, 0], + container: !1, + fallbackPlacements: ["top", "right", "bottom", "left"], + boundary: "clippingParents", + customClass: "", + sanitize: !0, + sanitizeFn: null, + allowList: { + "*": ["class", "dir", "id", "lang", "role", /^aria-[\w-]*$/i], + a: ["target", "href", "title", "rel"], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ["src", "srcset", "alt", "title", "width", "height"], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + }, + popperConfig: null + }, en = { + HIDE: "hide.bs.tooltip", + HIDDEN: "hidden.bs.tooltip", + SHOW: "show.bs.tooltip", + SHOWN: "shown.bs.tooltip", + INSERTED: "inserted.bs.tooltip", + CLICK: "click.bs.tooltip", + FOCUSIN: "focusin.bs.tooltip", + FOCUSOUT: "focusout.bs.tooltip", + MOUSEENTER: "mouseenter.bs.tooltip", + MOUSELEAVE: "mouseleave.bs.tooltip" + }, nn = "fade", sn = "show", on = "show", rn = "out", an = ".tooltip-inner", ln = ".modal", cn = "hide.bs.modal", + hn = "hover", dn = "focus"; + + class un extends B { + constructor(t, e) { + if (void 0 === Fe) throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)"); + super(t), this._isEnabled = !0, this._timeout = 0, this._hoverState = "", this._activeTrigger = {}, this._popper = null, this._config = this._getConfig(e), this.tip = null, this._setListeners() + } + + static get Default() { + return tn + } + + static get NAME() { + return Qi + } + + static get Event() { + return en + } + + static get DefaultType() { + return Zi + } + + enable() { + this._isEnabled = !0 + } + + disable() { + this._isEnabled = !1 + } + + toggleEnabled() { + this._isEnabled = !this._isEnabled + } + + toggle(t) { + if (this._isEnabled) if (t) { + const e = this._initializeOnDelegatedTarget(t); + e._activeTrigger.click = !e._activeTrigger.click, e._isWithActiveTrigger() ? e._enter(null, e) : e._leave(null, e) + } else { + if (this.getTipElement().classList.contains(sn)) return void this._leave(null, this); + this._enter(null, this) + } + } + + dispose() { + clearTimeout(this._timeout), j.off(this._element.closest(ln), cn, this._hideModalHandler), this.tip && this.tip.remove(), this._disposePopper(), super.dispose() + } + + show() { + if ("none" === this._element.style.display) throw new Error("Please use show on visible elements"); + if (!this.isWithContent() || !this._isEnabled) return; + const t = j.trigger(this._element, this.constructor.Event.SHOW), e = h(this._element), + i = null === e ? this._element.ownerDocument.documentElement.contains(this._element) : e.contains(this._element); + if (t.defaultPrevented || !i) return; + "tooltip" === this.constructor.NAME && this.tip && this.getTitle() !== this.tip.querySelector(an).innerHTML && (this._disposePopper(), this.tip.remove(), this.tip = null); + const n = this.getTipElement(), s = (t => { + do { + t += Math.floor(1e6 * Math.random()) + } while (document.getElementById(t)); + return t + })(this.constructor.NAME); + n.setAttribute("id", s), this._element.setAttribute("aria-describedby", s), this._config.animation && n.classList.add(nn); + const o = "function" == typeof this._config.placement ? this._config.placement.call(this, n, this._element) : this._config.placement, + r = this._getAttachment(o); + this._addAttachmentClass(r); + const {container: a} = this._config; + H.set(n, this.constructor.DATA_KEY, this), this._element.ownerDocument.documentElement.contains(this.tip) || (a.append(n), j.trigger(this._element, this.constructor.Event.INSERTED)), this._popper ? this._popper.update() : this._popper = qe(this._element, n, this._getPopperConfig(r)), n.classList.add(sn); + const l = this._resolvePossibleFunction(this._config.customClass); + l && n.classList.add(...l.split(" ")), "ontouchstart" in document.documentElement && [].concat(...document.body.children).forEach((t => { + j.on(t, "mouseover", d) + })); + const c = this.tip.classList.contains(nn); + this._queueCallback((() => { + const t = this._hoverState; + this._hoverState = null, j.trigger(this._element, this.constructor.Event.SHOWN), t === rn && this._leave(null, this) + }), this.tip, c) + } + + hide() { + if (!this._popper) return; + const t = this.getTipElement(); + if (j.trigger(this._element, this.constructor.Event.HIDE).defaultPrevented) return; + t.classList.remove(sn), "ontouchstart" in document.documentElement && [].concat(...document.body.children).forEach((t => j.off(t, "mouseover", d))), this._activeTrigger.click = !1, this._activeTrigger.focus = !1, this._activeTrigger.hover = !1; + const e = this.tip.classList.contains(nn); + this._queueCallback((() => { + this._isWithActiveTrigger() || (this._hoverState !== on && t.remove(), this._cleanTipClass(), this._element.removeAttribute("aria-describedby"), j.trigger(this._element, this.constructor.Event.HIDDEN), this._disposePopper()) + }), this.tip, e), this._hoverState = "" + } + + update() { + null !== this._popper && this._popper.update() + } + + isWithContent() { + return Boolean(this.getTitle()) + } + + getTipElement() { + if (this.tip) return this.tip; + const t = document.createElement("div"); + t.innerHTML = this._config.template; + const e = t.children[0]; + return this.setContent(e), e.classList.remove(nn, sn), this.tip = e, this.tip + } + + setContent(t) { + this._sanitizeAndSetContent(t, this.getTitle(), an) + } + + _sanitizeAndSetContent(t, e, i) { + const n = V.findOne(i, t); + e || !n ? this.setElementContent(n, e) : n.remove() + } + + setElementContent(t, e) { + if (null !== t) return o(e) ? (e = r(e), void (this._config.html ? e.parentNode !== t && (t.innerHTML = "", t.append(e)) : t.textContent = e.textContent)) : void (this._config.html ? (this._config.sanitize && (e = Yi(e, this._config.allowList, this._config.sanitizeFn)), t.innerHTML = e) : t.textContent = e) + } + + getTitle() { + const t = this._element.getAttribute("data-bs-original-title") || this._config.title; + return this._resolvePossibleFunction(t) + } + + updateAttachment(t) { + return "right" === t ? "end" : "left" === t ? "start" : t + } + + _initializeOnDelegatedTarget(t, e) { + return e || this.constructor.getOrCreateInstance(t.delegateTarget, this._getDelegateConfig()) + } + + _getOffset() { + const {offset: t} = this._config; + return "string" == typeof t ? t.split(",").map((t => Number.parseInt(t, 10))) : "function" == typeof t ? e => t(e, this._element) : t + } + + _resolvePossibleFunction(t) { + return "function" == typeof t ? t.call(this._element) : t + } + + _getPopperConfig(t) { + const e = { + placement: t, + modifiers: [{ + name: "flip", + options: {fallbackPlacements: this._config.fallbackPlacements} + }, {name: "offset", options: {offset: this._getOffset()}}, { + name: "preventOverflow", + options: {boundary: this._config.boundary} + }, {name: "arrow", options: {element: `.${this.constructor.NAME}-arrow`}}, { + name: "onChange", + enabled: !0, + phase: "afterWrite", + fn: t => this._handlePopperPlacementChange(t) + }], + onFirstUpdate: t => { + t.options.placement !== t.placement && this._handlePopperPlacementChange(t) + } + }; + return {...e, ..."function" == typeof this._config.popperConfig ? this._config.popperConfig(e) : this._config.popperConfig} + } + + _addAttachmentClass(t) { + this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(t)}`) + } + + _getAttachment(t) { + return Ji[t.toUpperCase()] + } + + _setListeners() { + this._config.trigger.split(" ").forEach((t => { + if ("click" === t) j.on(this._element, this.constructor.Event.CLICK, this._config.selector, (t => this.toggle(t))); else if ("manual" !== t) { + const e = t === hn ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN, + i = t === hn ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT; + j.on(this._element, e, this._config.selector, (t => this._enter(t))), j.on(this._element, i, this._config.selector, (t => this._leave(t))) + } + })), this._hideModalHandler = () => { + this._element && this.hide() + }, j.on(this._element.closest(ln), cn, this._hideModalHandler), this._config.selector ? this._config = { + ...this._config, + trigger: "manual", + selector: "" + } : this._fixTitle() + } + + _fixTitle() { + const t = this._element.getAttribute("title"), + e = typeof this._element.getAttribute("data-bs-original-title"); + (t || "string" !== e) && (this._element.setAttribute("data-bs-original-title", t || ""), !t || this._element.getAttribute("aria-label") || this._element.textContent || this._element.setAttribute("aria-label", t), this._element.setAttribute("title", "")) + } + + _enter(t, e) { + e = this._initializeOnDelegatedTarget(t, e), t && (e._activeTrigger["focusin" === t.type ? dn : hn] = !0), e.getTipElement().classList.contains(sn) || e._hoverState === on ? e._hoverState = on : (clearTimeout(e._timeout), e._hoverState = on, e._config.delay && e._config.delay.show ? e._timeout = setTimeout((() => { + e._hoverState === on && e.show() + }), e._config.delay.show) : e.show()) + } + + _leave(t, e) { + e = this._initializeOnDelegatedTarget(t, e), t && (e._activeTrigger["focusout" === t.type ? dn : hn] = e._element.contains(t.relatedTarget)), e._isWithActiveTrigger() || (clearTimeout(e._timeout), e._hoverState = rn, e._config.delay && e._config.delay.hide ? e._timeout = setTimeout((() => { + e._hoverState === rn && e.hide() + }), e._config.delay.hide) : e.hide()) + } + + _isWithActiveTrigger() { + for (const t in this._activeTrigger) if (this._activeTrigger[t]) return !0; + return !1 + } + + _getConfig(t) { + const e = U.getDataAttributes(this._element); + return Object.keys(e).forEach((t => { + Gi.has(t) && delete e[t] + })), (t = {...this.constructor.Default, ...e, ..."object" == typeof t && t ? t : {}}).container = !1 === t.container ? document.body : r(t.container), "number" == typeof t.delay && (t.delay = { + show: t.delay, + hide: t.delay + }), "number" == typeof t.title && (t.title = t.title.toString()), "number" == typeof t.content && (t.content = t.content.toString()), a(Qi, t, this.constructor.DefaultType), t.sanitize && (t.template = Yi(t.template, t.allowList, t.sanitizeFn)), t + } + + _getDelegateConfig() { + const t = {}; + for (const e in this._config) this.constructor.Default[e] !== this._config[e] && (t[e] = this._config[e]); + return t + } + + _cleanTipClass() { + const t = this.getTipElement(), e = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, "g"), + i = t.getAttribute("class").match(e); + null !== i && i.length > 0 && i.map((t => t.trim())).forEach((e => t.classList.remove(e))) + } + + _getBasicClassPrefix() { + return "bs-tooltip" + } + + _handlePopperPlacementChange(t) { + const {state: e} = t; + e && (this.tip = e.elements.popper, this._cleanTipClass(), this._addAttachmentClass(this._getAttachment(e.placement))) + } + + _disposePopper() { + this._popper && (this._popper.destroy(), this._popper = null) + } + + static jQueryInterface(t) { + return this.each((function () { + const e = un.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + + g(un); + const fn = { + ...un.Default, + placement: "right", + offset: [0, 8], + trigger: "click", + content: "", + template: '' + }, pn = {...un.DefaultType, content: "(string|element|function)"}, mn = { + HIDE: "hide.bs.popover", + HIDDEN: "hidden.bs.popover", + SHOW: "show.bs.popover", + SHOWN: "shown.bs.popover", + INSERTED: "inserted.bs.popover", + CLICK: "click.bs.popover", + FOCUSIN: "focusin.bs.popover", + FOCUSOUT: "focusout.bs.popover", + MOUSEENTER: "mouseenter.bs.popover", + MOUSELEAVE: "mouseleave.bs.popover" + }; + + class gn extends un { + static get Default() { + return fn + } + + static get NAME() { + return "popover" + } + + static get Event() { + return mn + } + + static get DefaultType() { + return pn + } + + isWithContent() { + return this.getTitle() || this._getContent() + } + + setContent(t) { + this._sanitizeAndSetContent(t, this.getTitle(), ".popover-header"), this._sanitizeAndSetContent(t, this._getContent(), ".popover-body") + } + + _getContent() { + return this._resolvePossibleFunction(this._config.content) + } + + _getBasicClassPrefix() { + return "bs-popover" + } + + static jQueryInterface(t) { + return this.each((function () { + const e = gn.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + + g(gn); + const _n = "scrollspy", bn = {offset: 10, method: "auto", target: ""}, + vn = {offset: "number", method: "string", target: "(string|element)"}, yn = "active", + wn = ".nav-link, .list-group-item, .dropdown-item", En = "position"; + + class An extends B { + constructor(t, e) { + super(t), this._scrollElement = "BODY" === this._element.tagName ? window : this._element, this._config = this._getConfig(e), this._offsets = [], this._targets = [], this._activeTarget = null, this._scrollHeight = 0, j.on(this._scrollElement, "scroll.bs.scrollspy", (() => this._process())), this.refresh(), this._process() + } + + static get Default() { + return bn + } + + static get NAME() { + return _n + } + + refresh() { + const t = this._scrollElement === this._scrollElement.window ? "offset" : En, + e = "auto" === this._config.method ? t : this._config.method, n = e === En ? this._getScrollTop() : 0; + this._offsets = [], this._targets = [], this._scrollHeight = this._getScrollHeight(), V.find(wn, this._config.target).map((t => { + const s = i(t), o = s ? V.findOne(s) : null; + if (o) { + const t = o.getBoundingClientRect(); + if (t.width || t.height) return [U[e](o).top + n, s] + } + return null + })).filter((t => t)).sort(((t, e) => t[0] - e[0])).forEach((t => { + this._offsets.push(t[0]), this._targets.push(t[1]) + })) + } + + dispose() { + j.off(this._scrollElement, ".bs.scrollspy"), super.dispose() + } + + _getConfig(t) { + return (t = {...bn, ...U.getDataAttributes(this._element), ..."object" == typeof t && t ? t : {}}).target = r(t.target) || document.documentElement, a(_n, t, vn), t + } + + _getScrollTop() { + return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop + } + + _getScrollHeight() { + return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight) + } + + _getOffsetHeight() { + return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height + } + + _process() { + const t = this._getScrollTop() + this._config.offset, e = this._getScrollHeight(), + i = this._config.offset + e - this._getOffsetHeight(); + if (this._scrollHeight !== e && this.refresh(), t >= i) { + const t = this._targets[this._targets.length - 1]; + this._activeTarget !== t && this._activate(t) + } else { + if (this._activeTarget && t < this._offsets[0] && this._offsets[0] > 0) return this._activeTarget = null, void this._clear(); + for (let e = this._offsets.length; e--;) this._activeTarget !== this._targets[e] && t >= this._offsets[e] && (void 0 === this._offsets[e + 1] || t < this._offsets[e + 1]) && this._activate(this._targets[e]) + } + } + + _activate(t) { + this._activeTarget = t, this._clear(); + const e = wn.split(",").map((e => `${e}[data-bs-target="${t}"],${e}[href="${t}"]`)), + i = V.findOne(e.join(","), this._config.target); + i.classList.add(yn), i.classList.contains("dropdown-item") ? V.findOne(".dropdown-toggle", i.closest(".dropdown")).classList.add(yn) : V.parents(i, ".nav, .list-group").forEach((t => { + V.prev(t, ".nav-link, .list-group-item").forEach((t => t.classList.add(yn))), V.prev(t, ".nav-item").forEach((t => { + V.children(t, ".nav-link").forEach((t => t.classList.add(yn))) + })) + })), j.trigger(this._scrollElement, "activate.bs.scrollspy", {relatedTarget: t}) + } + + _clear() { + V.find(wn, this._config.target).filter((t => t.classList.contains(yn))).forEach((t => t.classList.remove(yn))) + } + + static jQueryInterface(t) { + return this.each((function () { + const e = An.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + + j.on(window, "load.bs.scrollspy.data-api", (() => { + V.find('[data-bs-spy="scroll"]').forEach((t => new An(t))) + })), g(An); + const Tn = "active", On = "fade", Cn = "show", kn = ".active", Ln = ":scope > li > .active"; + + class xn extends B { + static get NAME() { + return "tab" + } + + show() { + if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(Tn)) return; + let t; + const e = n(this._element), i = this._element.closest(".nav, .list-group"); + if (i) { + const e = "UL" === i.nodeName || "OL" === i.nodeName ? Ln : kn; + t = V.find(e, i), t = t[t.length - 1] + } + const s = t ? j.trigger(t, "hide.bs.tab", {relatedTarget: this._element}) : null; + if (j.trigger(this._element, "show.bs.tab", {relatedTarget: t}).defaultPrevented || null !== s && s.defaultPrevented) return; + this._activate(this._element, i); + const o = () => { + j.trigger(t, "hidden.bs.tab", {relatedTarget: this._element}), j.trigger(this._element, "shown.bs.tab", {relatedTarget: t}) + }; + e ? this._activate(e, e.parentNode, o) : o() + } + + _activate(t, e, i) { + const n = (!e || "UL" !== e.nodeName && "OL" !== e.nodeName ? V.children(e, kn) : V.find(Ln, e))[0], + s = i && n && n.classList.contains(On), o = () => this._transitionComplete(t, n, i); + n && s ? (n.classList.remove(Cn), this._queueCallback(o, t, !0)) : o() + } + + _transitionComplete(t, e, i) { + if (e) { + e.classList.remove(Tn); + const t = V.findOne(":scope > .dropdown-menu .active", e.parentNode); + t && t.classList.remove(Tn), "tab" === e.getAttribute("role") && e.setAttribute("aria-selected", !1) + } + t.classList.add(Tn), "tab" === t.getAttribute("role") && t.setAttribute("aria-selected", !0), u(t), t.classList.contains(On) && t.classList.add(Cn); + let n = t.parentNode; + if (n && "LI" === n.nodeName && (n = n.parentNode), n && n.classList.contains("dropdown-menu")) { + const e = t.closest(".dropdown"); + e && V.find(".dropdown-toggle", e).forEach((t => t.classList.add(Tn))), t.setAttribute("aria-expanded", !0) + } + i && i() + } + + static jQueryInterface(t) { + return this.each((function () { + const e = xn.getOrCreateInstance(this); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + + j.on(document, "click.bs.tab.data-api", '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]', (function (t) { + ["A", "AREA"].includes(this.tagName) && t.preventDefault(), c(this) || xn.getOrCreateInstance(this).show() + })), g(xn); + const Dn = "toast", Sn = "hide", Nn = "show", In = "showing", + Pn = {animation: "boolean", autohide: "boolean", delay: "number"}, + jn = {animation: !0, autohide: !0, delay: 5e3}; + + class Mn extends B { + constructor(t, e) { + super(t), this._config = this._getConfig(e), this._timeout = null, this._hasMouseInteraction = !1, this._hasKeyboardInteraction = !1, this._setListeners() + } + + static get DefaultType() { + return Pn + } + + static get Default() { + return jn + } + + static get NAME() { + return Dn + } + + show() { + j.trigger(this._element, "show.bs.toast").defaultPrevented || (this._clearTimeout(), this._config.animation && this._element.classList.add("fade"), this._element.classList.remove(Sn), u(this._element), this._element.classList.add(Nn), this._element.classList.add(In), this._queueCallback((() => { + this._element.classList.remove(In), j.trigger(this._element, "shown.bs.toast"), this._maybeScheduleHide() + }), this._element, this._config.animation)) + } + + hide() { + this._element.classList.contains(Nn) && (j.trigger(this._element, "hide.bs.toast").defaultPrevented || (this._element.classList.add(In), this._queueCallback((() => { + this._element.classList.add(Sn), this._element.classList.remove(In), this._element.classList.remove(Nn), j.trigger(this._element, "hidden.bs.toast") + }), this._element, this._config.animation))) + } + + dispose() { + this._clearTimeout(), this._element.classList.contains(Nn) && this._element.classList.remove(Nn), super.dispose() + } + + _getConfig(t) { + return t = {...jn, ...U.getDataAttributes(this._element), ..."object" == typeof t && t ? t : {}}, a(Dn, t, this.constructor.DefaultType), t + } + + _maybeScheduleHide() { + this._config.autohide && (this._hasMouseInteraction || this._hasKeyboardInteraction || (this._timeout = setTimeout((() => { + this.hide() + }), this._config.delay))) + } + + _onInteraction(t, e) { + switch (t.type) { + case"mouseover": + case"mouseout": + this._hasMouseInteraction = e; + break; + case"focusin": + case"focusout": + this._hasKeyboardInteraction = e + } + if (e) return void this._clearTimeout(); + const i = t.relatedTarget; + this._element === i || this._element.contains(i) || this._maybeScheduleHide() + } + + _setListeners() { + j.on(this._element, "mouseover.bs.toast", (t => this._onInteraction(t, !0))), j.on(this._element, "mouseout.bs.toast", (t => this._onInteraction(t, !1))), j.on(this._element, "focusin.bs.toast", (t => this._onInteraction(t, !0))), j.on(this._element, "focusout.bs.toast", (t => this._onInteraction(t, !1))) + } + + _clearTimeout() { + clearTimeout(this._timeout), this._timeout = null + } + + static jQueryInterface(t) { + return this.each((function () { + const e = Mn.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t](this) + } + })) + } + } + + return R(Mn), g(Mn), { + Alert: W, + Button: z, + Carousel: st, + Collapse: pt, + Dropdown: hi, + Modal: Hi, + Offcanvas: Fi, + Popover: gn, + ScrollSpy: An, + Tab: xn, + Toast: Mn, + Tooltip: un + } +})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/src/main/resources/static/js/app/common.js b/src/main/resources/static/js/app/common.js new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/static/js/app/jquery-3.6.0.min.js b/src/main/resources/static/js/app/jquery-3.6.0.min.js new file mode 100644 index 0000000..8825d3f --- /dev/null +++ b/src/main/resources/static/js/app/jquery-3.6.0.min.js @@ -0,0 +1,2595 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function (e, t) { + "use strict"; + "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? t(e, !0) : function (e) { + if (!e.document) throw new Error("jQuery requires a window with a document"); + return t(e) + } : t(e) +}("undefined" != typeof window ? window : this, function (C, e) { + "use strict"; + var t = [], r = Object.getPrototypeOf, s = t.slice, g = t.flat ? function (e) { + return t.flat.call(e) + } : function (e) { + return t.concat.apply([], e) + }, u = t.push, i = t.indexOf, n = {}, o = n.toString, v = n.hasOwnProperty, a = v.toString, l = a.call(Object), + y = {}, m = function (e) { + return "function" == typeof e && "number" != typeof e.nodeType && "function" != typeof e.item + }, x = function (e) { + return null != e && e === e.window + }, E = C.document, c = {type: !0, src: !0, nonce: !0, noModule: !0}; + + function b(e, t, n) { + var r, i, o = (n = n || E).createElement("script"); + if (o.text = e, t) for (r in c) (i = t[r] || t.getAttribute && t.getAttribute(r)) && o.setAttribute(r, i); + n.head.appendChild(o).parentNode.removeChild(o) + } + + function w(e) { + return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? n[o.call(e)] || "object" : typeof e + } + + var f = "3.6.0", S = function (e, t) { + return new S.fn.init(e, t) + }; + + function p(e) { + var t = !!e && "length" in e && e.length, n = w(e); + return !m(e) && !x(e) && ("array" === n || 0 === t || "number" == typeof t && 0 < t && t - 1 in e) + } + + S.fn = S.prototype = { + jquery: f, constructor: S, length: 0, toArray: function () { + return s.call(this) + }, get: function (e) { + return null == e ? s.call(this) : e < 0 ? this[e + this.length] : this[e] + }, pushStack: function (e) { + var t = S.merge(this.constructor(), e); + return t.prevObject = this, t + }, each: function (e) { + return S.each(this, e) + }, map: function (n) { + return this.pushStack(S.map(this, function (e, t) { + return n.call(e, t, e) + })) + }, slice: function () { + return this.pushStack(s.apply(this, arguments)) + }, first: function () { + return this.eq(0) + }, last: function () { + return this.eq(-1) + }, even: function () { + return this.pushStack(S.grep(this, function (e, t) { + return (t + 1) % 2 + })) + }, odd: function () { + return this.pushStack(S.grep(this, function (e, t) { + return t % 2 + })) + }, eq: function (e) { + var t = this.length, n = +e + (e < 0 ? t : 0); + return this.pushStack(0 <= n && n < t ? [this[n]] : []) + }, end: function () { + return this.prevObject || this.constructor() + }, push: u, sort: t.sort, splice: t.splice + }, S.extend = S.fn.extend = function () { + var e, t, n, r, i, o, a = arguments[0] || {}, s = 1, u = arguments.length, l = !1; + for ("boolean" == typeof a && (l = a, a = arguments[s] || {}, s++), "object" == typeof a || m(a) || (a = {}), s === u && (a = this, s--); s < u; s++) if (null != (e = arguments[s])) for (t in e) r = e[t], "__proto__" !== t && a !== r && (l && r && (S.isPlainObject(r) || (i = Array.isArray(r))) ? (n = a[t], o = i && !Array.isArray(n) ? [] : i || S.isPlainObject(n) ? n : {}, i = !1, a[t] = S.extend(l, o, r)) : void 0 !== r && (a[t] = r)); + return a + }, S.extend({ + expando: "jQuery" + (f + Math.random()).replace(/\D/g, ""), isReady: !0, error: function (e) { + throw new Error(e) + }, noop: function () { + }, isPlainObject: function (e) { + var t, n; + return !(!e || "[object Object]" !== o.call(e)) && (!(t = r(e)) || "function" == typeof (n = v.call(t, "constructor") && t.constructor) && a.call(n) === l) + }, isEmptyObject: function (e) { + var t; + for (t in e) return !1; + return !0 + }, globalEval: function (e, t, n) { + b(e, {nonce: t && t.nonce}, n) + }, each: function (e, t) { + var n, r = 0; + if (p(e)) { + for (n = e.length; r < n; r++) if (!1 === t.call(e[r], r, e[r])) break + } else for (r in e) if (!1 === t.call(e[r], r, e[r])) break; + return e + }, makeArray: function (e, t) { + var n = t || []; + return null != e && (p(Object(e)) ? S.merge(n, "string" == typeof e ? [e] : e) : u.call(n, e)), n + }, inArray: function (e, t, n) { + return null == t ? -1 : i.call(t, e, n) + }, merge: function (e, t) { + for (var n = +t.length, r = 0, i = e.length; r < n; r++) e[i++] = t[r]; + return e.length = i, e + }, grep: function (e, t, n) { + for (var r = [], i = 0, o = e.length, a = !n; i < o; i++) !t(e[i], i) !== a && r.push(e[i]); + return r + }, map: function (e, t, n) { + var r, i, o = 0, a = []; + if (p(e)) for (r = e.length; o < r; o++) null != (i = t(e[o], o, n)) && a.push(i); else for (o in e) null != (i = t(e[o], o, n)) && a.push(i); + return g(a) + }, guid: 1, support: y + }), "function" == typeof Symbol && (S.fn[Symbol.iterator] = t[Symbol.iterator]), S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (e, t) { + n["[object " + t + "]"] = t.toLowerCase() + }); + var d = function (n) { + var e, d, b, o, i, h, f, g, w, u, l, T, C, a, E, v, s, c, y, S = "sizzle" + 1 * new Date, p = n.document, k = 0, + r = 0, m = ue(), x = ue(), A = ue(), N = ue(), j = function (e, t) { + return e === t && (l = !0), 0 + }, D = {}.hasOwnProperty, t = [], q = t.pop, L = t.push, H = t.push, O = t.slice, P = function (e, t) { + for (var n = 0, r = e.length; n < r; n++) if (e[n] === t) return n; + return -1 + }, + R = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + M = "[\\x20\\t\\r\\n\\f]", I = "(?:\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + W = "\\[" + M + "*(" + I + ")(?:" + M + "*([*^$|!~]?=)" + M + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + I + "))|)" + M + "*\\]", + F = ":(" + I + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + W + ")*)|.*)\\)|)", + B = new RegExp(M + "+", "g"), $ = new RegExp("^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g"), + _ = new RegExp("^" + M + "*," + M + "*"), z = new RegExp("^" + M + "*([>+~]|" + M + ")" + M + "*"), + U = new RegExp(M + "|>"), X = new RegExp(F), V = new RegExp("^" + I + "$"), G = { + ID: new RegExp("^#(" + I + ")"), + CLASS: new RegExp("^\\.(" + I + ")"), + TAG: new RegExp("^(" + I + "|[*])"), + ATTR: new RegExp("^" + W), + PSEUDO: new RegExp("^" + F), + CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + M + "*(even|odd|(([+-]|)(\\d*)n|)" + M + "*(?:([+-]|)" + M + "*(\\d+)|))" + M + "*\\)|)", "i"), + bool: new RegExp("^(?:" + R + ")$", "i"), + needsContext: new RegExp("^" + M + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + M + "*((?:-\\d)?\\d*)" + M + "*\\)|)(?=[^-]|$)", "i") + }, Y = /HTML$/i, Q = /^(?:input|select|textarea|button)$/i, J = /^h\d$/i, K = /^[^{]+\{\s*\[native \w/, + Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, ee = /[+~]/, + te = new RegExp("\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\([^\\r\\n\\f])", "g"), ne = function (e, t) { + var n = "0x" + e.slice(1) - 65536; + return t || (n < 0 ? String.fromCharCode(n + 65536) : String.fromCharCode(n >> 10 | 55296, 1023 & n | 56320)) + }, re = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, ie = function (e, t) { + return t ? "\0" === e ? "\ufffd" : e.slice(0, -1) + "\\" + e.charCodeAt(e.length - 1).toString(16) + " " : "\\" + e + }, oe = function () { + T() + }, ae = be(function (e) { + return !0 === e.disabled && "fieldset" === e.nodeName.toLowerCase() + }, {dir: "parentNode", next: "legend"}); + try { + H.apply(t = O.call(p.childNodes), p.childNodes), t[p.childNodes.length].nodeType + } catch (e) { + H = { + apply: t.length ? function (e, t) { + L.apply(e, O.call(t)) + } : function (e, t) { + var n = e.length, r = 0; + while (e[n++] = t[r++]) ; + e.length = n - 1 + } + } + } + + function se(t, e, n, r) { + var i, o, a, s, u, l, c, f = e && e.ownerDocument, p = e ? e.nodeType : 9; + if (n = n || [], "string" != typeof t || !t || 1 !== p && 9 !== p && 11 !== p) return n; + if (!r && (T(e), e = e || C, E)) { + if (11 !== p && (u = Z.exec(t))) if (i = u[1]) { + if (9 === p) { + if (!(a = e.getElementById(i))) return n; + if (a.id === i) return n.push(a), n + } else if (f && (a = f.getElementById(i)) && y(e, a) && a.id === i) return n.push(a), n + } else { + if (u[2]) return H.apply(n, e.getElementsByTagName(t)), n; + if ((i = u[3]) && d.getElementsByClassName && e.getElementsByClassName) return H.apply(n, e.getElementsByClassName(i)), n + } + if (d.qsa && !N[t + " "] && (!v || !v.test(t)) && (1 !== p || "object" !== e.nodeName.toLowerCase())) { + if (c = t, f = e, 1 === p && (U.test(t) || z.test(t))) { + (f = ee.test(t) && ye(e.parentNode) || e) === e && d.scope || ((s = e.getAttribute("id")) ? s = s.replace(re, ie) : e.setAttribute("id", s = S)), o = (l = h(t)).length; + while (o--) l[o] = (s ? "#" + s : ":scope") + " " + xe(l[o]); + c = l.join(",") + } + try { + return H.apply(n, f.querySelectorAll(c)), n + } catch (e) { + N(t, !0) + } finally { + s === S && e.removeAttribute("id") + } + } + } + return g(t.replace($, "$1"), e, n, r) + } + + function ue() { + var r = []; + return function e(t, n) { + return r.push(t + " ") > b.cacheLength && delete e[r.shift()], e[t + " "] = n + } + } + + function le(e) { + return e[S] = !0, e + } + + function ce(e) { + var t = C.createElement("fieldset"); + try { + return !!e(t) + } catch (e) { + return !1 + } finally { + t.parentNode && t.parentNode.removeChild(t), t = null + } + } + + function fe(e, t) { + var n = e.split("|"), r = n.length; + while (r--) b.attrHandle[n[r]] = t + } + + function pe(e, t) { + var n = t && e, r = n && 1 === e.nodeType && 1 === t.nodeType && e.sourceIndex - t.sourceIndex; + if (r) return r; + if (n) while (n = n.nextSibling) if (n === t) return -1; + return e ? 1 : -1 + } + + function de(t) { + return function (e) { + return "input" === e.nodeName.toLowerCase() && e.type === t + } + } + + function he(n) { + return function (e) { + var t = e.nodeName.toLowerCase(); + return ("input" === t || "button" === t) && e.type === n + } + } + + function ge(t) { + return function (e) { + return "form" in e ? e.parentNode && !1 === e.disabled ? "label" in e ? "label" in e.parentNode ? e.parentNode.disabled === t : e.disabled === t : e.isDisabled === t || e.isDisabled !== !t && ae(e) === t : e.disabled === t : "label" in e && e.disabled === t + } + } + + function ve(a) { + return le(function (o) { + return o = +o, le(function (e, t) { + var n, r = a([], e.length, o), i = r.length; + while (i--) e[n = r[i]] && (e[n] = !(t[n] = e[n])) + }) + }) + } + + function ye(e) { + return e && "undefined" != typeof e.getElementsByTagName && e + } + + for (e in d = se.support = {}, i = se.isXML = function (e) { + var t = e && e.namespaceURI, n = e && (e.ownerDocument || e).documentElement; + return !Y.test(t || n && n.nodeName || "HTML") + }, T = se.setDocument = function (e) { + var t, n, r = e ? e.ownerDocument || e : p; + return r != C && 9 === r.nodeType && r.documentElement && (a = (C = r).documentElement, E = !i(C), p != C && (n = C.defaultView) && n.top !== n && (n.addEventListener ? n.addEventListener("unload", oe, !1) : n.attachEvent && n.attachEvent("onunload", oe)), d.scope = ce(function (e) { + return a.appendChild(e).appendChild(C.createElement("div")), "undefined" != typeof e.querySelectorAll && !e.querySelectorAll(":scope fieldset div").length + }), d.attributes = ce(function (e) { + return e.className = "i", !e.getAttribute("className") + }), d.getElementsByTagName = ce(function (e) { + return e.appendChild(C.createComment("")), !e.getElementsByTagName("*").length + }), d.getElementsByClassName = K.test(C.getElementsByClassName), d.getById = ce(function (e) { + return a.appendChild(e).id = S, !C.getElementsByName || !C.getElementsByName(S).length + }), d.getById ? (b.filter.ID = function (e) { + var t = e.replace(te, ne); + return function (e) { + return e.getAttribute("id") === t + } + }, b.find.ID = function (e, t) { + if ("undefined" != typeof t.getElementById && E) { + var n = t.getElementById(e); + return n ? [n] : [] + } + }) : (b.filter.ID = function (e) { + var n = e.replace(te, ne); + return function (e) { + var t = "undefined" != typeof e.getAttributeNode && e.getAttributeNode("id"); + return t && t.value === n + } + }, b.find.ID = function (e, t) { + if ("undefined" != typeof t.getElementById && E) { + var n, r, i, o = t.getElementById(e); + if (o) { + if ((n = o.getAttributeNode("id")) && n.value === e) return [o]; + i = t.getElementsByName(e), r = 0; + while (o = i[r++]) if ((n = o.getAttributeNode("id")) && n.value === e) return [o] + } + return [] + } + }), b.find.TAG = d.getElementsByTagName ? function (e, t) { + return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName(e) : d.qsa ? t.querySelectorAll(e) : void 0 + } : function (e, t) { + var n, r = [], i = 0, o = t.getElementsByTagName(e); + if ("*" === e) { + while (n = o[i++]) 1 === n.nodeType && r.push(n); + return r + } + return o + }, b.find.CLASS = d.getElementsByClassName && function (e, t) { + if ("undefined" != typeof t.getElementsByClassName && E) return t.getElementsByClassName(e) + }, s = [], v = [], (d.qsa = K.test(C.querySelectorAll)) && (ce(function (e) { + var t; + a.appendChild(e).innerHTML = "", e.querySelectorAll("[msallowcapture^='']").length && v.push("[*^$]=" + M + "*(?:''|\"\")"), e.querySelectorAll("[selected]").length || v.push("\\[" + M + "*(?:value|" + R + ")"), e.querySelectorAll("[id~=" + S + "-]").length || v.push("~="), (t = C.createElement("input")).setAttribute("name", ""), e.appendChild(t), e.querySelectorAll("[name='']").length || v.push("\\[" + M + "*name" + M + "*=" + M + "*(?:''|\"\")"), e.querySelectorAll(":checked").length || v.push(":checked"), e.querySelectorAll("a#" + S + "+*").length || v.push(".#.+[+~]"), e.querySelectorAll("\\\f"), v.push("[\\r\\n\\f]") + }), ce(function (e) { + e.innerHTML = ""; + var t = C.createElement("input"); + t.setAttribute("type", "hidden"), e.appendChild(t).setAttribute("name", "D"), e.querySelectorAll("[name=d]").length && v.push("name" + M + "*[*^$|!~]?="), 2 !== e.querySelectorAll(":enabled").length && v.push(":enabled", ":disabled"), a.appendChild(e).disabled = !0, 2 !== e.querySelectorAll(":disabled").length && v.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), v.push(",.*:") + })), (d.matchesSelector = K.test(c = a.matches || a.webkitMatchesSelector || a.mozMatchesSelector || a.oMatchesSelector || a.msMatchesSelector)) && ce(function (e) { + d.disconnectedMatch = c.call(e, "*"), c.call(e, "[s!='']:x"), s.push("!=", F) + }), v = v.length && new RegExp(v.join("|")), s = s.length && new RegExp(s.join("|")), t = K.test(a.compareDocumentPosition), y = t || K.test(a.contains) ? function (e, t) { + var n = 9 === e.nodeType ? e.documentElement : e, r = t && t.parentNode; + return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r))) + } : function (e, t) { + if (t) while (t = t.parentNode) if (t === e) return !0; + return !1 + }, j = t ? function (e, t) { + if (e === t) return l = !0, 0; + var n = !e.compareDocumentPosition - !t.compareDocumentPosition; + return n || (1 & (n = (e.ownerDocument || e) == (t.ownerDocument || t) ? e.compareDocumentPosition(t) : 1) || !d.sortDetached && t.compareDocumentPosition(e) === n ? e == C || e.ownerDocument == p && y(p, e) ? -1 : t == C || t.ownerDocument == p && y(p, t) ? 1 : u ? P(u, e) - P(u, t) : 0 : 4 & n ? -1 : 1) + } : function (e, t) { + if (e === t) return l = !0, 0; + var n, r = 0, i = e.parentNode, o = t.parentNode, a = [e], s = [t]; + if (!i || !o) return e == C ? -1 : t == C ? 1 : i ? -1 : o ? 1 : u ? P(u, e) - P(u, t) : 0; + if (i === o) return pe(e, t); + n = e; + while (n = n.parentNode) a.unshift(n); + n = t; + while (n = n.parentNode) s.unshift(n); + while (a[r] === s[r]) r++; + return r ? pe(a[r], s[r]) : a[r] == p ? -1 : s[r] == p ? 1 : 0 + }), C + }, se.matches = function (e, t) { + return se(e, null, null, t) + }, se.matchesSelector = function (e, t) { + if (T(e), d.matchesSelector && E && !N[t + " "] && (!s || !s.test(t)) && (!v || !v.test(t))) try { + var n = c.call(e, t); + if (n || d.disconnectedMatch || e.document && 11 !== e.document.nodeType) return n + } catch (e) { + N(t, !0) + } + return 0 < se(t, C, null, [e]).length + }, se.contains = function (e, t) { + return (e.ownerDocument || e) != C && T(e), y(e, t) + }, se.attr = function (e, t) { + (e.ownerDocument || e) != C && T(e); + var n = b.attrHandle[t.toLowerCase()], + r = n && D.call(b.attrHandle, t.toLowerCase()) ? n(e, t, !E) : void 0; + return void 0 !== r ? r : d.attributes || !E ? e.getAttribute(t) : (r = e.getAttributeNode(t)) && r.specified ? r.value : null + }, se.escape = function (e) { + return (e + "").replace(re, ie) + }, se.error = function (e) { + throw new Error("Syntax error, unrecognized expression: " + e) + }, se.uniqueSort = function (e) { + var t, n = [], r = 0, i = 0; + if (l = !d.detectDuplicates, u = !d.sortStable && e.slice(0), e.sort(j), l) { + while (t = e[i++]) t === e[i] && (r = n.push(i)); + while (r--) e.splice(n[r], 1) + } + return u = null, e + }, o = se.getText = function (e) { + var t, n = "", r = 0, i = e.nodeType; + if (i) { + if (1 === i || 9 === i || 11 === i) { + if ("string" == typeof e.textContent) return e.textContent; + for (e = e.firstChild; e; e = e.nextSibling) n += o(e) + } else if (3 === i || 4 === i) return e.nodeValue + } else while (t = e[r++]) n += o(t); + return n + }, (b = se.selectors = { + cacheLength: 50, + createPseudo: le, + match: G, + attrHandle: {}, + find: {}, + relative: { + ">": {dir: "parentNode", first: !0}, + " ": {dir: "parentNode"}, + "+": {dir: "previousSibling", first: !0}, + "~": {dir: "previousSibling"} + }, + preFilter: { + ATTR: function (e) { + return e[1] = e[1].replace(te, ne), e[3] = (e[3] || e[4] || e[5] || "").replace(te, ne), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4) + }, CHILD: function (e) { + return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || se.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && se.error(e[0]), e + }, PSEUDO: function (e) { + var t, n = !e[6] && e[2]; + return G.CHILD.test(e[0]) ? null : (e[3] ? e[2] = e[4] || e[5] || "" : n && X.test(n) && (t = h(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), e[2] = n.slice(0, t)), e.slice(0, 3)) + } + }, + filter: { + TAG: function (e) { + var t = e.replace(te, ne).toLowerCase(); + return "*" === e ? function () { + return !0 + } : function (e) { + return e.nodeName && e.nodeName.toLowerCase() === t + } + }, CLASS: function (e) { + var t = m[e + " "]; + return t || (t = new RegExp("(^|" + M + ")" + e + "(" + M + "|$)")) && m(e, function (e) { + return t.test("string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute("class") || "") + }) + }, ATTR: function (n, r, i) { + return function (e) { + var t = se.attr(e, n); + return null == t ? "!=" === r : !r || (t += "", "=" === r ? t === i : "!=" === r ? t !== i : "^=" === r ? i && 0 === t.indexOf(i) : "*=" === r ? i && -1 < t.indexOf(i) : "$=" === r ? i && t.slice(-i.length) === i : "~=" === r ? -1 < (" " + t.replace(B, " ") + " ").indexOf(i) : "|=" === r && (t === i || t.slice(0, i.length + 1) === i + "-")) + } + }, CHILD: function (h, e, t, g, v) { + var y = "nth" !== h.slice(0, 3), m = "last" !== h.slice(-4), x = "of-type" === e; + return 1 === g && 0 === v ? function (e) { + return !!e.parentNode + } : function (e, t, n) { + var r, i, o, a, s, u, l = y !== m ? "nextSibling" : "previousSibling", c = e.parentNode, + f = x && e.nodeName.toLowerCase(), p = !n && !x, d = !1; + if (c) { + if (y) { + while (l) { + a = e; + while (a = a[l]) if (x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType) return !1; + u = l = "only" === h && !u && "nextSibling" + } + return !0 + } + if (u = [m ? c.firstChild : c.lastChild], m && p) { + d = (s = (r = (i = (o = (a = c)[S] || (a[S] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]) && r[2], a = s && c.childNodes[s]; + while (a = ++s && a && a[l] || (d = s = 0) || u.pop()) if (1 === a.nodeType && ++d && a === e) { + i[h] = [k, s, d]; + break + } + } else if (p && (d = s = (r = (i = (o = (a = e)[S] || (a[S] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]), !1 === d) while (a = ++s && a && a[l] || (d = s = 0) || u.pop()) if ((x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType) && ++d && (p && ((i = (o = a[S] || (a[S] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] = [k, d]), a === e)) break; + return (d -= v) === g || d % g == 0 && 0 <= d / g + } + } + }, PSEUDO: function (e, o) { + var t, a = b.pseudos[e] || b.setFilters[e.toLowerCase()] || se.error("unsupported pseudo: " + e); + return a[S] ? a(o) : 1 < a.length ? (t = [e, e, "", o], b.setFilters.hasOwnProperty(e.toLowerCase()) ? le(function (e, t) { + var n, r = a(e, o), i = r.length; + while (i--) e[n = P(e, r[i])] = !(t[n] = r[i]) + }) : function (e) { + return a(e, 0, t) + }) : a + } + }, + pseudos: { + not: le(function (e) { + var r = [], i = [], s = f(e.replace($, "$1")); + return s[S] ? le(function (e, t, n, r) { + var i, o = s(e, null, r, []), a = e.length; + while (a--) (i = o[a]) && (e[a] = !(t[a] = i)) + }) : function (e, t, n) { + return r[0] = e, s(r, null, n, i), r[0] = null, !i.pop() + } + }), has: le(function (t) { + return function (e) { + return 0 < se(t, e).length + } + }), contains: le(function (t) { + return t = t.replace(te, ne), function (e) { + return -1 < (e.textContent || o(e)).indexOf(t) + } + }), lang: le(function (n) { + return V.test(n || "") || se.error("unsupported lang: " + n), n = n.replace(te, ne).toLowerCase(), function (e) { + var t; + do { + if (t = E ? e.lang : e.getAttribute("xml:lang") || e.getAttribute("lang")) return (t = t.toLowerCase()) === n || 0 === t.indexOf(n + "-") + } while ((e = e.parentNode) && 1 === e.nodeType); + return !1 + } + }), target: function (e) { + var t = n.location && n.location.hash; + return t && t.slice(1) === e.id + }, root: function (e) { + return e === a + }, focus: function (e) { + return e === C.activeElement && (!C.hasFocus || C.hasFocus()) && !!(e.type || e.href || ~e.tabIndex) + }, enabled: ge(!1), disabled: ge(!0), checked: function (e) { + var t = e.nodeName.toLowerCase(); + return "input" === t && !!e.checked || "option" === t && !!e.selected + }, selected: function (e) { + return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected + }, empty: function (e) { + for (e = e.firstChild; e; e = e.nextSibling) if (e.nodeType < 6) return !1; + return !0 + }, parent: function (e) { + return !b.pseudos.empty(e) + }, header: function (e) { + return J.test(e.nodeName) + }, input: function (e) { + return Q.test(e.nodeName) + }, button: function (e) { + var t = e.nodeName.toLowerCase(); + return "input" === t && "button" === e.type || "button" === t + }, text: function (e) { + var t; + return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || "text" === t.toLowerCase()) + }, first: ve(function () { + return [0] + }), last: ve(function (e, t) { + return [t - 1] + }), eq: ve(function (e, t, n) { + return [n < 0 ? n + t : n] + }), even: ve(function (e, t) { + for (var n = 0; n < t; n += 2) e.push(n); + return e + }), odd: ve(function (e, t) { + for (var n = 1; n < t; n += 2) e.push(n); + return e + }), lt: ve(function (e, t, n) { + for (var r = n < 0 ? n + t : t < n ? t : n; 0 <= --r;) e.push(r); + return e + }), gt: ve(function (e, t, n) { + for (var r = n < 0 ? n + t : n; ++r < t;) e.push(r); + return e + }) + } + }).pseudos.nth = b.pseudos.eq, { + radio: !0, + checkbox: !0, + file: !0, + password: !0, + image: !0 + }) b.pseudos[e] = de(e); + for (e in {submit: !0, reset: !0}) b.pseudos[e] = he(e); + + function me() { + } + + function xe(e) { + for (var t = 0, n = e.length, r = ""; t < n; t++) r += e[t].value; + return r + } + + function be(s, e, t) { + var u = e.dir, l = e.next, c = l || u, f = t && "parentNode" === c, p = r++; + return e.first ? function (e, t, n) { + while (e = e[u]) if (1 === e.nodeType || f) return s(e, t, n); + return !1 + } : function (e, t, n) { + var r, i, o, a = [k, p]; + if (n) { + while (e = e[u]) if ((1 === e.nodeType || f) && s(e, t, n)) return !0 + } else while (e = e[u]) if (1 === e.nodeType || f) if (i = (o = e[S] || (e[S] = {}))[e.uniqueID] || (o[e.uniqueID] = {}), l && l === e.nodeName.toLowerCase()) e = e[u] || e; else { + if ((r = i[c]) && r[0] === k && r[1] === p) return a[2] = r[2]; + if ((i[c] = a)[2] = s(e, t, n)) return !0 + } + return !1 + } + } + + function we(i) { + return 1 < i.length ? function (e, t, n) { + var r = i.length; + while (r--) if (!i[r](e, t, n)) return !1; + return !0 + } : i[0] + } + + function Te(e, t, n, r, i) { + for (var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++) (o = e[s]) && (n && !n(o, r, i) || (a.push(o), l && t.push(s))); + return a + } + + function Ce(d, h, g, v, y, e) { + return v && !v[S] && (v = Ce(v)), y && !y[S] && (y = Ce(y, e)), le(function (e, t, n, r) { + var i, o, a, s = [], u = [], l = t.length, c = e || function (e, t, n) { + for (var r = 0, i = t.length; r < i; r++) se(e, t[r], n); + return n + }(h || "*", n.nodeType ? [n] : n, []), f = !d || !e && h ? c : Te(c, s, d, n, r), + p = g ? y || (e ? d : l || v) ? [] : t : f; + if (g && g(f, p, n, r), v) { + i = Te(p, u), v(i, [], n, r), o = i.length; + while (o--) (a = i[o]) && (p[u[o]] = !(f[u[o]] = a)) + } + if (e) { + if (y || d) { + if (y) { + i = [], o = p.length; + while (o--) (a = p[o]) && i.push(f[o] = a); + y(null, p = [], i, r) + } + o = p.length; + while (o--) (a = p[o]) && -1 < (i = y ? P(e, a) : s[o]) && (e[i] = !(t[i] = a)) + } + } else p = Te(p === t ? p.splice(l, p.length) : p), y ? y(null, t, p, r) : H.apply(t, p) + }) + } + + function Ee(e) { + for (var i, t, n, r = e.length, o = b.relative[e[0].type], a = o || b.relative[" "], s = o ? 1 : 0, u = be(function (e) { + return e === i + }, a, !0), l = be(function (e) { + return -1 < P(i, e) + }, a, !0), c = [function (e, t, n) { + var r = !o && (n || t !== w) || ((i = t).nodeType ? u(e, t, n) : l(e, t, n)); + return i = null, r + }]; s < r; s++) if (t = b.relative[e[s].type]) c = [be(we(c), t)]; else { + if ((t = b.filter[e[s].type].apply(null, e[s].matches))[S]) { + for (n = ++s; n < r; n++) if (b.relative[e[n].type]) break; + return Ce(1 < s && we(c), 1 < s && xe(e.slice(0, s - 1).concat({value: " " === e[s - 2].type ? "*" : ""})).replace($, "$1"), t, s < n && Ee(e.slice(s, n)), n < r && Ee(e = e.slice(n)), n < r && xe(e)) + } + c.push(t) + } + return we(c) + } + + return me.prototype = b.filters = b.pseudos, b.setFilters = new me, h = se.tokenize = function (e, t) { + var n, r, i, o, a, s, u, l = x[e + " "]; + if (l) return t ? 0 : l.slice(0); + a = e, s = [], u = b.preFilter; + while (a) { + for (o in n && !(r = _.exec(a)) || (r && (a = a.slice(r[0].length) || a), s.push(i = [])), n = !1, (r = z.exec(a)) && (n = r.shift(), i.push({ + value: n, + type: r[0].replace($, " ") + }), a = a.slice(n.length)), b.filter) !(r = G[o].exec(a)) || u[o] && !(r = u[o](r)) || (n = r.shift(), i.push({ + value: n, + type: o, + matches: r + }), a = a.slice(n.length)); + if (!n) break + } + return t ? a.length : a ? se.error(e) : x(e, s).slice(0) + }, f = se.compile = function (e, t) { + var n, v, y, m, x, r, i = [], o = [], a = A[e + " "]; + if (!a) { + t || (t = h(e)), n = t.length; + while (n--) (a = Ee(t[n]))[S] ? i.push(a) : o.push(a); + (a = A(e, (v = o, m = 0 < (y = i).length, x = 0 < v.length, r = function (e, t, n, r, i) { + var o, a, s, u = 0, l = "0", c = e && [], f = [], p = w, d = e || x && b.find.TAG("*", i), + h = k += null == p ? 1 : Math.random() || .1, g = d.length; + for (i && (w = t == C || t || i); l !== g && null != (o = d[l]); l++) { + if (x && o) { + a = 0, t || o.ownerDocument == C || (T(o), n = !E); + while (s = v[a++]) if (s(o, t || C, n)) { + r.push(o); + break + } + i && (k = h) + } + m && ((o = !s && o) && u--, e && c.push(o)) + } + if (u += l, m && l !== u) { + a = 0; + while (s = y[a++]) s(c, f, t, n); + if (e) { + if (0 < u) while (l--) c[l] || f[l] || (f[l] = q.call(r)); + f = Te(f) + } + H.apply(r, f), i && !e && 0 < f.length && 1 < u + y.length && se.uniqueSort(r) + } + return i && (k = h, w = p), c + }, m ? le(r) : r))).selector = e + } + return a + }, g = se.select = function (e, t, n, r) { + var i, o, a, s, u, l = "function" == typeof e && e, c = !r && h(e = l.selector || e); + if (n = n || [], 1 === c.length) { + if (2 < (o = c[0] = c[0].slice(0)).length && "ID" === (a = o[0]).type && 9 === t.nodeType && E && b.relative[o[1].type]) { + if (!(t = (b.find.ID(a.matches[0].replace(te, ne), t) || [])[0])) return n; + l && (t = t.parentNode), e = e.slice(o.shift().value.length) + } + i = G.needsContext.test(e) ? 0 : o.length; + while (i--) { + if (a = o[i], b.relative[s = a.type]) break; + if ((u = b.find[s]) && (r = u(a.matches[0].replace(te, ne), ee.test(o[0].type) && ye(t.parentNode) || t))) { + if (o.splice(i, 1), !(e = r.length && xe(o))) return H.apply(n, r), n; + break + } + } + } + return (l || f(e, c))(r, t, !E, n, !t || ee.test(e) && ye(t.parentNode) || t), n + }, d.sortStable = S.split("").sort(j).join("") === S, d.detectDuplicates = !!l, T(), d.sortDetached = ce(function (e) { + return 1 & e.compareDocumentPosition(C.createElement("fieldset")) + }), ce(function (e) { + return e.innerHTML = "", "#" === e.firstChild.getAttribute("href") + }) || fe("type|href|height|width", function (e, t, n) { + if (!n) return e.getAttribute(t, "type" === t.toLowerCase() ? 1 : 2) + }), d.attributes && ce(function (e) { + return e.innerHTML = "", e.firstChild.setAttribute("value", ""), "" === e.firstChild.getAttribute("value") + }) || fe("value", function (e, t, n) { + if (!n && "input" === e.nodeName.toLowerCase()) return e.defaultValue + }), ce(function (e) { + return null == e.getAttribute("disabled") + }) || fe(R, function (e, t, n) { + var r; + if (!n) return !0 === e[t] ? t.toLowerCase() : (r = e.getAttributeNode(t)) && r.specified ? r.value : null + }), se + }(C); + S.find = d, S.expr = d.selectors, S.expr[":"] = S.expr.pseudos, S.uniqueSort = S.unique = d.uniqueSort, S.text = d.getText, S.isXMLDoc = d.isXML, S.contains = d.contains, S.escapeSelector = d.escape; + var h = function (e, t, n) { + var r = [], i = void 0 !== n; + while ((e = e[t]) && 9 !== e.nodeType) if (1 === e.nodeType) { + if (i && S(e).is(n)) break; + r.push(e) + } + return r + }, T = function (e, t) { + for (var n = []; e; e = e.nextSibling) 1 === e.nodeType && e !== t && n.push(e); + return n + }, k = S.expr.match.needsContext; + + function A(e, t) { + return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() + } + + var N = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; + + function j(e, n, r) { + return m(n) ? S.grep(e, function (e, t) { + return !!n.call(e, t, e) !== r + }) : n.nodeType ? S.grep(e, function (e) { + return e === n !== r + }) : "string" != typeof n ? S.grep(e, function (e) { + return -1 < i.call(n, e) !== r + }) : S.filter(n, e, r) + } + + S.filter = function (e, t, n) { + var r = t[0]; + return n && (e = ":not(" + e + ")"), 1 === t.length && 1 === r.nodeType ? S.find.matchesSelector(r, e) ? [r] : [] : S.find.matches(e, S.grep(t, function (e) { + return 1 === e.nodeType + })) + }, S.fn.extend({ + find: function (e) { + var t, n, r = this.length, i = this; + if ("string" != typeof e) return this.pushStack(S(e).filter(function () { + for (t = 0; t < r; t++) if (S.contains(i[t], this)) return !0 + })); + for (n = this.pushStack([]), t = 0; t < r; t++) S.find(e, i[t], n); + return 1 < r ? S.uniqueSort(n) : n + }, filter: function (e) { + return this.pushStack(j(this, e || [], !1)) + }, not: function (e) { + return this.pushStack(j(this, e || [], !0)) + }, is: function (e) { + return !!j(this, "string" == typeof e && k.test(e) ? S(e) : e || [], !1).length + } + }); + var D, q = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; + (S.fn.init = function (e, t, n) { + var r, i; + if (!e) return this; + if (n = n || D, "string" == typeof e) { + if (!(r = "<" === e[0] && ">" === e[e.length - 1] && 3 <= e.length ? [null, e, null] : q.exec(e)) || !r[1] && t) return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e); + if (r[1]) { + if (t = t instanceof S ? t[0] : t, S.merge(this, S.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : E, !0)), N.test(r[1]) && S.isPlainObject(t)) for (r in t) m(this[r]) ? this[r](t[r]) : this.attr(r, t[r]); + return this + } + return (i = E.getElementById(r[2])) && (this[0] = i, this.length = 1), this + } + return e.nodeType ? (this[0] = e, this.length = 1, this) : m(e) ? void 0 !== n.ready ? n.ready(e) : e(S) : S.makeArray(e, this) + }).prototype = S.fn, D = S(E); + var L = /^(?:parents|prev(?:Until|All))/, H = {children: !0, contents: !0, next: !0, prev: !0}; + + function O(e, t) { + while ((e = e[t]) && 1 !== e.nodeType) ; + return e + } + + S.fn.extend({ + has: function (e) { + var t = S(e, this), n = t.length; + return this.filter(function () { + for (var e = 0; e < n; e++) if (S.contains(this, t[e])) return !0 + }) + }, closest: function (e, t) { + var n, r = 0, i = this.length, o = [], a = "string" != typeof e && S(e); + if (!k.test(e)) for (; r < i; r++) for (n = this[r]; n && n !== t; n = n.parentNode) if (n.nodeType < 11 && (a ? -1 < a.index(n) : 1 === n.nodeType && S.find.matchesSelector(n, e))) { + o.push(n); + break + } + return this.pushStack(1 < o.length ? S.uniqueSort(o) : o) + }, index: function (e) { + return e ? "string" == typeof e ? i.call(S(e), this[0]) : i.call(this, e.jquery ? e[0] : e) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 + }, add: function (e, t) { + return this.pushStack(S.uniqueSort(S.merge(this.get(), S(e, t)))) + }, addBack: function (e) { + return this.add(null == e ? this.prevObject : this.prevObject.filter(e)) + } + }), S.each({ + parent: function (e) { + var t = e.parentNode; + return t && 11 !== t.nodeType ? t : null + }, parents: function (e) { + return h(e, "parentNode") + }, parentsUntil: function (e, t, n) { + return h(e, "parentNode", n) + }, next: function (e) { + return O(e, "nextSibling") + }, prev: function (e) { + return O(e, "previousSibling") + }, nextAll: function (e) { + return h(e, "nextSibling") + }, prevAll: function (e) { + return h(e, "previousSibling") + }, nextUntil: function (e, t, n) { + return h(e, "nextSibling", n) + }, prevUntil: function (e, t, n) { + return h(e, "previousSibling", n) + }, siblings: function (e) { + return T((e.parentNode || {}).firstChild, e) + }, children: function (e) { + return T(e.firstChild) + }, contents: function (e) { + return null != e.contentDocument && r(e.contentDocument) ? e.contentDocument : (A(e, "template") && (e = e.content || e), S.merge([], e.childNodes)) + } + }, function (r, i) { + S.fn[r] = function (e, t) { + var n = S.map(this, i, e); + return "Until" !== r.slice(-5) && (t = e), t && "string" == typeof t && (n = S.filter(t, n)), 1 < this.length && (H[r] || S.uniqueSort(n), L.test(r) && n.reverse()), this.pushStack(n) + } + }); + var P = /[^\x20\t\r\n\f]+/g; + + function R(e) { + return e + } + + function M(e) { + throw e + } + + function I(e, t, n, r) { + var i; + try { + e && m(i = e.promise) ? i.call(e).done(t).fail(n) : e && m(i = e.then) ? i.call(e, t, n) : t.apply(void 0, [e].slice(r)) + } catch (e) { + n.apply(void 0, [e]) + } + } + + S.Callbacks = function (r) { + var e, n; + r = "string" == typeof r ? (e = r, n = {}, S.each(e.match(P) || [], function (e, t) { + n[t] = !0 + }), n) : S.extend({}, r); + var i, t, o, a, s = [], u = [], l = -1, c = function () { + for (a = a || r.once, o = i = !0; u.length; l = -1) { + t = u.shift(); + while (++l < s.length) !1 === s[l].apply(t[0], t[1]) && r.stopOnFalse && (l = s.length, t = !1) + } + r.memory || (t = !1), i = !1, a && (s = t ? [] : "") + }, f = { + add: function () { + return s && (t && !i && (l = s.length - 1, u.push(t)), function n(e) { + S.each(e, function (e, t) { + m(t) ? r.unique && f.has(t) || s.push(t) : t && t.length && "string" !== w(t) && n(t) + }) + }(arguments), t && !i && c()), this + }, remove: function () { + return S.each(arguments, function (e, t) { + var n; + while (-1 < (n = S.inArray(t, s, n))) s.splice(n, 1), n <= l && l-- + }), this + }, has: function (e) { + return e ? -1 < S.inArray(e, s) : 0 < s.length + }, empty: function () { + return s && (s = []), this + }, disable: function () { + return a = u = [], s = t = "", this + }, disabled: function () { + return !s + }, lock: function () { + return a = u = [], t || i || (s = t = ""), this + }, locked: function () { + return !!a + }, fireWith: function (e, t) { + return a || (t = [e, (t = t || []).slice ? t.slice() : t], u.push(t), i || c()), this + }, fire: function () { + return f.fireWith(this, arguments), this + }, fired: function () { + return !!o + } + }; + return f + }, S.extend({ + Deferred: function (e) { + var o = [["notify", "progress", S.Callbacks("memory"), S.Callbacks("memory"), 2], ["resolve", "done", S.Callbacks("once memory"), S.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", S.Callbacks("once memory"), S.Callbacks("once memory"), 1, "rejected"]], + i = "pending", a = { + state: function () { + return i + }, always: function () { + return s.done(arguments).fail(arguments), this + }, "catch": function (e) { + return a.then(null, e) + }, pipe: function () { + var i = arguments; + return S.Deferred(function (r) { + S.each(o, function (e, t) { + var n = m(i[t[4]]) && i[t[4]]; + s[t[1]](function () { + var e = n && n.apply(this, arguments); + e && m(e.promise) ? e.promise().progress(r.notify).done(r.resolve).fail(r.reject) : r[t[0] + "With"](this, n ? [e] : arguments) + }) + }), i = null + }).promise() + }, then: function (t, n, r) { + var u = 0; + + function l(i, o, a, s) { + return function () { + var n = this, r = arguments, e = function () { + var e, t; + if (!(i < u)) { + if ((e = a.apply(n, r)) === o.promise()) throw new TypeError("Thenable self-resolution"); + t = e && ("object" == typeof e || "function" == typeof e) && e.then, m(t) ? s ? t.call(e, l(u, o, R, s), l(u, o, M, s)) : (u++, t.call(e, l(u, o, R, s), l(u, o, M, s), l(u, o, R, o.notifyWith))) : (a !== R && (n = void 0, r = [e]), (s || o.resolveWith)(n, r)) + } + }, t = s ? e : function () { + try { + e() + } catch (e) { + S.Deferred.exceptionHook && S.Deferred.exceptionHook(e, t.stackTrace), u <= i + 1 && (a !== M && (n = void 0, r = [e]), o.rejectWith(n, r)) + } + }; + i ? t() : (S.Deferred.getStackHook && (t.stackTrace = S.Deferred.getStackHook()), C.setTimeout(t)) + } + } + + return S.Deferred(function (e) { + o[0][3].add(l(0, e, m(r) ? r : R, e.notifyWith)), o[1][3].add(l(0, e, m(t) ? t : R)), o[2][3].add(l(0, e, m(n) ? n : M)) + }).promise() + }, promise: function (e) { + return null != e ? S.extend(e, a) : a + } + }, s = {}; + return S.each(o, function (e, t) { + var n = t[2], r = t[5]; + a[t[1]] = n.add, r && n.add(function () { + i = r + }, o[3 - e][2].disable, o[3 - e][3].disable, o[0][2].lock, o[0][3].lock), n.add(t[3].fire), s[t[0]] = function () { + return s[t[0] + "With"](this === s ? void 0 : this, arguments), this + }, s[t[0] + "With"] = n.fireWith + }), a.promise(s), e && e.call(s, s), s + }, when: function (e) { + var n = arguments.length, t = n, r = Array(t), i = s.call(arguments), o = S.Deferred(), a = function (t) { + return function (e) { + r[t] = this, i[t] = 1 < arguments.length ? s.call(arguments) : e, --n || o.resolveWith(r, i) + } + }; + if (n <= 1 && (I(e, o.done(a(t)).resolve, o.reject, !n), "pending" === o.state() || m(i[t] && i[t].then))) return o.then(); + while (t--) I(i[t], a(t), o.reject); + return o.promise() + } + }); + var W = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + S.Deferred.exceptionHook = function (e, t) { + C.console && C.console.warn && e && W.test(e.name) && C.console.warn("jQuery.Deferred exception: " + e.message, e.stack, t) + }, S.readyException = function (e) { + C.setTimeout(function () { + throw e + }) + }; + var F = S.Deferred(); + + function B() { + E.removeEventListener("DOMContentLoaded", B), C.removeEventListener("load", B), S.ready() + } + + S.fn.ready = function (e) { + return F.then(e)["catch"](function (e) { + S.readyException(e) + }), this + }, S.extend({ + isReady: !1, readyWait: 1, ready: function (e) { + (!0 === e ? --S.readyWait : S.isReady) || (S.isReady = !0) !== e && 0 < --S.readyWait || F.resolveWith(E, [S]) + } + }), S.ready.then = F.then, "complete" === E.readyState || "loading" !== E.readyState && !E.documentElement.doScroll ? C.setTimeout(S.ready) : (E.addEventListener("DOMContentLoaded", B), C.addEventListener("load", B)); + var $ = function (e, t, n, r, i, o, a) { + var s = 0, u = e.length, l = null == n; + if ("object" === w(n)) for (s in i = !0, n) $(e, t, s, n[s], !0, o, a); else if (void 0 !== r && (i = !0, m(r) || (a = !0), l && (a ? (t.call(e, r), t = null) : (l = t, t = function (e, t, n) { + return l.call(S(e), n) + })), t)) for (; s < u; s++) t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n))); + return i ? e : l ? t.call(e) : u ? t(e[0], n) : o + }, _ = /^-ms-/, z = /-([a-z])/g; + + function U(e, t) { + return t.toUpperCase() + } + + function X(e) { + return e.replace(_, "ms-").replace(z, U) + } + + var V = function (e) { + return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType + }; + + function G() { + this.expando = S.expando + G.uid++ + } + + G.uid = 1, G.prototype = { + cache: function (e) { + var t = e[this.expando]; + return t || (t = {}, V(e) && (e.nodeType ? e[this.expando] = t : Object.defineProperty(e, this.expando, { + value: t, + configurable: !0 + }))), t + }, set: function (e, t, n) { + var r, i = this.cache(e); + if ("string" == typeof t) i[X(t)] = n; else for (r in t) i[X(r)] = t[r]; + return i + }, get: function (e, t) { + return void 0 === t ? this.cache(e) : e[this.expando] && e[this.expando][X(t)] + }, access: function (e, t, n) { + return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get(e, t) : (this.set(e, t, n), void 0 !== n ? n : t) + }, remove: function (e, t) { + var n, r = e[this.expando]; + if (void 0 !== r) { + if (void 0 !== t) { + n = (t = Array.isArray(t) ? t.map(X) : (t = X(t)) in r ? [t] : t.match(P) || []).length; + while (n--) delete r[t[n]] + } + (void 0 === t || S.isEmptyObject(r)) && (e.nodeType ? e[this.expando] = void 0 : delete e[this.expando]) + } + }, hasData: function (e) { + var t = e[this.expando]; + return void 0 !== t && !S.isEmptyObject(t) + } + }; + var Y = new G, Q = new G, J = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, K = /[A-Z]/g; + + function Z(e, t, n) { + var r, i; + if (void 0 === n && 1 === e.nodeType) if (r = "data-" + t.replace(K, "-$&").toLowerCase(), "string" == typeof (n = e.getAttribute(r))) { + try { + n = "true" === (i = n) || "false" !== i && ("null" === i ? null : i === +i + "" ? +i : J.test(i) ? JSON.parse(i) : i) + } catch (e) { + } + Q.set(e, t, n) + } else n = void 0; + return n + } + + S.extend({ + hasData: function (e) { + return Q.hasData(e) || Y.hasData(e) + }, data: function (e, t, n) { + return Q.access(e, t, n) + }, removeData: function (e, t) { + Q.remove(e, t) + }, _data: function (e, t, n) { + return Y.access(e, t, n) + }, _removeData: function (e, t) { + Y.remove(e, t) + } + }), S.fn.extend({ + data: function (n, e) { + var t, r, i, o = this[0], a = o && o.attributes; + if (void 0 === n) { + if (this.length && (i = Q.get(o), 1 === o.nodeType && !Y.get(o, "hasDataAttrs"))) { + t = a.length; + while (t--) a[t] && 0 === (r = a[t].name).indexOf("data-") && (r = X(r.slice(5)), Z(o, r, i[r])); + Y.set(o, "hasDataAttrs", !0) + } + return i + } + return "object" == typeof n ? this.each(function () { + Q.set(this, n) + }) : $(this, function (e) { + var t; + if (o && void 0 === e) return void 0 !== (t = Q.get(o, n)) ? t : void 0 !== (t = Z(o, n)) ? t : void 0; + this.each(function () { + Q.set(this, n, e) + }) + }, null, e, 1 < arguments.length, null, !0) + }, removeData: function (e) { + return this.each(function () { + Q.remove(this, e) + }) + } + }), S.extend({ + queue: function (e, t, n) { + var r; + if (e) return t = (t || "fx") + "queue", r = Y.get(e, t), n && (!r || Array.isArray(n) ? r = Y.access(e, t, S.makeArray(n)) : r.push(n)), r || [] + }, dequeue: function (e, t) { + t = t || "fx"; + var n = S.queue(e, t), r = n.length, i = n.shift(), o = S._queueHooks(e, t); + "inprogress" === i && (i = n.shift(), r--), i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, function () { + S.dequeue(e, t) + }, o)), !r && o && o.empty.fire() + }, _queueHooks: function (e, t) { + var n = t + "queueHooks"; + return Y.get(e, n) || Y.access(e, n, { + empty: S.Callbacks("once memory").add(function () { + Y.remove(e, [t + "queue", n]) + }) + }) + } + }), S.fn.extend({ + queue: function (t, n) { + var e = 2; + return "string" != typeof t && (n = t, t = "fx", e--), arguments.length < e ? S.queue(this[0], t) : void 0 === n ? this : this.each(function () { + var e = S.queue(this, t, n); + S._queueHooks(this, t), "fx" === t && "inprogress" !== e[0] && S.dequeue(this, t) + }) + }, dequeue: function (e) { + return this.each(function () { + S.dequeue(this, e) + }) + }, clearQueue: function (e) { + return this.queue(e || "fx", []) + }, promise: function (e, t) { + var n, r = 1, i = S.Deferred(), o = this, a = this.length, s = function () { + --r || i.resolveWith(o, [o]) + }; + "string" != typeof e && (t = e, e = void 0), e = e || "fx"; + while (a--) (n = Y.get(o[a], e + "queueHooks")) && n.empty && (r++, n.empty.add(s)); + return s(), i.promise(t) + } + }); + var ee = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, te = new RegExp("^(?:([+-])=|)(" + ee + ")([a-z%]*)$", "i"), + ne = ["Top", "Right", "Bottom", "Left"], re = E.documentElement, ie = function (e) { + return S.contains(e.ownerDocument, e) + }, oe = {composed: !0}; + re.getRootNode && (ie = function (e) { + return S.contains(e.ownerDocument, e) || e.getRootNode(oe) === e.ownerDocument + }); + var ae = function (e, t) { + return "none" === (e = t || e).style.display || "" === e.style.display && ie(e) && "none" === S.css(e, "display") + }; + + function se(e, t, n, r) { + var i, o, a = 20, s = r ? function () { + return r.cur() + } : function () { + return S.css(e, t, "") + }, u = s(), l = n && n[3] || (S.cssNumber[t] ? "" : "px"), + c = e.nodeType && (S.cssNumber[t] || "px" !== l && +u) && te.exec(S.css(e, t)); + if (c && c[3] !== l) { + u /= 2, l = l || c[3], c = +u || 1; + while (a--) S.style(e, t, c + l), (1 - o) * (1 - (o = s() / u || .5)) <= 0 && (a = 0), c /= o; + c *= 2, S.style(e, t, c + l), n = n || [] + } + return n && (c = +c || +u || 0, i = n[1] ? c + (n[1] + 1) * n[2] : +n[2], r && (r.unit = l, r.start = c, r.end = i)), i + } + + var ue = {}; + + function le(e, t) { + for (var n, r, i, o, a, s, u, l = [], c = 0, f = e.length; c < f; c++) (r = e[c]).style && (n = r.style.display, t ? ("none" === n && (l[c] = Y.get(r, "display") || null, l[c] || (r.style.display = "")), "" === r.style.display && ae(r) && (l[c] = (u = a = o = void 0, a = (i = r).ownerDocument, s = i.nodeName, (u = ue[s]) || (o = a.body.appendChild(a.createElement(s)), u = S.css(o, "display"), o.parentNode.removeChild(o), "none" === u && (u = "block"), ue[s] = u)))) : "none" !== n && (l[c] = "none", Y.set(r, "display", n))); + for (c = 0; c < f; c++) null != l[c] && (e[c].style.display = l[c]); + return e + } + + S.fn.extend({ + show: function () { + return le(this, !0) + }, hide: function () { + return le(this) + }, toggle: function (e) { + return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each(function () { + ae(this) ? S(this).show() : S(this).hide() + }) + } + }); + var ce, fe, pe = /^(?:checkbox|radio)$/i, de = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i, + he = /^$|^module$|\/(?:java|ecma)script/i; + ce = E.createDocumentFragment().appendChild(E.createElement("div")), (fe = E.createElement("input")).setAttribute("type", "radio"), fe.setAttribute("checked", "checked"), fe.setAttribute("name", "t"), ce.appendChild(fe), y.checkClone = ce.cloneNode(!0).cloneNode(!0).lastChild.checked, ce.innerHTML = "", y.noCloneChecked = !!ce.cloneNode(!0).lastChild.defaultValue, ce.innerHTML = "", y.option = !!ce.lastChild; + var ge = { + thead: [1, "", "
"], + col: [2, "", "
"], + tr: [2, "", "
"], + td: [3, "", "
"], + _default: [0, "", ""] + }; + + function ve(e, t) { + var n; + return n = "undefined" != typeof e.getElementsByTagName ? e.getElementsByTagName(t || "*") : "undefined" != typeof e.querySelectorAll ? e.querySelectorAll(t || "*") : [], void 0 === t || t && A(e, t) ? S.merge([e], n) : n + } + + function ye(e, t) { + for (var n = 0, r = e.length; n < r; n++) Y.set(e[n], "globalEval", !t || Y.get(t[n], "globalEval")) + } + + ge.tbody = ge.tfoot = ge.colgroup = ge.caption = ge.thead, ge.th = ge.td, y.option || (ge.optgroup = ge.option = [1, ""]); + var me = /<|&#?\w+;/; + + function xe(e, t, n, r, i) { + for (var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; d < h; d++) if ((o = e[d]) || 0 === o) if ("object" === w(o)) S.merge(p, o.nodeType ? [o] : o); else if (me.test(o)) { + a = a || f.appendChild(t.createElement("div")), s = (de.exec(o) || ["", ""])[1].toLowerCase(), u = ge[s] || ge._default, a.innerHTML = u[1] + S.htmlPrefilter(o) + u[2], c = u[0]; + while (c--) a = a.lastChild; + S.merge(p, a.childNodes), (a = f.firstChild).textContent = "" + } else p.push(t.createTextNode(o)); + f.textContent = "", d = 0; + while (o = p[d++]) if (r && -1 < S.inArray(o, r)) i && i.push(o); else if (l = ie(o), a = ve(f.appendChild(o), "script"), l && ye(a), n) { + c = 0; + while (o = a[c++]) he.test(o.type || "") && n.push(o) + } + return f + } + + var be = /^([^.]*)(?:\.(.+)|)/; + + function we() { + return !0 + } + + function Te() { + return !1 + } + + function Ce(e, t) { + return e === function () { + try { + return E.activeElement + } catch (e) { + } + }() == ("focus" === t) + } + + function Ee(e, t, n, r, i, o) { + var a, s; + if ("object" == typeof t) { + for (s in "string" != typeof n && (r = r || n, n = void 0), t) Ee(e, s, n, r, t[s], o); + return e + } + if (null == r && null == i ? (i = n, r = n = void 0) : null == i && ("string" == typeof n ? (i = r, r = void 0) : (i = r, r = n, n = void 0)), !1 === i) i = Te; else if (!i) return e; + return 1 === o && (a = i, (i = function (e) { + return S().off(e), a.apply(this, arguments) + }).guid = a.guid || (a.guid = S.guid++)), e.each(function () { + S.event.add(this, t, i, r, n) + }) + } + + function Se(e, i, o) { + o ? (Y.set(e, i, !1), S.event.add(e, i, { + namespace: !1, handler: function (e) { + var t, n, r = Y.get(this, i); + if (1 & e.isTrigger && this[i]) { + if (r.length) (S.event.special[i] || {}).delegateType && e.stopPropagation(); else if (r = s.call(arguments), Y.set(this, i, r), t = o(this, i), this[i](), r !== (n = Y.get(this, i)) || t ? Y.set(this, i, !1) : n = {}, r !== n) return e.stopImmediatePropagation(), e.preventDefault(), n && n.value + } else r.length && (Y.set(this, i, {value: S.event.trigger(S.extend(r[0], S.Event.prototype), r.slice(1), this)}), e.stopImmediatePropagation()) + } + })) : void 0 === Y.get(e, i) && S.event.add(e, i, we) + } + + S.event = { + global: {}, add: function (t, e, n, r, i) { + var o, a, s, u, l, c, f, p, d, h, g, v = Y.get(t); + if (V(t)) { + n.handler && (n = (o = n).handler, i = o.selector), i && S.find.matchesSelector(re, i), n.guid || (n.guid = S.guid++), (u = v.events) || (u = v.events = Object.create(null)), (a = v.handle) || (a = v.handle = function (e) { + return "undefined" != typeof S && S.event.triggered !== e.type ? S.event.dispatch.apply(t, arguments) : void 0 + }), l = (e = (e || "").match(P) || [""]).length; + while (l--) d = g = (s = be.exec(e[l]) || [])[1], h = (s[2] || "").split(".").sort(), d && (f = S.event.special[d] || {}, d = (i ? f.delegateType : f.bindType) || d, f = S.event.special[d] || {}, c = S.extend({ + type: d, + origType: g, + data: r, + handler: n, + guid: n.guid, + selector: i, + needsContext: i && S.expr.match.needsContext.test(i), + namespace: h.join(".") + }, o), (p = u[d]) || ((p = u[d] = []).delegateCount = 0, f.setup && !1 !== f.setup.call(t, r, h, a) || t.addEventListener && t.addEventListener(d, a)), f.add && (f.add.call(t, c), c.handler.guid || (c.handler.guid = n.guid)), i ? p.splice(p.delegateCount++, 0, c) : p.push(c), S.event.global[d] = !0) + } + }, remove: function (e, t, n, r, i) { + var o, a, s, u, l, c, f, p, d, h, g, v = Y.hasData(e) && Y.get(e); + if (v && (u = v.events)) { + l = (t = (t || "").match(P) || [""]).length; + while (l--) if (d = g = (s = be.exec(t[l]) || [])[1], h = (s[2] || "").split(".").sort(), d) { + f = S.event.special[d] || {}, p = u[d = (r ? f.delegateType : f.bindType) || d] || [], s = s[2] && new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), a = o = p.length; + while (o--) c = p[o], !i && g !== c.origType || n && n.guid !== c.guid || s && !s.test(c.namespace) || r && r !== c.selector && ("**" !== r || !c.selector) || (p.splice(o, 1), c.selector && p.delegateCount--, f.remove && f.remove.call(e, c)); + a && !p.length && (f.teardown && !1 !== f.teardown.call(e, h, v.handle) || S.removeEvent(e, d, v.handle), delete u[d]) + } else for (d in u) S.event.remove(e, d + t[l], n, r, !0); + S.isEmptyObject(u) && Y.remove(e, "handle events") + } + }, dispatch: function (e) { + var t, n, r, i, o, a, s = new Array(arguments.length), u = S.event.fix(e), + l = (Y.get(this, "events") || Object.create(null))[u.type] || [], c = S.event.special[u.type] || {}; + for (s[0] = u, t = 1; t < arguments.length; t++) s[t] = arguments[t]; + if (u.delegateTarget = this, !c.preDispatch || !1 !== c.preDispatch.call(this, u)) { + a = S.event.handlers.call(this, u, l), t = 0; + while ((i = a[t++]) && !u.isPropagationStopped()) { + u.currentTarget = i.elem, n = 0; + while ((o = i.handlers[n++]) && !u.isImmediatePropagationStopped()) u.rnamespace && !1 !== o.namespace && !u.rnamespace.test(o.namespace) || (u.handleObj = o, u.data = o.data, void 0 !== (r = ((S.event.special[o.origType] || {}).handle || o.handler).apply(i.elem, s)) && !1 === (u.result = r) && (u.preventDefault(), u.stopPropagation())) + } + return c.postDispatch && c.postDispatch.call(this, u), u.result + } + }, handlers: function (e, t) { + var n, r, i, o, a, s = [], u = t.delegateCount, l = e.target; + if (u && l.nodeType && !("click" === e.type && 1 <= e.button)) for (; l !== this; l = l.parentNode || this) if (1 === l.nodeType && ("click" !== e.type || !0 !== l.disabled)) { + for (o = [], a = {}, n = 0; n < u; n++) void 0 === a[i = (r = t[n]).selector + " "] && (a[i] = r.needsContext ? -1 < S(i, this).index(l) : S.find(i, this, null, [l]).length), a[i] && o.push(r); + o.length && s.push({elem: l, handlers: o}) + } + return l = this, u < t.length && s.push({elem: l, handlers: t.slice(u)}), s + }, addProp: function (t, e) { + Object.defineProperty(S.Event.prototype, t, { + enumerable: !0, configurable: !0, get: m(e) ? function () { + if (this.originalEvent) return e(this.originalEvent) + } : function () { + if (this.originalEvent) return this.originalEvent[t] + }, set: function (e) { + Object.defineProperty(this, t, {enumerable: !0, configurable: !0, writable: !0, value: e}) + } + }) + }, fix: function (e) { + return e[S.expando] ? e : new S.Event(e) + }, special: { + load: {noBubble: !0}, click: { + setup: function (e) { + var t = this || e; + return pe.test(t.type) && t.click && A(t, "input") && Se(t, "click", we), !1 + }, trigger: function (e) { + var t = this || e; + return pe.test(t.type) && t.click && A(t, "input") && Se(t, "click"), !0 + }, _default: function (e) { + var t = e.target; + return pe.test(t.type) && t.click && A(t, "input") && Y.get(t, "click") || A(t, "a") + } + }, beforeunload: { + postDispatch: function (e) { + void 0 !== e.result && e.originalEvent && (e.originalEvent.returnValue = e.result) + } + } + } + }, S.removeEvent = function (e, t, n) { + e.removeEventListener && e.removeEventListener(t, n) + }, S.Event = function (e, t) { + if (!(this instanceof S.Event)) return new S.Event(e, t); + e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || void 0 === e.defaultPrevented && !1 === e.returnValue ? we : Te, this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target, this.currentTarget = e.currentTarget, this.relatedTarget = e.relatedTarget) : this.type = e, t && S.extend(this, t), this.timeStamp = e && e.timeStamp || Date.now(), this[S.expando] = !0 + }, S.Event.prototype = { + constructor: S.Event, + isDefaultPrevented: Te, + isPropagationStopped: Te, + isImmediatePropagationStopped: Te, + isSimulated: !1, + preventDefault: function () { + var e = this.originalEvent; + this.isDefaultPrevented = we, e && !this.isSimulated && e.preventDefault() + }, + stopPropagation: function () { + var e = this.originalEvent; + this.isPropagationStopped = we, e && !this.isSimulated && e.stopPropagation() + }, + stopImmediatePropagation: function () { + var e = this.originalEvent; + this.isImmediatePropagationStopped = we, e && !this.isSimulated && e.stopImmediatePropagation(), this.stopPropagation() + } + }, S.each({ + altKey: !0, + bubbles: !0, + cancelable: !0, + changedTouches: !0, + ctrlKey: !0, + detail: !0, + eventPhase: !0, + metaKey: !0, + pageX: !0, + pageY: !0, + shiftKey: !0, + view: !0, + "char": !0, + code: !0, + charCode: !0, + key: !0, + keyCode: !0, + button: !0, + buttons: !0, + clientX: !0, + clientY: !0, + offsetX: !0, + offsetY: !0, + pointerId: !0, + pointerType: !0, + screenX: !0, + screenY: !0, + targetTouches: !0, + toElement: !0, + touches: !0, + which: !0 + }, S.event.addProp), S.each({focus: "focusin", blur: "focusout"}, function (e, t) { + S.event.special[e] = { + setup: function () { + return Se(this, e, Ce), !1 + }, trigger: function () { + return Se(this, e), !0 + }, _default: function () { + return !0 + }, delegateType: t + } + }), S.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" + }, function (e, i) { + S.event.special[e] = { + delegateType: i, bindType: i, handle: function (e) { + var t, n = e.relatedTarget, r = e.handleObj; + return n && (n === this || S.contains(this, n)) || (e.type = r.origType, t = r.handler.apply(this, arguments), e.type = i), t + } + } + }), S.fn.extend({ + on: function (e, t, n, r) { + return Ee(this, e, t, n, r) + }, one: function (e, t, n, r) { + return Ee(this, e, t, n, r, 1) + }, off: function (e, t, n) { + var r, i; + if (e && e.preventDefault && e.handleObj) return r = e.handleObj, S(e.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler), this; + if ("object" == typeof e) { + for (i in e) this.off(i, t, e[i]); + return this + } + return !1 !== t && "function" != typeof t || (n = t, t = void 0), !1 === n && (n = Te), this.each(function () { + S.event.remove(this, e, n, t) + }) + } + }); + var ke = /\s*$/g; + + function je(e, t) { + return A(e, "table") && A(11 !== t.nodeType ? t : t.firstChild, "tr") && S(e).children("tbody")[0] || e + } + + function De(e) { + return e.type = (null !== e.getAttribute("type")) + "/" + e.type, e + } + + function qe(e) { + return "true/" === (e.type || "").slice(0, 5) ? e.type = e.type.slice(5) : e.removeAttribute("type"), e + } + + function Le(e, t) { + var n, r, i, o, a, s; + if (1 === t.nodeType) { + if (Y.hasData(e) && (s = Y.get(e).events)) for (i in Y.remove(t, "handle events"), s) for (n = 0, r = s[i].length; n < r; n++) S.event.add(t, i, s[i][n]); + Q.hasData(e) && (o = Q.access(e), a = S.extend({}, o), Q.set(t, a)) + } + } + + function He(n, r, i, o) { + r = g(r); + var e, t, a, s, u, l, c = 0, f = n.length, p = f - 1, d = r[0], h = m(d); + if (h || 1 < f && "string" == typeof d && !y.checkClone && Ae.test(d)) return n.each(function (e) { + var t = n.eq(e); + h && (r[0] = d.call(this, e, t.html())), He(t, r, i, o) + }); + if (f && (t = (e = xe(r, n[0].ownerDocument, !1, n, o)).firstChild, 1 === e.childNodes.length && (e = t), t || o)) { + for (s = (a = S.map(ve(e, "script"), De)).length; c < f; c++) u = e, c !== p && (u = S.clone(u, !0, !0), s && S.merge(a, ve(u, "script"))), i.call(n[c], u, c); + if (s) for (l = a[a.length - 1].ownerDocument, S.map(a, qe), c = 0; c < s; c++) u = a[c], he.test(u.type || "") && !Y.access(u, "globalEval") && S.contains(l, u) && (u.src && "module" !== (u.type || "").toLowerCase() ? S._evalUrl && !u.noModule && S._evalUrl(u.src, {nonce: u.nonce || u.getAttribute("nonce")}, l) : b(u.textContent.replace(Ne, ""), u, l)) + } + return n + } + + function Oe(e, t, n) { + for (var r, i = t ? S.filter(t, e) : e, o = 0; null != (r = i[o]); o++) n || 1 !== r.nodeType || S.cleanData(ve(r)), r.parentNode && (n && ie(r) && ye(ve(r, "script")), r.parentNode.removeChild(r)); + return e + } + + S.extend({ + htmlPrefilter: function (e) { + return e + }, clone: function (e, t, n) { + var r, i, o, a, s, u, l, c = e.cloneNode(!0), f = ie(e); + if (!(y.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || S.isXMLDoc(e))) for (a = ve(c), r = 0, i = (o = ve(e)).length; r < i; r++) s = o[r], u = a[r], void 0, "input" === (l = u.nodeName.toLowerCase()) && pe.test(s.type) ? u.checked = s.checked : "input" !== l && "textarea" !== l || (u.defaultValue = s.defaultValue); + if (t) if (n) for (o = o || ve(e), a = a || ve(c), r = 0, i = o.length; r < i; r++) Le(o[r], a[r]); else Le(e, c); + return 0 < (a = ve(c, "script")).length && ye(a, !f && ve(e, "script")), c + }, cleanData: function (e) { + for (var t, n, r, i = S.event.special, o = 0; void 0 !== (n = e[o]); o++) if (V(n)) { + if (t = n[Y.expando]) { + if (t.events) for (r in t.events) i[r] ? S.event.remove(n, r) : S.removeEvent(n, r, t.handle); + n[Y.expando] = void 0 + } + n[Q.expando] && (n[Q.expando] = void 0) + } + } + }), S.fn.extend({ + detach: function (e) { + return Oe(this, e, !0) + }, remove: function (e) { + return Oe(this, e) + }, text: function (e) { + return $(this, function (e) { + return void 0 === e ? S.text(this) : this.empty().each(function () { + 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || (this.textContent = e) + }) + }, null, e, arguments.length) + }, append: function () { + return He(this, arguments, function (e) { + 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || je(this, e).appendChild(e) + }) + }, prepend: function () { + return He(this, arguments, function (e) { + if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { + var t = je(this, e); + t.insertBefore(e, t.firstChild) + } + }) + }, before: function () { + return He(this, arguments, function (e) { + this.parentNode && this.parentNode.insertBefore(e, this) + }) + }, after: function () { + return He(this, arguments, function (e) { + this.parentNode && this.parentNode.insertBefore(e, this.nextSibling) + }) + }, empty: function () { + for (var e, t = 0; null != (e = this[t]); t++) 1 === e.nodeType && (S.cleanData(ve(e, !1)), e.textContent = ""); + return this + }, clone: function (e, t) { + return e = null != e && e, t = null == t ? e : t, this.map(function () { + return S.clone(this, e, t) + }) + }, html: function (e) { + return $(this, function (e) { + var t = this[0] || {}, n = 0, r = this.length; + if (void 0 === e && 1 === t.nodeType) return t.innerHTML; + if ("string" == typeof e && !ke.test(e) && !ge[(de.exec(e) || ["", ""])[1].toLowerCase()]) { + e = S.htmlPrefilter(e); + try { + for (; n < r; n++) 1 === (t = this[n] || {}).nodeType && (S.cleanData(ve(t, !1)), t.innerHTML = e); + t = 0 + } catch (e) { + } + } + t && this.empty().append(e) + }, null, e, arguments.length) + }, replaceWith: function () { + var n = []; + return He(this, arguments, function (e) { + var t = this.parentNode; + S.inArray(this, n) < 0 && (S.cleanData(ve(this)), t && t.replaceChild(e, this)) + }, n) + } + }), S.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" + }, function (e, a) { + S.fn[e] = function (e) { + for (var t, n = [], r = S(e), i = r.length - 1, o = 0; o <= i; o++) t = o === i ? this : this.clone(!0), S(r[o])[a](t), u.apply(n, t.get()); + return this.pushStack(n) + } + }); + var Pe = new RegExp("^(" + ee + ")(?!px)[a-z%]+$", "i"), Re = function (e) { + var t = e.ownerDocument.defaultView; + return t && t.opener || (t = C), t.getComputedStyle(e) + }, Me = function (e, t, n) { + var r, i, o = {}; + for (i in t) o[i] = e.style[i], e.style[i] = t[i]; + for (i in r = n.call(e), t) e.style[i] = o[i]; + return r + }, Ie = new RegExp(ne.join("|"), "i"); + + function We(e, t, n) { + var r, i, o, a, s = e.style; + return (n = n || Re(e)) && ("" !== (a = n.getPropertyValue(t) || n[t]) || ie(e) || (a = S.style(e, t)), !y.pixelBoxStyles() && Pe.test(a) && Ie.test(t) && (r = s.width, i = s.minWidth, o = s.maxWidth, s.minWidth = s.maxWidth = s.width = a, a = n.width, s.width = r, s.minWidth = i, s.maxWidth = o)), void 0 !== a ? a + "" : a + } + + function Fe(e, t) { + return { + get: function () { + if (!e()) return (this.get = t).apply(this, arguments); + delete this.get + } + } + } + + !function () { + function e() { + if (l) { + u.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0", l.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%", re.appendChild(u).appendChild(l); + var e = C.getComputedStyle(l); + n = "1%" !== e.top, s = 12 === t(e.marginLeft), l.style.right = "60%", o = 36 === t(e.right), r = 36 === t(e.width), l.style.position = "absolute", i = 12 === t(l.offsetWidth / 3), re.removeChild(u), l = null + } + } + + function t(e) { + return Math.round(parseFloat(e)) + } + + var n, r, i, o, a, s, u = E.createElement("div"), l = E.createElement("div"); + l.style && (l.style.backgroundClip = "content-box", l.cloneNode(!0).style.backgroundClip = "", y.clearCloneStyle = "content-box" === l.style.backgroundClip, S.extend(y, { + boxSizingReliable: function () { + return e(), r + }, pixelBoxStyles: function () { + return e(), o + }, pixelPosition: function () { + return e(), n + }, reliableMarginLeft: function () { + return e(), s + }, scrollboxSize: function () { + return e(), i + }, reliableTrDimensions: function () { + var e, t, n, r; + return null == a && (e = E.createElement("table"), t = E.createElement("tr"), n = E.createElement("div"), e.style.cssText = "position:absolute;left:-11111px;border-collapse:separate", t.style.cssText = "border:1px solid", t.style.height = "1px", n.style.height = "9px", n.style.display = "block", re.appendChild(e).appendChild(t).appendChild(n), r = C.getComputedStyle(t), a = parseInt(r.height, 10) + parseInt(r.borderTopWidth, 10) + parseInt(r.borderBottomWidth, 10) === t.offsetHeight, re.removeChild(e)), a + } + })) + }(); + var Be = ["Webkit", "Moz", "ms"], $e = E.createElement("div").style, _e = {}; + + function ze(e) { + var t = S.cssProps[e] || _e[e]; + return t || (e in $e ? e : _e[e] = function (e) { + var t = e[0].toUpperCase() + e.slice(1), n = Be.length; + while (n--) if ((e = Be[n] + t) in $e) return e + }(e) || e) + } + + var Ue = /^(none|table(?!-c[ea]).+)/, Xe = /^--/, + Ve = {position: "absolute", visibility: "hidden", display: "block"}, + Ge = {letterSpacing: "0", fontWeight: "400"}; + + function Ye(e, t, n) { + var r = te.exec(t); + return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || "px") : t + } + + function Qe(e, t, n, r, i, o) { + var a = "width" === t ? 1 : 0, s = 0, u = 0; + if (n === (r ? "border" : "content")) return 0; + for (; a < 4; a += 2) "margin" === n && (u += S.css(e, n + ne[a], !0, i)), r ? ("content" === n && (u -= S.css(e, "padding" + ne[a], !0, i)), "margin" !== n && (u -= S.css(e, "border" + ne[a] + "Width", !0, i))) : (u += S.css(e, "padding" + ne[a], !0, i), "padding" !== n ? u += S.css(e, "border" + ne[a] + "Width", !0, i) : s += S.css(e, "border" + ne[a] + "Width", !0, i)); + return !r && 0 <= o && (u += Math.max(0, Math.ceil(e["offset" + t[0].toUpperCase() + t.slice(1)] - o - u - s - .5)) || 0), u + } + + function Je(e, t, n) { + var r = Re(e), i = (!y.boxSizingReliable() || n) && "border-box" === S.css(e, "boxSizing", !1, r), o = i, + a = We(e, t, r), s = "offset" + t[0].toUpperCase() + t.slice(1); + if (Pe.test(a)) { + if (!n) return a; + a = "auto" + } + return (!y.boxSizingReliable() && i || !y.reliableTrDimensions() && A(e, "tr") || "auto" === a || !parseFloat(a) && "inline" === S.css(e, "display", !1, r)) && e.getClientRects().length && (i = "border-box" === S.css(e, "boxSizing", !1, r), (o = s in e) && (a = e[s])), (a = parseFloat(a) || 0) + Qe(e, t, n || (i ? "border" : "content"), o, r, a) + "px" + } + + function Ke(e, t, n, r, i) { + return new Ke.prototype.init(e, t, n, r, i) + } + + S.extend({ + cssHooks: { + opacity: { + get: function (e, t) { + if (t) { + var n = We(e, "opacity"); + return "" === n ? "1" : n + } + } + } + }, + cssNumber: { + animationIterationCount: !0, + columnCount: !0, + fillOpacity: !0, + flexGrow: !0, + flexShrink: !0, + fontWeight: !0, + gridArea: !0, + gridColumn: !0, + gridColumnEnd: !0, + gridColumnStart: !0, + gridRow: !0, + gridRowEnd: !0, + gridRowStart: !0, + lineHeight: !0, + opacity: !0, + order: !0, + orphans: !0, + widows: !0, + zIndex: !0, + zoom: !0 + }, + cssProps: {}, + style: function (e, t, n, r) { + if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) { + var i, o, a, s = X(t), u = Xe.test(t), l = e.style; + if (u || (t = ze(s)), a = S.cssHooks[t] || S.cssHooks[s], void 0 === n) return a && "get" in a && void 0 !== (i = a.get(e, !1, r)) ? i : l[t]; + "string" === (o = typeof n) && (i = te.exec(n)) && i[1] && (n = se(e, t, i), o = "number"), null != n && n == n && ("number" !== o || u || (n += i && i[3] || (S.cssNumber[s] ? "" : "px")), y.clearCloneStyle || "" !== n || 0 !== t.indexOf("background") || (l[t] = "inherit"), a && "set" in a && void 0 === (n = a.set(e, n, r)) || (u ? l.setProperty(t, n) : l[t] = n)) + } + }, + css: function (e, t, n, r) { + var i, o, a, s = X(t); + return Xe.test(t) || (t = ze(s)), (a = S.cssHooks[t] || S.cssHooks[s]) && "get" in a && (i = a.get(e, !0, n)), void 0 === i && (i = We(e, t, r)), "normal" === i && t in Ge && (i = Ge[t]), "" === n || n ? (o = parseFloat(i), !0 === n || isFinite(o) ? o || 0 : i) : i + } + }), S.each(["height", "width"], function (e, u) { + S.cssHooks[u] = { + get: function (e, t, n) { + if (t) return !Ue.test(S.css(e, "display")) || e.getClientRects().length && e.getBoundingClientRect().width ? Je(e, u, n) : Me(e, Ve, function () { + return Je(e, u, n) + }) + }, set: function (e, t, n) { + var r, i = Re(e), o = !y.scrollboxSize() && "absolute" === i.position, + a = (o || n) && "border-box" === S.css(e, "boxSizing", !1, i), s = n ? Qe(e, u, n, a, i) : 0; + return a && o && (s -= Math.ceil(e["offset" + u[0].toUpperCase() + u.slice(1)] - parseFloat(i[u]) - Qe(e, u, "border", !1, i) - .5)), s && (r = te.exec(t)) && "px" !== (r[3] || "px") && (e.style[u] = t, t = S.css(e, u)), Ye(0, t, s) + } + } + }), S.cssHooks.marginLeft = Fe(y.reliableMarginLeft, function (e, t) { + if (t) return (parseFloat(We(e, "marginLeft")) || e.getBoundingClientRect().left - Me(e, {marginLeft: 0}, function () { + return e.getBoundingClientRect().left + })) + "px" + }), S.each({margin: "", padding: "", border: "Width"}, function (i, o) { + S.cssHooks[i + o] = { + expand: function (e) { + for (var t = 0, n = {}, r = "string" == typeof e ? e.split(" ") : [e]; t < 4; t++) n[i + ne[t] + o] = r[t] || r[t - 2] || r[0]; + return n + } + }, "margin" !== i && (S.cssHooks[i + o].set = Ye) + }), S.fn.extend({ + css: function (e, t) { + return $(this, function (e, t, n) { + var r, i, o = {}, a = 0; + if (Array.isArray(t)) { + for (r = Re(e), i = t.length; a < i; a++) o[t[a]] = S.css(e, t[a], !1, r); + return o + } + return void 0 !== n ? S.style(e, t, n) : S.css(e, t) + }, e, t, 1 < arguments.length) + } + }), ((S.Tween = Ke).prototype = { + constructor: Ke, init: function (e, t, n, r, i, o) { + this.elem = e, this.prop = n, this.easing = i || S.easing._default, this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || (S.cssNumber[n] ? "" : "px") + }, cur: function () { + var e = Ke.propHooks[this.prop]; + return e && e.get ? e.get(this) : Ke.propHooks._default.get(this) + }, run: function (e) { + var t, n = Ke.propHooks[this.prop]; + return this.options.duration ? this.pos = t = S.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : this.pos = t = e, this.now = (this.end - this.start) * t + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), n && n.set ? n.set(this) : Ke.propHooks._default.set(this), this + } + }).init.prototype = Ke.prototype, (Ke.propHooks = { + _default: { + get: function (e) { + var t; + return 1 !== e.elem.nodeType || null != e.elem[e.prop] && null == e.elem.style[e.prop] ? e.elem[e.prop] : (t = S.css(e.elem, e.prop, "")) && "auto" !== t ? t : 0 + }, set: function (e) { + S.fx.step[e.prop] ? S.fx.step[e.prop](e) : 1 !== e.elem.nodeType || !S.cssHooks[e.prop] && null == e.elem.style[ze(e.prop)] ? e.elem[e.prop] = e.now : S.style(e.elem, e.prop, e.now + e.unit) + } + } + }).scrollTop = Ke.propHooks.scrollLeft = { + set: function (e) { + e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now) + } + }, S.easing = { + linear: function (e) { + return e + }, swing: function (e) { + return .5 - Math.cos(e * Math.PI) / 2 + }, _default: "swing" + }, S.fx = Ke.prototype.init, S.fx.step = {}; + var Ze, et, tt, nt, rt = /^(?:toggle|show|hide)$/, it = /queueHooks$/; + + function ot() { + et && (!1 === E.hidden && C.requestAnimationFrame ? C.requestAnimationFrame(ot) : C.setTimeout(ot, S.fx.interval), S.fx.tick()) + } + + function at() { + return C.setTimeout(function () { + Ze = void 0 + }), Ze = Date.now() + } + + function st(e, t) { + var n, r = 0, i = {height: e}; + for (t = t ? 1 : 0; r < 4; r += 2 - t) i["margin" + (n = ne[r])] = i["padding" + n] = e; + return t && (i.opacity = i.width = e), i + } + + function ut(e, t, n) { + for (var r, i = (lt.tweeners[t] || []).concat(lt.tweeners["*"]), o = 0, a = i.length; o < a; o++) if (r = i[o].call(n, t, e)) return r + } + + function lt(o, e, t) { + var n, a, r = 0, i = lt.prefilters.length, s = S.Deferred().always(function () { + delete u.elem + }), u = function () { + if (a) return !1; + for (var e = Ze || at(), t = Math.max(0, l.startTime + l.duration - e), n = 1 - (t / l.duration || 0), r = 0, i = l.tweens.length; r < i; r++) l.tweens[r].run(n); + return s.notifyWith(o, [l, n, t]), n < 1 && i ? t : (i || s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l]), !1) + }, l = s.promise({ + elem: o, + props: S.extend({}, e), + opts: S.extend(!0, {specialEasing: {}, easing: S.easing._default}, t), + originalProperties: e, + originalOptions: t, + startTime: Ze || at(), + duration: t.duration, + tweens: [], + createTween: function (e, t) { + var n = S.Tween(o, l.opts, e, t, l.opts.specialEasing[e] || l.opts.easing); + return l.tweens.push(n), n + }, + stop: function (e) { + var t = 0, n = e ? l.tweens.length : 0; + if (a) return this; + for (a = !0; t < n; t++) l.tweens[t].run(1); + return e ? (s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l, e])) : s.rejectWith(o, [l, e]), this + } + }), c = l.props; + for (!function (e, t) { + var n, r, i, o, a; + for (n in e) if (i = t[r = X(n)], o = e[n], Array.isArray(o) && (i = o[1], o = e[n] = o[0]), n !== r && (e[r] = o, delete e[n]), (a = S.cssHooks[r]) && "expand" in a) for (n in o = a.expand(o), delete e[r], o) n in e || (e[n] = o[n], t[n] = i); else t[r] = i + }(c, l.opts.specialEasing); r < i; r++) if (n = lt.prefilters[r].call(l, o, c, l.opts)) return m(n.stop) && (S._queueHooks(l.elem, l.opts.queue).stop = n.stop.bind(n)), n; + return S.map(c, ut, l), m(l.opts.start) && l.opts.start.call(o, l), l.progress(l.opts.progress).done(l.opts.done, l.opts.complete).fail(l.opts.fail).always(l.opts.always), S.fx.timer(S.extend(u, { + elem: o, + anim: l, + queue: l.opts.queue + })), l + } + + S.Animation = S.extend(lt, { + tweeners: { + "*": [function (e, t) { + var n = this.createTween(e, t); + return se(n.elem, e, te.exec(t), n), n + }] + }, tweener: function (e, t) { + m(e) ? (t = e, e = ["*"]) : e = e.match(P); + for (var n, r = 0, i = e.length; r < i; r++) n = e[r], lt.tweeners[n] = lt.tweeners[n] || [], lt.tweeners[n].unshift(t) + }, prefilters: [function (e, t, n) { + var r, i, o, a, s, u, l, c, f = "width" in t || "height" in t, p = this, d = {}, h = e.style, + g = e.nodeType && ae(e), v = Y.get(e, "fxshow"); + for (r in n.queue || (null == (a = S._queueHooks(e, "fx")).unqueued && (a.unqueued = 0, s = a.empty.fire, a.empty.fire = function () { + a.unqueued || s() + }), a.unqueued++, p.always(function () { + p.always(function () { + a.unqueued--, S.queue(e, "fx").length || a.empty.fire() + }) + })), t) if (i = t[r], rt.test(i)) { + if (delete t[r], o = o || "toggle" === i, i === (g ? "hide" : "show")) { + if ("show" !== i || !v || void 0 === v[r]) continue; + g = !0 + } + d[r] = v && v[r] || S.style(e, r) + } + if ((u = !S.isEmptyObject(t)) || !S.isEmptyObject(d)) for (r in f && 1 === e.nodeType && (n.overflow = [h.overflow, h.overflowX, h.overflowY], null == (l = v && v.display) && (l = Y.get(e, "display")), "none" === (c = S.css(e, "display")) && (l ? c = l : (le([e], !0), l = e.style.display || l, c = S.css(e, "display"), le([e]))), ("inline" === c || "inline-block" === c && null != l) && "none" === S.css(e, "float") && (u || (p.done(function () { + h.display = l + }), null == l && (c = h.display, l = "none" === c ? "" : c)), h.display = "inline-block")), n.overflow && (h.overflow = "hidden", p.always(function () { + h.overflow = n.overflow[0], h.overflowX = n.overflow[1], h.overflowY = n.overflow[2] + })), u = !1, d) u || (v ? "hidden" in v && (g = v.hidden) : v = Y.access(e, "fxshow", {display: l}), o && (v.hidden = !g), g && le([e], !0), p.done(function () { + for (r in g || le([e]), Y.remove(e, "fxshow"), d) S.style(e, r, d[r]) + })), u = ut(g ? v[r] : 0, r, p), r in v || (v[r] = u.start, g && (u.end = u.start, u.start = 0)) + }], prefilter: function (e, t) { + t ? lt.prefilters.unshift(e) : lt.prefilters.push(e) + } + }), S.speed = function (e, t, n) { + var r = e && "object" == typeof e ? S.extend({}, e) : { + complete: n || !n && t || m(e) && e, + duration: e, + easing: n && t || t && !m(t) && t + }; + return S.fx.off ? r.duration = 0 : "number" != typeof r.duration && (r.duration in S.fx.speeds ? r.duration = S.fx.speeds[r.duration] : r.duration = S.fx.speeds._default), null != r.queue && !0 !== r.queue || (r.queue = "fx"), r.old = r.complete, r.complete = function () { + m(r.old) && r.old.call(this), r.queue && S.dequeue(this, r.queue) + }, r + }, S.fn.extend({ + fadeTo: function (e, t, n, r) { + return this.filter(ae).css("opacity", 0).show().end().animate({opacity: t}, e, n, r) + }, animate: function (t, e, n, r) { + var i = S.isEmptyObject(t), o = S.speed(e, n, r), a = function () { + var e = lt(this, S.extend({}, t), o); + (i || Y.get(this, "finish")) && e.stop(!0) + }; + return a.finish = a, i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a) + }, stop: function (i, e, o) { + var a = function (e) { + var t = e.stop; + delete e.stop, t(o) + }; + return "string" != typeof i && (o = e, e = i, i = void 0), e && this.queue(i || "fx", []), this.each(function () { + var e = !0, t = null != i && i + "queueHooks", n = S.timers, r = Y.get(this); + if (t) r[t] && r[t].stop && a(r[t]); else for (t in r) r[t] && r[t].stop && it.test(t) && a(r[t]); + for (t = n.length; t--;) n[t].elem !== this || null != i && n[t].queue !== i || (n[t].anim.stop(o), e = !1, n.splice(t, 1)); + !e && o || S.dequeue(this, i) + }) + }, finish: function (a) { + return !1 !== a && (a = a || "fx"), this.each(function () { + var e, t = Y.get(this), n = t[a + "queue"], r = t[a + "queueHooks"], i = S.timers, o = n ? n.length : 0; + for (t.finish = !0, S.queue(this, a, []), r && r.stop && r.stop.call(this, !0), e = i.length; e--;) i[e].elem === this && i[e].queue === a && (i[e].anim.stop(!0), i.splice(e, 1)); + for (e = 0; e < o; e++) n[e] && n[e].finish && n[e].finish.call(this); + delete t.finish + }) + } + }), S.each(["toggle", "show", "hide"], function (e, r) { + var i = S.fn[r]; + S.fn[r] = function (e, t, n) { + return null == e || "boolean" == typeof e ? i.apply(this, arguments) : this.animate(st(r, !0), e, t, n) + } + }), S.each({ + slideDown: st("show"), + slideUp: st("hide"), + slideToggle: st("toggle"), + fadeIn: {opacity: "show"}, + fadeOut: {opacity: "hide"}, + fadeToggle: {opacity: "toggle"} + }, function (e, r) { + S.fn[e] = function (e, t, n) { + return this.animate(r, e, t, n) + } + }), S.timers = [], S.fx.tick = function () { + var e, t = 0, n = S.timers; + for (Ze = Date.now(); t < n.length; t++) (e = n[t])() || n[t] !== e || n.splice(t--, 1); + n.length || S.fx.stop(), Ze = void 0 + }, S.fx.timer = function (e) { + S.timers.push(e), S.fx.start() + }, S.fx.interval = 13, S.fx.start = function () { + et || (et = !0, ot()) + }, S.fx.stop = function () { + et = null + }, S.fx.speeds = {slow: 600, fast: 200, _default: 400}, S.fn.delay = function (r, e) { + return r = S.fx && S.fx.speeds[r] || r, e = e || "fx", this.queue(e, function (e, t) { + var n = C.setTimeout(e, r); + t.stop = function () { + C.clearTimeout(n) + } + }) + }, tt = E.createElement("input"), nt = E.createElement("select").appendChild(E.createElement("option")), tt.type = "checkbox", y.checkOn = "" !== tt.value, y.optSelected = nt.selected, (tt = E.createElement("input")).value = "t", tt.type = "radio", y.radioValue = "t" === tt.value; + var ct, ft = S.expr.attrHandle; + S.fn.extend({ + attr: function (e, t) { + return $(this, S.attr, e, t, 1 < arguments.length) + }, removeAttr: function (e) { + return this.each(function () { + S.removeAttr(this, e) + }) + } + }), S.extend({ + attr: function (e, t, n) { + var r, i, o = e.nodeType; + if (3 !== o && 8 !== o && 2 !== o) return "undefined" == typeof e.getAttribute ? S.prop(e, t, n) : (1 === o && S.isXMLDoc(e) || (i = S.attrHooks[t.toLowerCase()] || (S.expr.match.bool.test(t) ? ct : void 0)), void 0 !== n ? null === n ? void S.removeAttr(e, t) : i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : (e.setAttribute(t, n + ""), n) : i && "get" in i && null !== (r = i.get(e, t)) ? r : null == (r = S.find.attr(e, t)) ? void 0 : r) + }, attrHooks: { + type: { + set: function (e, t) { + if (!y.radioValue && "radio" === t && A(e, "input")) { + var n = e.value; + return e.setAttribute("type", t), n && (e.value = n), t + } + } + } + }, removeAttr: function (e, t) { + var n, r = 0, i = t && t.match(P); + if (i && 1 === e.nodeType) while (n = i[r++]) e.removeAttribute(n) + } + }), ct = { + set: function (e, t, n) { + return !1 === t ? S.removeAttr(e, n) : e.setAttribute(n, n), n + } + }, S.each(S.expr.match.bool.source.match(/\w+/g), function (e, t) { + var a = ft[t] || S.find.attr; + ft[t] = function (e, t, n) { + var r, i, o = t.toLowerCase(); + return n || (i = ft[o], ft[o] = r, r = null != a(e, t, n) ? o : null, ft[o] = i), r + } + }); + var pt = /^(?:input|select|textarea|button)$/i, dt = /^(?:a|area)$/i; + + function ht(e) { + return (e.match(P) || []).join(" ") + } + + function gt(e) { + return e.getAttribute && e.getAttribute("class") || "" + } + + function vt(e) { + return Array.isArray(e) ? e : "string" == typeof e && e.match(P) || [] + } + + S.fn.extend({ + prop: function (e, t) { + return $(this, S.prop, e, t, 1 < arguments.length) + }, removeProp: function (e) { + return this.each(function () { + delete this[S.propFix[e] || e] + }) + } + }), S.extend({ + prop: function (e, t, n) { + var r, i, o = e.nodeType; + if (3 !== o && 8 !== o && 2 !== o) return 1 === o && S.isXMLDoc(e) || (t = S.propFix[t] || t, i = S.propHooks[t]), void 0 !== n ? i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : e[t] = n : i && "get" in i && null !== (r = i.get(e, t)) ? r : e[t] + }, propHooks: { + tabIndex: { + get: function (e) { + var t = S.find.attr(e, "tabindex"); + return t ? parseInt(t, 10) : pt.test(e.nodeName) || dt.test(e.nodeName) && e.href ? 0 : -1 + } + } + }, propFix: {"for": "htmlFor", "class": "className"} + }), y.optSelected || (S.propHooks.selected = { + get: function (e) { + var t = e.parentNode; + return t && t.parentNode && t.parentNode.selectedIndex, null + }, set: function (e) { + var t = e.parentNode; + t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex) + } + }), S.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { + S.propFix[this.toLowerCase()] = this + }), S.fn.extend({ + addClass: function (t) { + var e, n, r, i, o, a, s, u = 0; + if (m(t)) return this.each(function (e) { + S(this).addClass(t.call(this, e, gt(this))) + }); + if ((e = vt(t)).length) while (n = this[u++]) if (i = gt(n), r = 1 === n.nodeType && " " + ht(i) + " ") { + a = 0; + while (o = e[a++]) r.indexOf(" " + o + " ") < 0 && (r += o + " "); + i !== (s = ht(r)) && n.setAttribute("class", s) + } + return this + }, removeClass: function (t) { + var e, n, r, i, o, a, s, u = 0; + if (m(t)) return this.each(function (e) { + S(this).removeClass(t.call(this, e, gt(this))) + }); + if (!arguments.length) return this.attr("class", ""); + if ((e = vt(t)).length) while (n = this[u++]) if (i = gt(n), r = 1 === n.nodeType && " " + ht(i) + " ") { + a = 0; + while (o = e[a++]) while (-1 < r.indexOf(" " + o + " ")) r = r.replace(" " + o + " ", " "); + i !== (s = ht(r)) && n.setAttribute("class", s) + } + return this + }, toggleClass: function (i, t) { + var o = typeof i, a = "string" === o || Array.isArray(i); + return "boolean" == typeof t && a ? t ? this.addClass(i) : this.removeClass(i) : m(i) ? this.each(function (e) { + S(this).toggleClass(i.call(this, e, gt(this), t), t) + }) : this.each(function () { + var e, t, n, r; + if (a) { + t = 0, n = S(this), r = vt(i); + while (e = r[t++]) n.hasClass(e) ? n.removeClass(e) : n.addClass(e) + } else void 0 !== i && "boolean" !== o || ((e = gt(this)) && Y.set(this, "__className__", e), this.setAttribute && this.setAttribute("class", e || !1 === i ? "" : Y.get(this, "__className__") || "")) + }) + }, hasClass: function (e) { + var t, n, r = 0; + t = " " + e + " "; + while (n = this[r++]) if (1 === n.nodeType && -1 < (" " + ht(gt(n)) + " ").indexOf(t)) return !0; + return !1 + } + }); + var yt = /\r/g; + S.fn.extend({ + val: function (n) { + var r, e, i, t = this[0]; + return arguments.length ? (i = m(n), this.each(function (e) { + var t; + 1 === this.nodeType && (null == (t = i ? n.call(this, e, S(this).val()) : n) ? t = "" : "number" == typeof t ? t += "" : Array.isArray(t) && (t = S.map(t, function (e) { + return null == e ? "" : e + "" + })), (r = S.valHooks[this.type] || S.valHooks[this.nodeName.toLowerCase()]) && "set" in r && void 0 !== r.set(this, t, "value") || (this.value = t)) + })) : t ? (r = S.valHooks[t.type] || S.valHooks[t.nodeName.toLowerCase()]) && "get" in r && void 0 !== (e = r.get(t, "value")) ? e : "string" == typeof (e = t.value) ? e.replace(yt, "") : null == e ? "" : e : void 0 + } + }), S.extend({ + valHooks: { + option: { + get: function (e) { + var t = S.find.attr(e, "value"); + return null != t ? t : ht(S.text(e)) + } + }, select: { + get: function (e) { + var t, n, r, i = e.options, o = e.selectedIndex, a = "select-one" === e.type, s = a ? null : [], + u = a ? o + 1 : i.length; + for (r = o < 0 ? u : a ? o : 0; r < u; r++) if (((n = i[r]).selected || r === o) && !n.disabled && (!n.parentNode.disabled || !A(n.parentNode, "optgroup"))) { + if (t = S(n).val(), a) return t; + s.push(t) + } + return s + }, set: function (e, t) { + var n, r, i = e.options, o = S.makeArray(t), a = i.length; + while (a--) ((r = i[a]).selected = -1 < S.inArray(S.valHooks.option.get(r), o)) && (n = !0); + return n || (e.selectedIndex = -1), o + } + } + } + }), S.each(["radio", "checkbox"], function () { + S.valHooks[this] = { + set: function (e, t) { + if (Array.isArray(t)) return e.checked = -1 < S.inArray(S(e).val(), t) + } + }, y.checkOn || (S.valHooks[this].get = function (e) { + return null === e.getAttribute("value") ? "on" : e.value + }) + }), y.focusin = "onfocusin" in C; + var mt = /^(?:focusinfocus|focusoutblur)$/, xt = function (e) { + e.stopPropagation() + }; + S.extend(S.event, { + trigger: function (e, t, n, r) { + var i, o, a, s, u, l, c, f, p = [n || E], d = v.call(e, "type") ? e.type : e, + h = v.call(e, "namespace") ? e.namespace.split(".") : []; + if (o = f = a = n = n || E, 3 !== n.nodeType && 8 !== n.nodeType && !mt.test(d + S.event.triggered) && (-1 < d.indexOf(".") && (d = (h = d.split(".")).shift(), h.sort()), u = d.indexOf(":") < 0 && "on" + d, (e = e[S.expando] ? e : new S.Event(d, "object" == typeof e && e)).isTrigger = r ? 2 : 3, e.namespace = h.join("."), e.rnamespace = e.namespace ? new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, e.result = void 0, e.target || (e.target = n), t = null == t ? [e] : S.makeArray(t, [e]), c = S.event.special[d] || {}, r || !c.trigger || !1 !== c.trigger.apply(n, t))) { + if (!r && !c.noBubble && !x(n)) { + for (s = c.delegateType || d, mt.test(s + d) || (o = o.parentNode); o; o = o.parentNode) p.push(o), a = o; + a === (n.ownerDocument || E) && p.push(a.defaultView || a.parentWindow || C) + } + i = 0; + while ((o = p[i++]) && !e.isPropagationStopped()) f = o, e.type = 1 < i ? s : c.bindType || d, (l = (Y.get(o, "events") || Object.create(null))[e.type] && Y.get(o, "handle")) && l.apply(o, t), (l = u && o[u]) && l.apply && V(o) && (e.result = l.apply(o, t), !1 === e.result && e.preventDefault()); + return e.type = d, r || e.isDefaultPrevented() || c._default && !1 !== c._default.apply(p.pop(), t) || !V(n) || u && m(n[d]) && !x(n) && ((a = n[u]) && (n[u] = null), S.event.triggered = d, e.isPropagationStopped() && f.addEventListener(d, xt), n[d](), e.isPropagationStopped() && f.removeEventListener(d, xt), S.event.triggered = void 0, a && (n[u] = a)), e.result + } + }, simulate: function (e, t, n) { + var r = S.extend(new S.Event, n, {type: e, isSimulated: !0}); + S.event.trigger(r, null, t) + } + }), S.fn.extend({ + trigger: function (e, t) { + return this.each(function () { + S.event.trigger(e, t, this) + }) + }, triggerHandler: function (e, t) { + var n = this[0]; + if (n) return S.event.trigger(e, t, n, !0) + } + }), y.focusin || S.each({focus: "focusin", blur: "focusout"}, function (n, r) { + var i = function (e) { + S.event.simulate(r, e.target, S.event.fix(e)) + }; + S.event.special[r] = { + setup: function () { + var e = this.ownerDocument || this.document || this, t = Y.access(e, r); + t || e.addEventListener(n, i, !0), Y.access(e, r, (t || 0) + 1) + }, teardown: function () { + var e = this.ownerDocument || this.document || this, t = Y.access(e, r) - 1; + t ? Y.access(e, r, t) : (e.removeEventListener(n, i, !0), Y.remove(e, r)) + } + } + }); + var bt = C.location, wt = {guid: Date.now()}, Tt = /\?/; + S.parseXML = function (e) { + var t, n; + if (!e || "string" != typeof e) return null; + try { + t = (new C.DOMParser).parseFromString(e, "text/xml") + } catch (e) { + } + return n = t && t.getElementsByTagName("parsererror")[0], t && !n || S.error("Invalid XML: " + (n ? S.map(n.childNodes, function (e) { + return e.textContent + }).join("\n") : e)), t + }; + var Ct = /\[\]$/, Et = /\r?\n/g, St = /^(?:submit|button|image|reset|file)$/i, + kt = /^(?:input|select|textarea|keygen)/i; + + function At(n, e, r, i) { + var t; + if (Array.isArray(e)) S.each(e, function (e, t) { + r || Ct.test(n) ? i(n, t) : At(n + "[" + ("object" == typeof t && null != t ? e : "") + "]", t, r, i) + }); else if (r || "object" !== w(e)) i(n, e); else for (t in e) At(n + "[" + t + "]", e[t], r, i) + } + + S.param = function (e, t) { + var n, r = [], i = function (e, t) { + var n = m(t) ? t() : t; + r[r.length] = encodeURIComponent(e) + "=" + encodeURIComponent(null == n ? "" : n) + }; + if (null == e) return ""; + if (Array.isArray(e) || e.jquery && !S.isPlainObject(e)) S.each(e, function () { + i(this.name, this.value) + }); else for (n in e) At(n, e[n], t, i); + return r.join("&") + }, S.fn.extend({ + serialize: function () { + return S.param(this.serializeArray()) + }, serializeArray: function () { + return this.map(function () { + var e = S.prop(this, "elements"); + return e ? S.makeArray(e) : this + }).filter(function () { + var e = this.type; + return this.name && !S(this).is(":disabled") && kt.test(this.nodeName) && !St.test(e) && (this.checked || !pe.test(e)) + }).map(function (e, t) { + var n = S(this).val(); + return null == n ? null : Array.isArray(n) ? S.map(n, function (e) { + return {name: t.name, value: e.replace(Et, "\r\n")} + }) : {name: t.name, value: n.replace(Et, "\r\n")} + }).get() + } + }); + var Nt = /%20/g, jt = /#.*$/, Dt = /([?&])_=[^&]*/, qt = /^(.*?):[ \t]*([^\r\n]*)$/gm, Lt = /^(?:GET|HEAD)$/, + Ht = /^\/\//, Ot = {}, Pt = {}, Rt = "*/".concat("*"), Mt = E.createElement("a"); + + function It(o) { + return function (e, t) { + "string" != typeof e && (t = e, e = "*"); + var n, r = 0, i = e.toLowerCase().match(P) || []; + if (m(t)) while (n = i[r++]) "+" === n[0] ? (n = n.slice(1) || "*", (o[n] = o[n] || []).unshift(t)) : (o[n] = o[n] || []).push(t) + } + } + + function Wt(t, i, o, a) { + var s = {}, u = t === Pt; + + function l(e) { + var r; + return s[e] = !0, S.each(t[e] || [], function (e, t) { + var n = t(i, o, a); + return "string" != typeof n || u || s[n] ? u ? !(r = n) : void 0 : (i.dataTypes.unshift(n), l(n), !1) + }), r + } + + return l(i.dataTypes[0]) || !s["*"] && l("*") + } + + function Ft(e, t) { + var n, r, i = S.ajaxSettings.flatOptions || {}; + for (n in t) void 0 !== t[n] && ((i[n] ? e : r || (r = {}))[n] = t[n]); + return r && S.extend(!0, e, r), e + } + + Mt.href = bt.href, S.extend({ + active: 0, + lastModified: {}, + etag: {}, + ajaxSettings: { + url: bt.href, + type: "GET", + isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol), + global: !0, + processData: !0, + async: !0, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + accepts: { + "*": Rt, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + contents: {xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/}, + responseFields: {xml: "responseXML", text: "responseText", json: "responseJSON"}, + converters: {"* text": String, "text html": !0, "text json": JSON.parse, "text xml": S.parseXML}, + flatOptions: {url: !0, context: !0} + }, + ajaxSetup: function (e, t) { + return t ? Ft(Ft(e, S.ajaxSettings), t) : Ft(S.ajaxSettings, e) + }, + ajaxPrefilter: It(Ot), + ajaxTransport: It(Pt), + ajax: function (e, t) { + "object" == typeof e && (t = e, e = void 0), t = t || {}; + var c, f, p, n, d, r, h, g, i, o, v = S.ajaxSetup({}, t), y = v.context || v, + m = v.context && (y.nodeType || y.jquery) ? S(y) : S.event, x = S.Deferred(), + b = S.Callbacks("once memory"), w = v.statusCode || {}, a = {}, s = {}, u = "canceled", T = { + readyState: 0, getResponseHeader: function (e) { + var t; + if (h) { + if (!n) { + n = {}; + while (t = qt.exec(p)) n[t[1].toLowerCase() + " "] = (n[t[1].toLowerCase() + " "] || []).concat(t[2]) + } + t = n[e.toLowerCase() + " "] + } + return null == t ? null : t.join(", ") + }, getAllResponseHeaders: function () { + return h ? p : null + }, setRequestHeader: function (e, t) { + return null == h && (e = s[e.toLowerCase()] = s[e.toLowerCase()] || e, a[e] = t), this + }, overrideMimeType: function (e) { + return null == h && (v.mimeType = e), this + }, statusCode: function (e) { + var t; + if (e) if (h) T.always(e[T.status]); else for (t in e) w[t] = [w[t], e[t]]; + return this + }, abort: function (e) { + var t = e || u; + return c && c.abort(t), l(0, t), this + } + }; + if (x.promise(T), v.url = ((e || v.url || bt.href) + "").replace(Ht, bt.protocol + "//"), v.type = t.method || t.type || v.method || v.type, v.dataTypes = (v.dataType || "*").toLowerCase().match(P) || [""], null == v.crossDomain) { + r = E.createElement("a"); + try { + r.href = v.url, r.href = r.href, v.crossDomain = Mt.protocol + "//" + Mt.host != r.protocol + "//" + r.host + } catch (e) { + v.crossDomain = !0 + } + } + if (v.data && v.processData && "string" != typeof v.data && (v.data = S.param(v.data, v.traditional)), Wt(Ot, v, t, T), h) return T; + for (i in (g = S.event && v.global) && 0 == S.active++ && S.event.trigger("ajaxStart"), v.type = v.type.toUpperCase(), v.hasContent = !Lt.test(v.type), f = v.url.replace(jt, ""), v.hasContent ? v.data && v.processData && 0 === (v.contentType || "").indexOf("application/x-www-form-urlencoded") && (v.data = v.data.replace(Nt, "+")) : (o = v.url.slice(f.length), v.data && (v.processData || "string" == typeof v.data) && (f += (Tt.test(f) ? "&" : "?") + v.data, delete v.data), !1 === v.cache && (f = f.replace(Dt, "$1"), o = (Tt.test(f) ? "&" : "?") + "_=" + wt.guid++ + o), v.url = f + o), v.ifModified && (S.lastModified[f] && T.setRequestHeader("If-Modified-Since", S.lastModified[f]), S.etag[f] && T.setRequestHeader("If-None-Match", S.etag[f])), (v.data && v.hasContent && !1 !== v.contentType || t.contentType) && T.setRequestHeader("Content-Type", v.contentType), T.setRequestHeader("Accept", v.dataTypes[0] && v.accepts[v.dataTypes[0]] ? v.accepts[v.dataTypes[0]] + ("*" !== v.dataTypes[0] ? ", " + Rt + "; q=0.01" : "") : v.accepts["*"]), v.headers) T.setRequestHeader(i, v.headers[i]); + if (v.beforeSend && (!1 === v.beforeSend.call(y, T, v) || h)) return T.abort(); + if (u = "abort", b.add(v.complete), T.done(v.success), T.fail(v.error), c = Wt(Pt, v, t, T)) { + if (T.readyState = 1, g && m.trigger("ajaxSend", [T, v]), h) return T; + v.async && 0 < v.timeout && (d = C.setTimeout(function () { + T.abort("timeout") + }, v.timeout)); + try { + h = !1, c.send(a, l) + } catch (e) { + if (h) throw e; + l(-1, e) + } + } else l(-1, "No Transport"); + + function l(e, t, n, r) { + var i, o, a, s, u, l = t; + h || (h = !0, d && C.clearTimeout(d), c = void 0, p = r || "", T.readyState = 0 < e ? 4 : 0, i = 200 <= e && e < 300 || 304 === e, n && (s = function (e, t, n) { + var r, i, o, a, s = e.contents, u = e.dataTypes; + while ("*" === u[0]) u.shift(), void 0 === r && (r = e.mimeType || t.getResponseHeader("Content-Type")); + if (r) for (i in s) if (s[i] && s[i].test(r)) { + u.unshift(i); + break + } + if (u[0] in n) o = u[0]; else { + for (i in n) { + if (!u[0] || e.converters[i + " " + u[0]]) { + o = i; + break + } + a || (a = i) + } + o = o || a + } + if (o) return o !== u[0] && u.unshift(o), n[o] + }(v, T, n)), !i && -1 < S.inArray("script", v.dataTypes) && S.inArray("json", v.dataTypes) < 0 && (v.converters["text script"] = function () { + }), s = function (e, t, n, r) { + var i, o, a, s, u, l = {}, c = e.dataTypes.slice(); + if (c[1]) for (a in e.converters) l[a.toLowerCase()] = e.converters[a]; + o = c.shift(); + while (o) if (e.responseFields[o] && (n[e.responseFields[o]] = t), !u && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), u = o, o = c.shift()) if ("*" === o) o = u; else if ("*" !== u && u !== o) { + if (!(a = l[u + " " + o] || l["* " + o])) for (i in l) if ((s = i.split(" "))[1] === o && (a = l[u + " " + s[0]] || l["* " + s[0]])) { + !0 === a ? a = l[i] : !0 !== l[i] && (o = s[0], c.unshift(s[1])); + break + } + if (!0 !== a) if (a && e["throws"]) t = a(t); else try { + t = a(t) + } catch (e) { + return {state: "parsererror", error: a ? e : "No conversion from " + u + " to " + o} + } + } + return {state: "success", data: t} + }(v, s, T, i), i ? (v.ifModified && ((u = T.getResponseHeader("Last-Modified")) && (S.lastModified[f] = u), (u = T.getResponseHeader("etag")) && (S.etag[f] = u)), 204 === e || "HEAD" === v.type ? l = "nocontent" : 304 === e ? l = "notmodified" : (l = s.state, o = s.data, i = !(a = s.error))) : (a = l, !e && l || (l = "error", e < 0 && (e = 0))), T.status = e, T.statusText = (t || l) + "", i ? x.resolveWith(y, [o, l, T]) : x.rejectWith(y, [T, l, a]), T.statusCode(w), w = void 0, g && m.trigger(i ? "ajaxSuccess" : "ajaxError", [T, v, i ? o : a]), b.fireWith(y, [T, l]), g && (m.trigger("ajaxComplete", [T, v]), --S.active || S.event.trigger("ajaxStop"))) + } + + return T + }, + getJSON: function (e, t, n) { + return S.get(e, t, n, "json") + }, + getScript: function (e, t) { + return S.get(e, void 0, t, "script") + } + }), S.each(["get", "post"], function (e, i) { + S[i] = function (e, t, n, r) { + return m(t) && (r = r || n, n = t, t = void 0), S.ajax(S.extend({ + url: e, + type: i, + dataType: r, + data: t, + success: n + }, S.isPlainObject(e) && e)) + } + }), S.ajaxPrefilter(function (e) { + var t; + for (t in e.headers) "content-type" === t.toLowerCase() && (e.contentType = e.headers[t] || "") + }), S._evalUrl = function (e, t, n) { + return S.ajax({ + url: e, + type: "GET", + dataType: "script", + cache: !0, + async: !1, + global: !1, + converters: { + "text script": function () { + } + }, + dataFilter: function (e) { + S.globalEval(e, t, n) + } + }) + }, S.fn.extend({ + wrapAll: function (e) { + var t; + return this[0] && (m(e) && (e = e.call(this[0])), t = S(e, this[0].ownerDocument).eq(0).clone(!0), this[0].parentNode && t.insertBefore(this[0]), t.map(function () { + var e = this; + while (e.firstElementChild) e = e.firstElementChild; + return e + }).append(this)), this + }, wrapInner: function (n) { + return m(n) ? this.each(function (e) { + S(this).wrapInner(n.call(this, e)) + }) : this.each(function () { + var e = S(this), t = e.contents(); + t.length ? t.wrapAll(n) : e.append(n) + }) + }, wrap: function (t) { + var n = m(t); + return this.each(function (e) { + S(this).wrapAll(n ? t.call(this, e) : t) + }) + }, unwrap: function (e) { + return this.parent(e).not("body").each(function () { + S(this).replaceWith(this.childNodes) + }), this + } + }), S.expr.pseudos.hidden = function (e) { + return !S.expr.pseudos.visible(e) + }, S.expr.pseudos.visible = function (e) { + return !!(e.offsetWidth || e.offsetHeight || e.getClientRects().length) + }, S.ajaxSettings.xhr = function () { + try { + return new C.XMLHttpRequest + } catch (e) { + } + }; + var Bt = {0: 200, 1223: 204}, $t = S.ajaxSettings.xhr(); + y.cors = !!$t && "withCredentials" in $t, y.ajax = $t = !!$t, S.ajaxTransport(function (i) { + var o, a; + if (y.cors || $t && !i.crossDomain) return { + send: function (e, t) { + var n, r = i.xhr(); + if (r.open(i.type, i.url, i.async, i.username, i.password), i.xhrFields) for (n in i.xhrFields) r[n] = i.xhrFields[n]; + for (n in i.mimeType && r.overrideMimeType && r.overrideMimeType(i.mimeType), i.crossDomain || e["X-Requested-With"] || (e["X-Requested-With"] = "XMLHttpRequest"), e) r.setRequestHeader(n, e[n]); + o = function (e) { + return function () { + o && (o = a = r.onload = r.onerror = r.onabort = r.ontimeout = r.onreadystatechange = null, "abort" === e ? r.abort() : "error" === e ? "number" != typeof r.status ? t(0, "error") : t(r.status, r.statusText) : t(Bt[r.status] || r.status, r.statusText, "text" !== (r.responseType || "text") || "string" != typeof r.responseText ? {binary: r.response} : {text: r.responseText}, r.getAllResponseHeaders())) + } + }, r.onload = o(), a = r.onerror = r.ontimeout = o("error"), void 0 !== r.onabort ? r.onabort = a : r.onreadystatechange = function () { + 4 === r.readyState && C.setTimeout(function () { + o && a() + }) + }, o = o("abort"); + try { + r.send(i.hasContent && i.data || null) + } catch (e) { + if (o) throw e + } + }, abort: function () { + o && o() + } + } + }), S.ajaxPrefilter(function (e) { + e.crossDomain && (e.contents.script = !1) + }), S.ajaxSetup({ + accepts: {script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"}, + contents: {script: /\b(?:java|ecma)script\b/}, + converters: { + "text script": function (e) { + return S.globalEval(e), e + } + } + }), S.ajaxPrefilter("script", function (e) { + void 0 === e.cache && (e.cache = !1), e.crossDomain && (e.type = "GET") + }), S.ajaxTransport("script", function (n) { + var r, i; + if (n.crossDomain || n.scriptAttrs) return { + send: function (e, t) { + r = S(" + + + diff --git a/src/main/resources/templates/layout/footer.mustache b/src/main/resources/templates/layouts/footer.mustache similarity index 100% rename from src/main/resources/templates/layout/footer.mustache rename to src/main/resources/templates/layouts/footer.mustache diff --git a/src/main/resources/templates/layout/header.mustache b/src/main/resources/templates/layouts/header.mustache similarity index 100% rename from src/main/resources/templates/layout/header.mustache rename to src/main/resources/templates/layouts/header.mustache diff --git a/src/main/resources/templates/layouts/layout.html b/src/main/resources/templates/layouts/layout.html new file mode 100644 index 0000000..b7dd89b --- /dev/null +++ b/src/main/resources/templates/layouts/layout.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/product/detail.html b/src/main/resources/templates/product/detail.html new file mode 100644 index 0000000..73430a8 --- /dev/null +++ b/src/main/resources/templates/product/detail.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + 배배쉐어 + + + + + +
+ + + + + + +
+
+ +
+
+ + + +
+
+
+
+ + + +
+
+ +
+ + +
+
+
+
+
+ + + +
+
+
+ +
+ +
+ + +
+
+ 나눔 진행중 +
+
+ 나눔 완료 +
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+ + +
+
+ +
+
+
+ +
+ +
+
+ \ No newline at end of file diff --git a/src/main/resources/templates/product/register.html b/src/main/resources/templates/product/register.html new file mode 100644 index 0000000..0481424 --- /dev/null +++ b/src/main/resources/templates/product/register.html @@ -0,0 +1,179 @@ + + + + + + + + + + + + 배배쉐어 + + + + + + + + + + +
+ +
+
+ +
+
+ + +
+ + +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+
+
+
+
+
+ + diff --git a/src/main/resources/templates/user/mypage.html b/src/main/resources/templates/user/mypage.html new file mode 100644 index 0000000..921c26f --- /dev/null +++ b/src/main/resources/templates/user/mypage.html @@ -0,0 +1,379 @@ + + + + + + + + + + + + 배배쉐어 + + + + + + + +
+ +
+
+
+
+
+
+ +
+
+
+

+ 나눔한 횟수: +

+

+ 나눔받은 횟수: +

+

+ 남은나눔 받기 횟수: +

+
+
+
+ + + +
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+
+ \ No newline at end of file diff --git a/src/main/resources/templates/views/main.html b/src/main/resources/templates/views/main.html new file mode 100644 index 0000000..f88c976 --- /dev/null +++ b/src/main/resources/templates/views/main.html @@ -0,0 +1,347 @@ + + + + + + + + + + + 배배쉐어 + + + + + + + +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+ + + + + + +
+ \ No newline at end of file diff --git a/src/test/java/bebeShare/domain/like/DibsRepositoryTest.java b/src/test/java/bebeShare/domain/like/DibsRepositoryTest.java new file mode 100644 index 0000000..36b4c7c --- /dev/null +++ b/src/test/java/bebeShare/domain/like/DibsRepositoryTest.java @@ -0,0 +1,104 @@ +package bebeShare.domain.like; + +import bebeShare.domain.product.Product; +import bebeShare.domain.product.ProductRepository; +import bebeShare.domain.user.Role; +import bebeShare.domain.user.User; +import bebeShare.domain.user.UserRepository; +import bebeShare.web.dto.likeDto.SaveLikeDto; + +import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class DibsRepositoryTest { + + @Autowired + private DibsRepository dibsRepository; + + @Autowired + private ProductRepository productRepository; + + @Autowired + private UserRepository userRepository; + + private User testUser = new User(); + private Product testProduct = new Product(); + + @BeforeEach + public void setUp() { + // 1. 유저 생성 + testUser = userRepository.save(User.builder() + .name("test1") + .picture("/fake/path") + .email("test1@naver.com") + .role(Role.USER) + .build() + ); + userRepository.save(testUser); + + // 2. 상품 게시글 파라미터 생성 + testProduct = productRepository.save(Product.builder() + .user(testUser) + .productName("product0") + .productCategory("100") + .productContent("content0") + .productImage1("1") + .productImage2("2") + .productImage3("3") + .productStatus("S") + .deleteYn("N") + .build() + ); + productRepository.save(testProduct); + } + + @AfterEach + public void tearDown() { + dibsRepository.deleteAll(); + productRepository.deleteAll(); + userRepository.deleteAll(); + } + + + // 상품 게시글 좋아요 생성 + @Test + public void 좋아요등록() throws Exception { + // given + SaveLikeDto saveLikeDto = SaveLikeDto.builder().product(testProduct.getId()) + .user(testUser.getId()).build(); + + // when + dibsRepository.save(saveLikeDto.toEntity(testProduct, testUser)); + + //then + assertThat(dibsRepository.findAll().size()).isEqualTo(1); + assertThat(dibsRepository.findAll().get(0).getProduct().getId()).isEqualTo(testProduct.getId()); + assertThat(dibsRepository.findAll().get(0).getUser().getId()).isEqualTo(testUser.getId()); + } + + // 상품 게시글 좋아요 해제 + @Test + public void 좋아요해제() throws Exception { + // given + SaveLikeDto saveLikeDto = SaveLikeDto.builder().product(testProduct.getId()) + .user(testUser.getId()).build(); + dibsRepository.save(saveLikeDto.toEntity(testProduct, testUser)); + //dibsRepository.findAll().get(0); + + // when + dibsRepository.delete(dibsRepository.findAll().get(0)); + + // then + assertThat(dibsRepository.findAll().size()).isEqualTo(0); + } +} diff --git a/src/test/java/bebeShare/domain/product/ProductRepositoryTest.java b/src/test/java/bebeShare/domain/product/ProductRepositoryTest.java index fda867f..9d20f27 100644 --- a/src/test/java/bebeShare/domain/product/ProductRepositoryTest.java +++ b/src/test/java/bebeShare/domain/product/ProductRepositoryTest.java @@ -83,6 +83,31 @@ public void findAll() { @Test public void delete() { + User testUser = userRepository.save(User.builder() + .name("test1") + .picture("/fake/path") + .email("test1@naver.com") + .role(Role.USER) + .build() + ); + + // 1. 상품 게시글 파라미터 생성 + Product product = Product.builder() + .user(testUser) + .productName("product0") + .productCategory("100") + .productContent("content0") + .productImage1("1") + .productImage2("2") + .productImage3("3") + .productStatus("S") + .deleteYn("N") + .build(); + + // 2. 게시글 저장 + productRepository.save(product); + + // 1. 게시글 조회 Product entity = productRepository.findById((long) 1).get(); diff --git a/src/test/java/bebeShare/domain/user/UserRepositoryTest.java b/src/test/java/bebeShare/domain/user/UserRepositoryTest.java index 98cde3a..645872e 100644 --- a/src/test/java/bebeShare/domain/user/UserRepositoryTest.java +++ b/src/test/java/bebeShare/domain/user/UserRepositoryTest.java @@ -1,90 +1,93 @@ package bebeShare.domain.user; import bebeShare.domain.product.ProductRepository; -import bebeShare.web.dto.userDto.*; +import bebeShare.web.dto.userDto.dto.*; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class UserRepositoryTest { - - - @Autowired - UserRepository userRepository; - - @Autowired - ProductRepository productRepository; - - - @Test - public void id조회() { - Optional byId = userRepository.findById(1L); - System.out.println("user:" + byId); - assertThat(byId.get().getName()).isEqualTo("test"); - - } - - @Test - public void 나눔한내역조회() { - UserRequest userRequest = new UserRequest(); - userRequest.setMemberId(1L); - userRequest.setProductStatus("S"); - userRequest.setPage(0); - userRequest.setSize(5); - - List products = userRepository.shareInfo(userRequest); - for (ShareInfoResponseDto shareInfo : products) { - System.out.println("shareInfo:" +shareInfo.toString()); - } - } - - @Test - public void 나눔받은내역조회() { - - UserRequest userRequest = new UserRequest(); - userRequest.setMemberId(1L); - userRequest.setProductStatus("C"); - userRequest.setPage(0); - userRequest.setSize(5); - - List products = userRepository.giveInfo(userRequest); - for (GiveInfoResponseDto giveInfo : products) { - System.out.println("giveInfo:" +giveInfo.toString()); - } - } - - @Test - public void 찜목록조회() { - - UserRequest userRequest = new UserRequest(); - userRequest.setMemberId(1L); - userRequest.setPage(0); - userRequest.setSize(5); - List products = userRepository.likeInfo(userRequest); - for (LikeInfoResponseDto likeInfo : products) { - System.out.println("likeInfo:" +likeInfo.toString()); - } - } - - @Test - public void 댓글목록조회() { - UserRequest userRequest = new UserRequest(); - userRequest.setMemberId(1L); - userRequest.setPage(0); - userRequest.setSize(5); - List products = userRepository.comments(userRequest); - for (MemberCommentResponseDto comment : products) { - System.out.println("comment:" +comment.toString()); - } - } -} \ No newline at end of file +// +//@RunWith(SpringRunner.class) +//@SpringBootTest +//public class UserRepositoryTest { +// +// +// @Autowired +// UserRepository userRepository; +// +// @Autowired +// ProductRepository productRepository; +// +// private final Integer page = 0; +// +// +// @Test +// public void id조회() { +// Optional byId = userRepository.findById(1L); +// System.out.println("user:" + byId); +// assertThat(byId.get().getName()).isEqualTo("test"); +// +// } +// +// @Test +// public void 나눔한내역조회() { +// UserRequest userRequest = new UserRequest(); +// userRequest.setMemberId(1L); +// userRequest.setProductStatus("S"); +// userRequest.setPage(0); +// userRequest.setSize(5); +// +// List products = userRepository.shareInfo(userRequest); +// for (ShareInfoResponseDto shareInfo : products) { +// System.out.println("shareInfo:" +shareInfo.toString()); +// } +// } +// +// @Test +// public void 나눔받은내역조회() { +// +// UserRequest userRequest = new UserRequest(); +// userRequest.setMemberId(1L); +// userRequest.setProductStatus("C"); +// userRequest.setPage(0); +// userRequest.setSize(5); +// +// List products = userRepository.giveInfo(userRequest); +// for (GiveInfoResponseDto giveInfo : products) { +// System.out.println("giveInfo:" +giveInfo.toString()); +// } +// } +// +// @Test +// public void 찜목록조회() { +// +// UserRequest userRequest = new UserRequest(); +// userRequest.setMemberId(1L); +// userRequest.setPage(0); +// userRequest.setSize(5); +// List products = userRepository.likeInfo(userRequest); +// for (LikeInfoResponseDto likeInfo : products) { +// System.out.println("likeInfo:" +likeInfo.toString()); +// } +// } +// +// @Test +// public void 댓글목록조회() { +// UserRequest userRequest = new UserRequest(); +// userRequest.setMemberId(1L); +// userRequest.setPage(0); +// userRequest.setSize(5); +// List products = userRepository.comments(userRequest); +// for (MemberCommentResponseDto comment : products) { +// System.out.println("comment:" +comment.toString()); +// } +// } +//} \ No newline at end of file diff --git a/src/test/java/bebeShare/web/HelloConntrollerTest.java b/src/test/java/bebeShare/web/HelloConntrollerTest.java index 7bbbc8c..493882f 100644 --- a/src/test/java/bebeShare/web/HelloConntrollerTest.java +++ b/src/test/java/bebeShare/web/HelloConntrollerTest.java @@ -1,6 +1,6 @@ package bebeShare.web; -import bebeShare.config.auth.SecurityConfig; +//import bebeShare.config.auth.SecurityConfig; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -8,6 +8,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext; +import org.springframework.security.access.SecurityConfig; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.MockMvc; diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties deleted file mode 100644 index 556a202..0000000 --- a/src/test/resources/application.properties +++ /dev/null @@ -1,24 +0,0 @@ - - - -spring.datasource.driver-class-name=org.mariadb.jdbc.Driver -spring.datasource.url=jdbc:mariadb://211.105.66.96:3306/bebeShare -spring.datasource.username=bebeShare -spring.datasource.password=fW1*n[IQQM - - -#JPA Configuration - -spring.jpa.show_sql=true -spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect -spring.jpa.show-sql=false -spring.jpa.hibernate.ddl-auto=create - - -# Test OAuth -spring.security.oauth2.client.registration.google.client-id=test -spring.security.oauth2.client.registration.google.client-secret=test -spring.security.oauth2.client.registration.google.scope=profile,email - -logging.level.org.hibernate.SQL: debug - diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 0000000..ef26268 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,54 @@ + + + + +spring: + profiles: + include: oauth + + messages: + basename: messages,config,i18n.messages + encoding: UTF-8 + +logging: + level: + org: + hibernate: + SQL: DEBUG + type: debug + + + + + + + + + profiles: + activate: + on-profile: local + + # DB + datasource: + driver-class-name: org.mariadb.jdbc.Driver + url: jdbc:mariadb://211.105.66.96:3306/bebeShare + username: bebeShare + password: fW1*n[IQQM + # JPA + jpa: + show-sql: true + hibernate: + format_sql: true + ddl-auto: create + database-platform: org.hibernate.dialect.MariaDBDialect + + #REDIS + redis: + host: 127.0.0.1 + port: 6379 + session: + store-type: redis + redis: + flush-mode: on_save + +